- 求解乘法逆元
def egcd(a, b, f1, f2):
while b != 0:
f1, f2= f2, f1 - a // b * f2
a, b = b, a%b
return f1, a
def get_mutiply_reverse(a, b):
r1, gcf = egcd(n1, n2, 1, 0)
if gcf != 1:
return -1
else:
return r1 % b
n1, n2 = map(int, input().split(" "))
reverse = get_mutiply_reverse(n1, n2)
if reverse != -1:
print("{}在{}下的逆元为{}".format(n1, n2, reverse))
else:
print("{}在{}条件下不存在逆元".format(n1, n2))
- 模指数运算,这个题好像书里有代码了,这
def rec_mod_exp(x, y, p):
if y == 0:
return 1
z = rec_mod_exp(x, y // 2, p)
if (y & 1) == 0: # y is an even number
return z * z % p
else: # y is an odd number
return x * z * z % p
a = eval(input())
b = eval(input())
m = eval(input())
print(rec_mod_exp(a, b, m))
- 利用费马小定理计算
def get_mod(a, m, p):
i = 0
while True:
r = (m - i) % (p - 1)
if r == 0:
result = a ** i
result = result % p
return result
else:
i = i + 1
base = eval(input())
exponent = eval(input())
mod_number = eval(input())
print(get_mod(base, exponent, mod_number))
计算 3 2019 m o d 23 3^{2019}mod23 32019mod23,因为 2019 = 17 + 91 ∗ 22 2019=17+91*22 2019=17+91∗22,所以 3 2019 = 3 17 + 91 ∗ ( 23 − 1 ) 3^{2019}=3^{17+91*(23-1)} 32019=317+91∗(23−1),又因为 3 23 − 1 m o d 23 = 1 3^{23-1}mod23=1 323−1mod23=1,所以 3 2019 m o d 23 = 3 17 m o d 23 = 3 ∗ 3 16 m o d 23 = 16 3^{2019}mod23=3^{17}mod23=3*3^{16}mod23=16 32019mod23=317mod23=3∗316mod23=16
-
利用欧拉定理计算
def gcd(a, b): while b != 0: tmp = a % b a = b b = tmp return a def get_mod(a, m, x, p): i = 0 while True: r = (m - i) % x if r == 0: result = a ** i result = result % p return result else: i = i + 1 def get_phi(n): r = 0 for i in range(1, n): if gcd(i, n) == 1: r = r + 1 return r print(get_mod(2, 100000, get_phi(55), 55))
求解 2 100000 m o d 55 2^{100000}mod55 2100000mod55,因为 ψ ( 55 ) = 40 \psi(55)=40 ψ(55)=40,且 100000 = 2500 ∗ 40 100000=2500*40 100000=2500∗40,由欧拉定理有 2 ψ ( 55 ) ≡ 1 ( m o d 55 ) 2^{\psi(55)}\equiv1(mod55) 2ψ(55)≡1(mod55),所以 2 100000 m o d 55 = 2 40 ∗ 2500 m o d 55 = 1 2^{100000}mod55=2^{40*2500}mod55=1 2100000mod55=240∗2500mod55=1
-
手动计算 7 1000 7^{1000} 71000最后两位数
因为 7 1 = 7 , 7 2 = 49 , 7 3 = . . . 43 , 7 4 = . . . 01 , 7 5 = . . . 07 7^1=7,7^2=49,7^3=...43,7^4=...01,7^5=...07 71=7,72=49,73=...43,74=...01,75=...07,可以看出如果只看后两位,它们的出现是有规律的,一个循环是 07 , 49 , 43 , 01 07,49,43,01 07,49,43,01,因为 1000 m o d 4 = = 0 1000mod4==0 1000mod4==0,所以 7 1000 7^{1000} 71000的最后两位数是 01 01 01。