逆元的四种求法
作者:
Lemmon_kk
,
2021-01-25 11:03:08
,
所有人可见
,
阅读 661
#include <iostream>
using namespace std;
const int N = 10010;
int inv[N];
int a, p;
int qmi(int a, int b){
int res = 1;
int t = a;
while(b){
if(b & 1) (res *= t) %= p;
t = t * t % p;
b >>= 1;
}
return res % p;
}
void get(){
inv[1] = 1;
for(int i = 2;i <= a;i ++ )
inv[a] = (((inv[p % i] * - (p / a)) % p) + p) % p;
for(int i = 1;i <= a;i ++ )
printf("%d%c", inv[i], " \n"[i == a]);
}
int gcd(int a, int b){
if(!b) return a;
return gcd(b, a % b);
}
int exgcd(int a, int b, int &x, int &y){
if(!b){
x = 1, y = 0;
return a;
}
int t = exgcd(b, a % b, y, x);
y -= a / b * x;
return t;
}
int phi(int x){
int res = x;
for(int i = 2;i <= x / i;i ++ ){
if(x % i == 0){
int sum = 0;
while(x % i == 0) sum ++ , x /= i;
res = res * (i - 1) / i;
}
}
if(x > 1) res = res / x * (x - 1);
return res;
}
int main(){
cin >> a >> p;
// 费马小定理
cout << qmi(a, p - 2) << endl;
// 线性递推
get();
// 拓展欧几里得算法
int x, y; exgcd(a, p, x, y);
cout << (x % p + p) % p << endl;
// cout << gcd(4, 12) << endl;
// 欧拉定理
// get_phi();
cout << qmi(a, phi(p) - 1) << endl;
return 0;
}
%%%