CINTA作业3

这篇博客介绍了如何利用模指数运算和欧拉定理来求解乘法逆元。通过实例展示了计算32019mod23和2100000mod55的过程,以及手动确定71000的最后两位数的方法,揭示了模运算中的一些规律和技巧。
摘要由CSDN通过智能技术生成
  • 求解乘法逆元
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+9122,所以 3 2019 = 3 17 + 91 ∗ ( 23 − 1 ) 3^{2019}=3^{17+91*(23-1)} 32019=317+91(231),又因为 3 23 − 1 m o d 23 = 1 3^{23-1}mod23=1 3231mod23=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=3316mod23=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=250040,由欧拉定理有 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=2402500mod55=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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值