求模逆

代码一

# -*- coding: utf-8 -*-
'''
理论基础:
(a*x)%c==1  x为a对c的模逆元
x有解的充要条件是gcd(a,c)=1
测试目标:
求模逆
拓展欧几里得算法求模逆:
用类似辗转相除法,求二元一次不定方程 47x+30y=1  47x+30y=1的整数解。
47 = 30 * 1 + 17
30 = 17 * 1 + 13
17 = 13 * 1 + 4
13 = 4 * 3 + 1  先用欧几里得算法
4=1*3+1
然后把它们改写成“余数等于”的形式
17 = 47 * 1 + 30 * (-1) //式1
13 = 30 * 1 + 17 * (-1) //式2
4 = 17 * 1 + 13 * (-1) //式3
1 = 13 * 1 + 4 * (-3) ak
然后把它们“倒回去”
1 = 13 * 1 + 4 * (-3)
1 = 13 * 1 + [17 * 1 + 13 * (-1)] * (-3) //应用式3
1 = 17 * (-3) + 13 * 4
1 = 17 * (-3) + [30 * 1 + 17 * (-1)] * 4 //应用式2
1 = 30 * 4 + 17 * (-7)
1 = 30 * 4 + [47 * 1 + 30 * (-1)] * (-7) //应用式1
1 = 47 * (-7) + 30 * 11
得解x=-7, y=11。
47的逆元为-7
'''
def ext_euclid ( a , b ):
 if (b == 0):
     return 1, 0, a
 else:
     x , y , q = ext_euclid( b , a % b )
     x , y = y, ( x - (a // b) * y )
     return x, y, q
x,y,q=ext_euclid(47,30) 
print x   

代码二

#coding=utf-8
x=[1,0]
y=[0,1]  
def gcd_x_y(a,b):
    if(a<b):
        a,b=b,a  
    i,na,nb=2,a,b
    while (a%b):
        r,q=a%b,int(a/b)
        x.append((x[i-2]-q*x[i-1]))
        y.append((y[i-2]-q*y[i-1]))
        a,b,i=b,r,i+1
    print "%d"%(x[i-1])
gcd_x_y(47,30)
posted @ 2020-12-12 15:17  zer0_1s  阅读(372)  评论(0编辑  收藏  举报