int main(){ int v[N] = {0,8,7,6,5,4,3,2,1,-12}; std::cout << mont(v, N); return 0; }
Abp spo(Abp a, Nat x) { if(x >= n(a)) return a; a = ech(a,x,n(a)-1); a = s(a); if(v(a,x) < v(a,imont(x))) a = mont(a,x); else if(v(a,x) > v(a,imin(a,x))) a = desc(a,x); return a; }
bool mont(int v[], int a, int b){ bool r; if (a == b) r = true; else if (v[a] >= v[a+1] && v[b-1] <= v[b]) r = false; else { if (v[a] < v[a+1]) a++; if (v[b-1] > v[b]) b--; r = mont(v, a, b); } return r; }
void test(const mpz_class& p) { std::cout << "p=0x" << std::hex << p << std::endl; Montgomery mont(p); mpz_class x1("123456789012345678"); mpz_class y1("987654321092342342"); for (int i = 0; i < 100; i++) { mpz_class z1 = (x1 * y1) % p; mpz_class x2, y2, z2; mont.toMont(x2, x1); mont.toMont(y2, y1); mont.mul(z2, x2, y2); mont.fromMont(z2, z2); if (z1 != z2) { puts("ERR"); std::cout << z1 << std::endl; std::cout << z2 << std::endl; return; } x1 = z1; } }
bool mont(int v[], int n){ return mont(v, 0, N-1); }