square root fix

This commit is contained in:
Mirek Kratochvil 2012-04-16 11:11:58 +02:00
parent eeed801a0c
commit d23fd8f898
2 changed files with 28 additions and 14 deletions

View file

@ -119,7 +119,7 @@ uint gf2m::inv (uint a)
uint gf2m::sq_root (uint a) uint gf2m::sq_root (uint a)
{ {
for (uint i = 0; i < m; ++i) for (uint i = 1; i < m; ++i)
a = mult (a, a); a = mult (a, a);
return a; return a;
} }

View file

@ -57,8 +57,9 @@ void polynomial::mod (const polynomial&f, gf2m&fld)
uint t = fld.mult (item (d), hi); uint t = fld.mult (item (d), hi);
for (int i = 0; i <= df; ++i) for (int i = 0; i <= df; ++i)
item (i + d - df) = fld.add (item (i + d - df), item (i + d - df)
fld.mult (t, f[i]) ); = fld.add (item (i + d - df),
fld.mult (t, f[i]) );
} }
strip(); strip();
} }
@ -192,23 +193,25 @@ for(int c=0;c<d;++c) {\
break; break;
} }
if (j == d) return false; if (j == d) return false;
a = fld.inv (l[i][i]); //normalize
row_mult (i, a);
//zero the col
for (j = i + 1; j < d; ++j) if (l[i][j] != 0) {
a = l[i][j]; //"minus". luckily on GF(2^m) x+x=0.
add_row_mult (i, j, a);
}
} }
a = fld.inv (l[i][i]); //normalize
row_mult (i, a);
//zero the col
for (j = i + 1; j < d; ++j)
if (l[i][j] != 0) {
a = l[i][j]; //"minus". luckily on GF(2^m) x+x=0.
add_row_mult (i, j, a);
}
} }
//jordan //jordan
for (i = d - 1; i >= 0; --i) for (i = d - 1; i >= 0; --i) {
for (j = 0; j < i; ++j) { for (j = 0; j < i; ++j) {
a = l[i][j]; a = l[i][j];
if (a == 0) continue; if (a == 0) continue;
add_row_mult (i, j, a); add_row_mult (i, j, a);
} }
}
return true; return true;
} }
@ -282,8 +285,19 @@ void polynomial::sqrt (vector<polynomial>& sqInv, gf2m&fld)
{ {
polynomial a = *this; polynomial a = *this;
clear(); clear();
for (uint i = 0; i < a.size(); ++i) add_mult (sqInv[i], a[i], fld); uint s=sqInv.size();
for (uint i = 0; i < size(); ++i) item (i) = fld.sq_root (item (i) ); resize (s, 0);
for (uint i = 0; i < s; ++i) {
for (uint j = 0; j < s; ++j) {
if (j >= a.size() ) break;
if (i >= sqInv[j].size() ) continue;
item (i) = fld.add (item (i), fld.mult (sqInv[j][i], a[j]) );
}
}
strip();
for (uint i = 0; i < size(); ++i)
item (i) = fld.sq_root (item (i) );
} }
void polynomial::div (polynomial&p, polynomial&m, gf2m&fld) void polynomial::div (polynomial&p, polynomial&m, gf2m&fld)