gpt4 book ai didi

GF(2)有限域中的Python乘法逆

转载 作者:太空狗 更新时间:2023-10-30 00:11:25 24 4
gpt4 key购买 nike

这 2 个函数执行扩展欧几里德算法,然后求乘法逆。订单似乎是正确的,但根据悉尼大学的工具,它并没有像我期望的那样返回 http://magma.maths.usyd.edu.au/calc/由于这是在 GF(2) 有限域中完成的,我认为我遗漏了一些从基数 10 转换到该域的关键步骤。

这已在基数 10 上进行了测试和工作,但此处可能无法采用具有二进制系数的多项式。所以我的问题是我错误地将 Python 的哪些部分应用于此算法,例如//floor,它可能无法从函数以 10 为基数的功能中携带,以便能够在 GF(2) 中执行此操作。

上面的工具可以这样测试:

R<x>:=PolynomialRing(GF(2));
p:=x^13+x+1; q:=x^12+x;
g,r,s:=XGCD(p,q);

g eq r*p+s*q;

g,r,s;

功能:

def extendedEuclideanGF2(self,a,b): # extended euclidean. a,b are values 10110011... in integer form
inita,initb=a,b; x,prevx=0,1; y,prevy = 1,0
while b != 0:
q = int("{0:b}".format(a//b),2)
a,b = b,int("{0:b}".format(a%b),2);
x,prevx = (int("{0:b}".format(prevx-q*x)), int("{0:b}".format(x,2))); y,prevy=(prevy-q*y, y)
print("Euclidean %d * %d + %d * %d = %d" % (inita,prevx,initb,prevy,a))
return a,prevx,prevy # returns gcd of (a,b), and factors s and t

def modular_inverse(self,a,mod): # a,mod are integer values of 101010111... form
a,mod = prepBinary(a,mod)
bitsa = int("{0:b}".format(a),2); bitsb = int("{0:b}".format(mod),2)
#return bitsa,bitsb,type(bitsa),type(bitsb),a,mod,type(a),type(mod)
gcd,s,t = extendedEuclideanGF2(a,mod); s = int("{0:b}".format(s))
initmi = s%mod; mi = int("{0:b}".format(initmi))
print ("M Inverse %d * %d mod %d = 1"%(a,initmi,mod))
if gcd !=1: return mi,False
return mi # returns modular inverse of a,mod

我一直在用这样的多项式进行测试,但当然是二进制形式:

p = "x**13 + x**1 + x**0" 
q = "x**12 + x**1"

最佳答案

该函数在使用 base-10 进行测试时有效,因为您所有的转换 int("{0:b}".format(x)) 对 x 没有影响:

37 == int("{0:b}".format(37), 2)  # >>> True

python 中的数字对象都是以 10 为底的。将您的数字转换为二进制字符串,然后再转换回整数没有任何效果。这是你的函数的替代版本,它应该在 ab 上作为 base-10 整数工作,并以二进制形式返回它们。您可以删除 bin() 函数以返回 base-10 中的数字,或使用类似 lambda x: int("%d".format(x)) 的函数在函数的第一行将 ab 从二进制转换为十进制。

def extendedEuclideanGF2(a, b): # extended euclidean. a,b are values 10110011... in         integer form
inita, initb = a, b # if a and b are given as base-10 ints
x, prevx = 0, 1
y, prevy = 1, 0
while b != 0:
q = a//b
a, b = b, a%b
x, prevx = prevx - q*x, x
y, prevy = prevy - q*y, y
print("Euclidean %d * %d + %d * %d = %d" % (inita, prevx, initb, prevy, a))
i2b = lambda n: int("{0:b}".format(n)) # convert decimal number to a binary value in a decimal number
return i2b(a), i2b(prevx), i2b(prevy) # returns gcd of (a,b), and factors s and t

综上所述,不要在这样的函数中使用 lambda - 我建议您编写程序时完全避免使用二进制,您只需在程序的接口(interface)处将二进制与源代码进行转换即可数据。

关于GF(2)有限域中的Python乘法逆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17383236/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com