求模逆
代码一
# -*- 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)
zer0_1s