compute inverse using Fermat's little theorem

This commit is contained in:
Ahmet Inan 2024-03-24 09:52:39 +01:00
commit f5cd82db8c

View file

@ -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>