mirror of
https://github.com/aicodix/code.git
synced 2026-04-27 14:30:36 +00:00
compute inverse using Fermat's little theorem
This commit is contained in:
parent
fbbc655589
commit
f5cd82db8c
1 changed files with 14 additions and 0 deletions
|
|
@ -109,10 +109,23 @@ PrimeField<TYPE, PRIME> operator * (PrimeField<TYPE, PRIME> a, PrimeField<TYPE,
|
|||
return reduce(mul(a, b));
|
||||
}
|
||||
|
||||
template <typename TYPE, TYPE PRIME>
|
||||
PrimeField<TYPE, PRIME> pow(PrimeField<TYPE, PRIME> a, TYPE m)
|
||||
{
|
||||
PrimeField<TYPE, PRIME> t(1);
|
||||
for (;m; m >>= 1, a *= a)
|
||||
if (m & 1)
|
||||
t *= a;
|
||||
return t;
|
||||
}
|
||||
|
||||
template <typename TYPE, TYPE PRIME>
|
||||
PrimeField<TYPE, PRIME> rcp(PrimeField<TYPE, PRIME> a)
|
||||
{
|
||||
assert(a.v);
|
||||
#if 1
|
||||
return pow(a, a.P - 2);
|
||||
#else
|
||||
if (a.v == 1)
|
||||
return a;
|
||||
TYPE t = 0, newt = 1;
|
||||
|
|
@ -128,6 +141,7 @@ PrimeField<TYPE, PRIME> rcp(PrimeField<TYPE, PRIME> a)
|
|||
if (t >= a.P)
|
||||
t += a.P;
|
||||
return PrimeField<TYPE, PRIME>(t);
|
||||
#endif
|
||||
}
|
||||
|
||||
template <typename TYPE, TYPE PRIME>
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue