快速Euclidean算法

算法手册:Clegg L E, Mac Gabhann F. Molecular mechanism matters: Benefits of mechanistic computational models for drug development[J]. Pharmacological Research, 2015, 99: 149-154.

扩展欧几里得算法

给定 a , b a,b a,b,计算 ( x , y , d ) (x,y,d) (x,y,d),使满足: a x + b y = d ,   d = g c d ( a , b ) ax+by=d,\, d=gcd(a,b) ax+by=d,d=gcd(a,b)

易知:
a ⋅ 1 + b ⋅ 0 = a a ⋅ 0 + b ⋅ 1 = b \begin{aligned} a \cdot 1 + b \cdot 0 = a\\ a \cdot 0 + b \cdot 1 = b\\ \end{aligned} a1+b0=aa0+b1=b
以它为初值,令:
a ⋅ x 1 + b ⋅ y 1 = u    ⋯ ⋯ ( ∗ ) a ⋅ x 2 + b ⋅ y 2 = v    ⋯ ⋯ ( ∗ ∗ ) \begin{aligned} a \cdot x_1 + b \cdot y_1 =& u \,\,\cdots \cdots (*)\\ a \cdot x_2 + b \cdot y_2 =& v \,\,\cdots \cdots (**)\\ \end{aligned} ax1+by1=ax2+by2=u⋯⋯()v⋯⋯()
如果 u ≠ 0 u \not = 0 u=0,那么执行欧几里得算法:

  • 计算

q = ⌊ v u ⌋ q = \lfloor \frac{v}{u} \rfloor q=uv

( ∗ ) → ( ∗ ∗ ) ( ∗ ∗ ) − q ( ∗ ) → ( ∗ ) \begin{aligned} (*) \rightarrow& (**)\\ (**) - q (*) \rightarrow& (*)\\ \end{aligned} ()()q()()()

( x 2 , y 2 , v ) ← ( x 1 , y 1 , u ) ( x 1 , y 1 , u ) ← ( x 2 − q x 1 , y 2 − q y 1 , v − q u ) \begin{aligned} (x_2,y_2,v) \leftarrow& (x_1,y_1,u)\\ (x_1,y_1,u) \leftarrow& (x_2-qx_1,y_2-qy_1,v-qu)\\ \end{aligned} (x2,y2,v)(x1,y1,u)(x1,y1,u)(x2qx1,y2qy1,vqu)

注意数据依赖,实例化时要使用临时变量暂存。

直到 u = 0 u=0 u=0结束,有 a x 2 + b y 2 = v ax_2+by_2=v ax2+by2=v,得出结果 ( x = x 2 , y = y 2 , d = v ) (x=x_2,y=y_2,d=v) (x=x2,y=y2,d=v)

def exgcd(a,b):
	'xa + yb = d, (x,y,d)'

	if a>b:
		x1,y1,d1 = 1,0,a
		x2,y2,d2 = 0,1,b
	else:
		x1,y1,d1 = 0,1,b
		x2,y2,d2 = 1,0,a

	while d2 != 0:
		t = d1//d2
		x1,y1,d1 = x1-t*x2, y1-t*y2, d1-t*d2
		x1,y1,d1,x2,y2,d2 = x2,y2,d2,x1,y1,d1

	return x1,y1,d1

二进制欧几里得算法

给定 a , b a,b a,b,计算 d d d,使满足: d = g c d ( a , b ) d=gcd(a,b) d=gcd(a,b)

假设 a , b a,b a,b都是偶数,那么
gcd ⁡ ( a , b ) = 2 gcd ⁡ ( a 2 , b 2 ) \gcd(a,b) = 2\gcd(\dfrac{a}{2},\dfrac{b}{2}) gcd(a,b)=2gcd(2a,2b)
因此,计算 e = 2 k e=2^k e=2k,使得 a ′ = a e , b ′ = b e a'=\dfrac{a}{e},b'=\dfrac{b}{e} a=ea,b=eb不全为偶数

那么
gcd ⁡ ( a , b ) = e ⋅ gcd ⁡ ( a ′ , b ′ ) 2 ∤ g c d ( a ′ , b ′ ) \begin{aligned} \gcd(a,b) =& e \cdot \gcd(a',b')\\ 2 \nmid& gcd(a',b') \end{aligned} gcd(a,b)=2egcd(a,b)gcd(a,b)
我们只需计算 gcd ⁡ ( a ′ , b ′ ) \gcd(a',b') gcd(a,b)。令 u = a ′ , v = b ′ u=a',v=b' u=a,v=b

