Algorithm
a ≡ a%m
a 在除了除法以外 a%m 做其他運算的結果≡ a15^8001 X 22^4781 X 11^3 除以7的餘數為多少
15 ≡ 1 (mod 7)
22 ≡ 1 (mod 7)
11 ≡ 4 (mod 7)
1.根據上面餘的相乘性質的次方公式
15^8001 ≡ 1^8001 (mod 7)
22^4781 ≡ 1^4781 (mod 7)
11^3 ≡ 4^3 (mod 7)
2.然後上面三條可以相乘 (根據上面同餘的相乘性質)
15^8001 X 22^4781 X 11^11 ≡ 1^8001 X 1^4781 X 4^3 (mod 7)
15^8001 X 22^4781 X 11^11 ≡ 64 (mod 7)
然後因為 64 ≡ 1 (mod 7)
15^8001 X 22^4781 X 11^3 ≡ 1 (mod 7)
所以餘1
4793316+7890323 除以7 會餘多少?
假設我們知道下面
4793316 ≡ 3 (mod 7)
7890323 ≡ 0 (mod 7)
那根據同餘的加法性質,可以得出
4793316+7890323 ≡ 3(mod 7)
(a^n) %m
我們可以改寫為(a^n)%m= ((a%m)^n)%m,即循環n次。
當 a<m(a=a%m)
a^n≡(((((((a)*a)%m)*a)%m)*a)%m
缺點:低效,循環了n次。
int exp_mod(int a,int n,int m){
a = a%m;
int temp = 1;
while(n>0)
{
temp = (temp * a)%m;
n--;
}
return temp;
}
int qpow( int a, int n, int m)
{
int res = 1;
while (n>0)
{
if (n&1) res = (res*a)%m;
a = (a*a)%m;
n>>=1;
}
return res;
}
int bmod( string s, int m)
{
int res=0;
for (int i=0,len=s.size(); i<len; i++)
{
res=(res*10)%m;
res = (res+(s[i]-'0'))%m;
}
return res%m;
}
a/b 沒辦法變成 (a%m)/(b%m)
但可以將除法轉換成乘反元素,以簡化計算
a^(m-1) ≡ 1 (mod m)
a^(m-2) ≡ 1/a (mod m)
逆元為 a^(m-2)。(都要求a和m互質)
例 2^100 mod 13
2^12≡1 (mod 13)
(2^12)^8 ≡ 1^8 (mod 13)
(2^12)^8*2^4 ≡ 2^4 (mod 13)
2^100 ≡ 16 (mod 13)
2^100 ≡ 3 (mod 13)
a * x ≡ 1 (mod n)
若gcd(a,n) = 1
→ a*x + n*y = 1+0 = gcd(a,n) = 1 (mod n)
→ 可以用extgcd()算
→ 已知 a,n 求 x,y
int exgcd(int a, int b, int &x, int &y) {
if(b == 0) {
x = 1; // 设置b=0时的特殊解
y = 0;
return a;
}
int ans = exgcd(b, a % b, x, y);
int t = x; // 将x2, y2换算成x1, y1
x = y;
y = t - a / b * y;
return ans;
}
int invele(int a, int m) {
int x, y;
exgcd(a, m, x, y);
if(m < 0) m = -m;
int ans = x % m;
if(ans <= 0) ans += m;
return ans;
}
https://ithelp.ithome.com.tw/articles/10205727
https://ithelp.ithome.com.tw/articles/10205906?sc=iThelpR
https://blog.csdn.net/acvay/article/details/47397977