Python-多项式除法GF(2)字段
我试图在GF(2)域中划分多项式。 看起来整个除法过程都进行得很顺利,我一直坚持的问题是,除法过程一直顺利地进行到应该停止的地方。XOR表示减法,如果你检查变量b,它应该在某个点上保持正确的余数值,但它只是继续Python-多项式除法GF(2)字段,python,python-2.7,field,division,polynomial-math,Python,Python 2.7,Field,Division,Polynomial Math,我试图在GF(2)域中划分多项式。 看起来整个除法过程都进行得很顺利,我一直坚持的问题是,除法过程一直顺利地进行到应该停止的地方。XOR表示减法,如果你检查变量b,它应该在某个点上保持正确的余数值,但它只是继续 class binary1polynomials: #binary arithemtic on polynomials def __init__(self,expr): self.expr = expr def degree(self):
class binary1polynomials:
#binary arithemtic on polynomials
def __init__(self,expr):
self.expr = expr
def degree(self):
return len(self.expr)
def id(self):
return [self.expr[i]%2 for i in range(len(self.expr))]
def listToInt(self):
#return int(reduce(lambda x,y: x+str(y), self.expr, ''))
result = binary1polynomials.id(self)
return int(''.join(map(str,result)))
def divide(a,b): #a,b are lists like (1,0,1,0,0,1,....)
a = binary1polynomials.listToInt(a); b = binary1polynomials.listToInt(b)
print "a,b,type(a) ",a,b,type(a)
bina = int(str(a),2); binb = int(str(b),2)
a = min(bina,binb); b = max(bina,binb);
print "a,b ",a,b
g = []; bitsa = "{0:b}".format(a); bitsb = "{0:b}".format(b)
difflen = len(str(bitsb)) - len(str(bitsa))
print "difflen,bitsa,bitsb,type(bitsa) ",difflen,bitsa,bitsb,type(bitsa)
print "a,b ",a,b
c = a<<difflen
print "a,b,c ",a,b,c
#for bit in range(difflen):
#for i,bit in enumerate(bitsa): #'bitsa' must be an integer base 2 before passing in
while difflen > 0 or b != 0:
print "A. b,c ",bin(b),bin(c)
b = b^c #,a*int(bitsa[bit])
lendif = abs(len(str(bin(b))) - len(str(bin(c))))
c = c>>lendif
difflen = difflen - 1
print "B. b,c,lendif ",bin(b),bin(c),lendif#,int(bitsa[bit])
z = "{0:b}".format(b)
return z
j = (1,1,1,1);h = (1,1,0,1);k = (1,0,1,1,0);t1 = (1,1,1); t2 = (1,0,1)
t3 = (1,1); t4 = (1, 0, 1, 1, 1, 1, 1)
a = binary1polynomials(j);b = binary1polynomials(h);c = binary1polynomials(k)
f1 = binary1polynomials(t1); f2 = binary1polynomials(t2)
f3 = binary1polynomials(t3); f4 = binary1polynomials(t4)
print "divide: ",binary1polynomials.divide(f1,b)
print "divide: ",binary1polynomials.divide(f4,a)
print "divide: ",binary1polynomials.divide(f4,f2)
print "divide: ",binary1polynomials.divide(f2,a)
类二进制1多项式:
#多项式上的二元算术
定义初始化(self,expr):
self.expr=expr
def学位(自我):
返回len(self.expr)
def id(自身):
范围内的i返回[self.expr[i]%2(len(self.expr))]
def列表输入(自身):
#返回int(reduce(lambda x,y:x+str(y),self.expr.))
结果=binary1polynomials.id(self)
返回int(“”.join(映射(str,result)))
def divide(a,b):#a,b是类似于(1,0,1,0,0,1,…)的列表
a=二进制1多项式列表输入(a);b=二进制1多项式列表输入(b)
打印“a,b,类型(a)”,a,b,类型(a)
bina=int(str(a),2);binb=int(str(b),2)
a=最小值(bina,binb);b=最大值(bina,binb);
打印“a,b”,a,b
g=[];bitsa=“{0:b}”。格式(a);bitsb=“{0:b}”。格式(b)
difflen=len(str(bitsb))-len(str(bitsa))
打印“difflen,bitsa,bitsb,type(bitsa)”,difflen,bitsa,bitsb,type(bitsa)
打印“a,b”,a,b
c=a>lendif
difflen=difflen-1
打印“B.B,c,lendif”,bin(B),bin(c),lendif#,int(位)
z=“{0:b}”。格式(b)
返回z
j=(1,1,1,1);h=(1,1,0,1);k=(1,0,1,1,0);t1=(1,1,1);t2=(1,0,1)
t3=(1,1);t4=(1,0,1,1,1,1,1,1,1)
a=二元1多项式(j);b=二元1多项式(h);c=二进制1多项式(k)
f1=二元1多项式(t1);f2=二进制1多项式(t2)
f3=二元1多项式(t3);f4=二进制1多项式(t4)
打印“除法:”,二进制1多项式。除法(f1,b)
打印“除法:”,二进制1多项式。除法(f4,a)
打印“除法:”,二进制1多项式。除法(f4,f2)
打印“除法:”,二进制1多项式。除法(f2,a)
从这个输出中,它似乎在某个时刻(每次)得到了正确的答案,但随后就直接过去了
*** Remote Interpreter Reinitialized ***
>>>
divide: a,b,type(a) 111 1101 <type 'int'>
a,b 7 13
difflen,bitsa,bitsb,type(bitsa) 1 111 1101 <type 'str'>
a,b 7 13
a,b,c 7 13 14
A. b,c 0b1101 0b1110
B. b,c,lendif 0b11 0b11 2
A. b,c 0b11 0b11
B. b,c,lendif 0b0 0b1 1
g []
0
divide: a,b,type(a) 1011111 1111 <type 'int'>
a,b 15 95
difflen,bitsa,bitsb,type(bitsa) 3 1111 1011111 <type 'str'>
a,b 15 95
a,b,c 15 95 120
A. b,c 0b1011111 0b1111000
B. b,c,lendif 0b100111 0b111100 1
A. b,c 0b100111 0b111100
B. b,c,lendif 0b11011 0b11110 1
A. b,c 0b11011 0b11110
B. b,c,lendif 0b101 0b111 2
A. b,c 0b101 0b111
B. b,c,lendif 0b10 0b11 1
A. b,c 0b10 0b11
B. b,c,lendif 0b1 0b1 1
A. b,c 0b1 0b1
B. b,c,lendif 0b0 0b1 0
g []
0
divide: a,b,type(a) 1011111 101 <type 'int'>
a,b 5 95
difflen,bitsa,bitsb,type(bitsa) 4 101 1011111 <type 'str'>
a,b 5 95
a,b,c 5 95 80
A. b,c 0b1011111 0b1010000
B. b,c,lendif 0b1111 0b1010 3
A. b,c 0b1111 0b1010
B. b,c,lendif 0b101 0b101 1
A. b,c 0b101 0b101
B. b,c,lendif 0b0 0b1 2
A. b,c 0b0 0b1
B. b,c,lendif 0b1 0b1 0
A. b,c 0b1 0b1
B. b,c,lendif 0b0 0b1 0
g []
0
divide: a,b,type(a) 101 1111 <type 'int'>
a,b 5 15
difflen,bitsa,bitsb,type(bitsa) 1 101 1111 <type 'str'>
a,b 5 15
a,b,c 5 15 10
A. b,c 0b1111 0b1010
B. b,c,lendif 0b101 0b101 1
A. b,c 0b101 0b101
B. b,c,lendif 0b0 0b1 2
g []
0
***远程解释器重新初始化***
>>>
划分:a、b、类型(a)111 1101
a、 b 7 13
difflen,bitsa,bitsb,类型(bitsa)1111101
a、 b 7 13
a、 b、c 7 13 14
A.b,c 0b1101 0b1110
B.B、c、lendif 0b11 0b11 2
A.b,c 0b11 0b11
B.B、c、lendif 0b0 0b1 1
g[]
0
分割:a,b,类型(a)1011111111 1111
a、 b 15 95
difflen,bitsa,bitsb,类型(bitsa)3 1111 1011111
a、 b 15 95
a、 b、c 15 95 120
A.b,c 0b1011111 0b1111000
B、B、c、lendif 0b100111 0b111100 1
A.b,c 0b100111 0b111100
B、B、c、lendif 0b11011 0b11110 1
A.b,c 0b11011 0b11110
B.B、c、lendif 0b101 0b111 2
A.b,c 0b101 0b111
B.B、c、lendif 0b10 0b11 1
A.b,c 0b10 0b11
B.B、c、lendif 0b1 0b1 1
A.b,c 0b1 0b1
B.B、c、lendif 0b0 0b1 0
g[]
0
划分:a、b、类型(a)101111101
a、 b 5 95
difflen,bitsa,bitsb,类型(bitsa)4 101 1011111
a、 b 5 95
a、 b,c 5 95 80
A.b.c 0b1011111 0b1010000
B、B、c、lendif 0b1111 0b1010 3
A.b,c 0b1111 0b1010
B.B、c、lendif 0b101 0b101 1
A.b,c 0b101 0b101
B.B、c、lendif 0b0 0b1 2
A.b,c 0b0 0b1
B.B、c、lendif 0b1 0b1 0
A.b,c 0b1 0b1
B.B、c、lendif 0b0 0b1 0
g[]
0
划分:a、b、类型(a)101 1111
a、 b 5 15
difflen,bitsa,bitsb,类型(bitsa)1 101 1111
a、 b 5 15
a、 b,c 5 15 10
A.b,c 0b1111 0b1010
B.B、c、lendif 0b101 0b101 1
A.b,c 0b101 0b101
B.B、c、lendif 0b0 0b1 2
g[]
0
这可能是我在自学Python时犯的一些简单错误。这部分代码似乎有一些错误:
while difflen > 0 or b != 0:
b = b^c
lendif = abs(len(str(bin(b))) - len(str(bin(c))))
c = c>>lendif
difflen = difflen - 1
您似乎将b除以a,其中c等于a向左移位,以便最高有效位位于同一位置
问题1
当b为非零时,此循环从不终止=>当它终止时,答案b始终为零
修正:
问题2
如果在一次迭代中删除多个位,则lendif>1和c的右移位可能比左移位多
修正:
问题3
您没有执行最终迭代。该代码计算一个多项式相对于另一个多项式的模,因此除法(101101)应为0。(函数的更好名称可能是模数,而不是除法,因为返回的是余数而不是商)。您的代码当前发现difflen=0,因此跳过while循环
修正:
最终代码
谢谢太棒了,彼得。是的,不幸的是,只是现在。你怎么找到商呢?我想如果你把q=0,然后q+=1,你可能会得到商,你又是天才了!我不知道如何在那里得到0,但这解决了它。我已经在允许的范围内多次向你投了+1的赞成票,但也许其他人也会看到你的文章的价值。
while difflen > 0 and b != 0:
difflen -= lendif
while difflen >= 0 and b != 0:
while difflen >= 0 and b != 0:
b = b^c
lendif = abs(len(str(bin(b))) - len(str(bin(c))))
c = c>>lendif
difflen -= lendif