diff --git a/prime_field.hh b/prime_field.hh index 88996bd..a70816b 100644 --- a/prime_field.hh +++ b/prime_field.hh @@ -109,10 +109,23 @@ PrimeField operator * (PrimeField a, PrimeField +PrimeField pow(PrimeField a, TYPE m) +{ + PrimeField t(1); + for (;m; m >>= 1, a *= a) + if (m & 1) + t *= a; + return t; +} + template PrimeField rcp(PrimeField 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 rcp(PrimeField a) if (t >= a.P) t += a.P; return PrimeField(t); +#endif } template