gcd和egcd算法

欧几里德算法(gcd)又称辗转相除法,用于计算两个整数a,b的最大公约数。

基本思路:设a=qb+r,其中a,b,q,r都是整数,则gcd(a,b)=gcd(b,r),即gcd(a,b)=gcd(b,a%b)。

代码(python):

def gcd(a,b):
    if b==0:
        return a
    else:
        return gcd(b,a%b)
扩展欧几里得算法(egcd):

基本思路:对于不全为 0 的非负整数 a,b,gcd(a,b)表示 a,b 的最大公约数,必然存在整数对 x,y ,使得 gcd(a,b)=ax+by。

证明:设 a>b。
  1,显然当 b=0,gcd(a,b)=a。此时 x=1,y=0;
  2,ab!=0 时
  设 ax1+by1=gcd(a,b);
  bx2+(a mod b)y2=gcd(b,a mod b);
  根据朴素的欧几里德原理有 gcd(a,b)=gcd(b,a mod b);
  则:ax1+by1=bx2+(a mod b)y2;
  即:ax1+by1=bx2+(a-(a/b)*b)y2=ay2+bx2-(a/b)*by2;
  根据恒等定理得:x1=y2; y1=x2-(a/b)*y2;

     这样我们就得到了求解 x1,y1 的方法:x1,y1 的值基于 x2,y2
   上面的思想是以递归定义的,因为 gcd 不断的递归求解一定会有个时候 b=0,所以递归可以结束。

代码(python):

def egcd(a,b):
    if b==0:
        return 1,0
    else:
        x,y=egcd(b,a%b)
        return y,x-a/b*y
要理解代码,关键在于知道x,y递归关系的推导过程。

  • 10
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Pohlig-Hellman算法是离散对数问题的一种解法,可以应用于有限域上的离散对数问题,如椭圆曲线密码学中的离散对数问题。下面是Python实现Pohlig-Hellman算法的代码: ```python from math import gcd def egcd(a, b): if a == 0: return (b, 0, 1) else: g, y, x = egcd(b % a, a) return (g, x - (b // a) * y, y) def mod_inv(a, m): g, x, y = egcd(a, m) if g != 1: raise Exception('No modular inverse') else: return x % m def pohlig_hellman(g, h, p, q_factors): x = 0 for prime, exponent in q_factors: m = prime ** exponent t = pow(g, (p-1)//m, p) u = pow(h, (p-1)//m, p) for i in range(exponent): c = pow(t, x, p) d = pow(u * mod_inv(c, p), (p-1)//(prime**(i+1)), p) x += d * prime**i return x % (p-1) ``` 其中,`egcd(a, b)`函数是求解扩展欧几里得算法,`mod_inv(a, m)`函数是求解$a$在模$m$下的逆元,`pohlig_hellman(g, h, p, q_factors)`函数是对输入参数进行Pohlig-Hellman算法的运算。其中,$g$是生成元,$h$是目标元素,$p$是模数,$q\_factors$是一个列表,其中每个元素为形如`(prime, exponent)`的元组,表示$p-1$的分解质因数后的结果。 下面是一个使用Pohlig-Hellman算法的例子: ```python p = 28151 g = 2 h = 19132 q_factors = [(7, 3), (11, 1), (17, 1)] x = pohlig_hellman(g, h, p, q_factors) print(x) # 输出: 13579 ``` 上面的例子中,我们要求解离散对数问题$2^x \equiv 19132 \pmod{28151}$,其中$28151$是一个质数,我们对$p-1=28150$进行分解质因数得到$q\_factors=[(7, 3), (11, 1), (17, 1)]$,然后调用`pohlig_hellman`函数求解即可。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值