longlongmod_mul(longlong a, longlong b,longlong n) { longlong result = 0; while (b > 0) { if (b & 1) result = (result + a) % n; a = (a + a) % n; b = b >> 1; } return result; }
(三)、快速幂代码
1 2 3 4 5 6 7 8 9 10 11 12
longlongmod_exp(longlong a, longlong b, longlong n) { longlong result = 1; while (b > 0) { if (b & 1) result = mod_mul(result, a, n); a = mod_mul(a, a, n); b = b >> 1; } return result; }
#include<iostream> usingnamespace std; longlongmod_mul(longlong a, longlong b, longlong n)//快速乘法 { longlong result = 0; while (b > 0) { if (b & 1)//判断是否为偶数 result = (result + a) % n; a = (a + a) % n; b = b >> 1;//除二操作 } return result; } longlongmod_exp(longlong a, longlong b, longlong n)//快速幂 { longlong result = 1; while (b > 0) { if ((b & 1) > 0) result = mod_mul(result, a, n); a = mod_mul(a, a, n); b = b >> 1;//除二操作 } return result; } boolisprime(longlong n) { int k = 0; longlong p = n - 1; while ((p & 1) == 0)//判断是否为奇数 { p = p >> 1;//除二操作 k++; } for (int i = 0; i < 6; i++) { longlong a = rand() % (n - 1 - 1 + 1) + 1; longlong b = mod_exp(a, p, n); bool flag = false; if (b == 1) continue; for (int j = 0; j < k; j++) if ((b + 1) % n == 0) { flag = true; break; } else b = (b * b) % n; if (flag) continue; returnfalse; } returntrue; } intmain() { longlong N; cin >> N; if (isprime(N)) cout << N << " is prime!"; else cout << N << " is composite!"; }
import random defisprime(n): k,p=0,n-1 while (p&1)==0: p=p>>1 k+=1 for j inrange(6): a=random.randint(1,n-1) b=pow(a,p,n) flag=0 if b==1: continue for i inrange(k): if (b+1)%n==0: flag=1 break else: b=(b*b)%n if flag==1: continue else: returnFalse returnTrue n=int(input()) if isprime(n): print(n,"is prime") else: print(n,"is composite")