u u u是偶数且 v v v是奇数,那么
g c d ( u , v ) = g c d ( u 2 , v ) gcd(u,v) = gcd(\frac{u}{2},v) gcd(u,v)=gcd(2u,v)
u ≠ 0 u \not = 0 u=0,执行欧几里得算法:

  • u u u是偶数,那么反复执行 u ← u / 2 u \leftarrow u/2 uu/2
  • v v v是偶数,那么反复执行 v ← v / 2 v \leftarrow v/2 vv/2
  • u ≥ v u \ge v uv,令 u ← u − v u \leftarrow u-v uuv;否则 v ← v − u v \leftarrow v-u vvu

u = 0 u=0 u=0时结束,此时 v = g c d ( a ′ , b ′ ) v=gcd(a',b') v=gcd(a,b),得出结果 d = e ⋅ v d = e \cdot v d=ev

注意,反复执行除二操作,可以用一次右移代替。

二进制求逆算法

对于奇素数 p p p,给定 a ∈ Z p ∗ a \in Z_p^* aZp,计算 x = a − 1 m o d    p x = a^{-1}\mod p x=a1modp

易知:
a ⋅ 1 + p ⋅ 0 = a a ⋅ 0 + p ⋅ 1 = p \begin{aligned} a \cdot 1 + p \cdot 0 = a\\ a \cdot 0 + p \cdot 1 = p\\ \end{aligned} a1+p0=aa0+p1=p
以它为初值,令:
a ⋅ x 1 + p ⋅ y 1 = u    ⋯ ⋯ ( ∗ ) a ⋅ x 2 + p ⋅ y 2 = v    ⋯ ⋯ ( ∗ ∗ ) \begin{aligned} a \cdot x_1 + p \cdot y_1 =& u \,\,\cdots \cdots (*)\\ a \cdot x_2 + p \cdot y_2 =& v \,\,\cdots \cdots (**)\\ \end{aligned} ax1+py1=ax2+py2=u⋯⋯()v⋯⋯()
我们只计算 x 1 , x 2 x_1,x_2 x1,x2,不计算 y 1 , y 2 y_1,y_2 y1,y2 (也不容易计算)

易知, x ∈ Z p ∗ x \in Z_p^* xZp

如果 u ≠ 1 ∧ v ≠ 1 u \not = 1 \wedge v \not = 1 u=1v=1,那么执行欧几里得算法:

  • u u u是偶数,那么反复执行
    • u ← u / 2 u \leftarrow u/2 uu/2
    • x 1 x_1 x1是偶数,令 x 1 ← x 1 / 2 x_1 \leftarrow x_1/2 x1x1/2;否则 x 1 ← ( x 1 + p ) / 2 x_1 \leftarrow (x_1 + p)/2 x1(x1+p)/2
  • v v v是偶数,那么反复执行
    • v ← v / 2 v \leftarrow v/2 vv/2
    • x 2 x_2 x2是偶数,令 x 2 ← x 2 / 2 x_2 \leftarrow x_2/2 x2x2/2;否则 x 2 ← ( x 2 + p ) / 2 x_2 \leftarrow (x_2 + p)/2 x2(x2+p)/2
  • u ≥ v u \ge v uv,令 u ← u − v ,   x 1 = x 1 − x 2 u \leftarrow u-v,\, x_1 = x_1-x_2 uuv,x1=x1x2;否则 v ← v − u ,   x 2 = x 2 − x 1 v \leftarrow v-u,\, x_2 = x_2-x_1 vvu,x2=x2x1

u = 1 u=1 u=1时, a ⋅ x 1 ≡ u m o d    p a\cdot x_1 \equiv u \mod p ax1umodp,得出结果 x = x 1 x=x_1 x=x1

v = 1 v=1 v=1时, a ⋅ x 2 ≡ v m o d    p a\cdot x_2 \equiv v \mod p ax2vmodp,得出结果 x = x 2 x=x_2 x=x2

如果初值设为 x 1 = b ∈ Z p x_1=b \in Z_p x1=bZp而非 x 1 = 1 x_1=1 x1=1,那么上述算法的结果为 b a − 1 m o d    p ba^{-1} \mod p ba1modp,即:计算除法不再需要额外的乘法!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值