2013-06-27 16 views
0

이 함수는리스트 g에서 비정상적인 값을 반환합니다. 그것은 32774, 65548, 1048768을 돌려 주어야하지만 값은 더 큰 슬링키처럼 전체 바이너리를 처리하는 것과 같습니다. LSB를 실제 이동하는 대신 MSB로 이동하는 것과 같습니다.파이썬 --- GF (2) 필드에서 곱하기

def multiply(a,b): #a,b are values like 1101010001.... 
    a = min(a,b); b = max(a,b) 
    g = []; bitsa = "{0:b}".format(a) #returns product of 2 polynomials in gf2 
    [g.append((b<<i)*int(bit)) for i,bit in enumerate(bitsa)] 
    return reduce(lambda x,y: x+y,g) 

이 내가 함께 테스트하고있는 무슨이다 :

여기 함수의

x = int(str(100000000000011),2) 
y = int(str(1000110),2) 
x1 = int(str(111),2) 
y1 = int(str(11),2) 
x2 = int(str(0001),2) 
y2 = int(str(1111),2) 
print "multiply: ",multiply(x,y) 
print "multiply: ",multiply(x1,y1) 
print "multiply: ",multiply(x2,y2) 

만 X1, Y1 지금 작동, 다른 사람은하지 않습니다. 당신이 볼 수있는

 100000000000011 
       1000110 
--------------------- 
    100000000000011 
    100000000000011 
100000000000011  
--------------------- 
100011000000011001010 

따라서, 제품을 얻기 위해, 모두 바이너리가 인덱스 1의 검사 및 그 기반으로의 첨부가 필요합니다 : 이 마지막 입력에 대한 전체 방정식이다. 나는 그 부분을 어떻게 맞추는 지, 어떻게해야 올바른지를 알 수는 없다. x1, y1이 작동하는 이유와 다른 이유가 무엇인지 이해하려고 시도합니다.

편집 :

나는 그냥 J0HN의 대답은 정확 것으로 보인다 것을 분명히하고자하고 또한 자신이 참조 된 온라인 도구에서 오류를 붙 잡았다. 이런 식으로 유한 필드 수학으로 작업 할 때 기본 제공 함수가 우선 표시됩니다. 이 문제를 겪고있는 사람이라면 누구나 그 날카로운 관측 기술 - 지불 - 청구서에 대한 투표권을 보여줄 것입니다.

답변

2

enumerate이 잘못되었습니다. 그것은 MSB를 형성 시작, 그래서

for i, bit in enumerate('110'): 
    print (i, bit) 

(0, 1), (1, 1), (2, 0)하지 (0, 0), (1, 1), (2, 1) 얻을 것입니다. 그에서 제외

, 어떤 스타일 제안 :

  • Please avoid using ; in python. 페이지에 Compound statements 검색
  • Use list comprehensions if possible
  • 어느 주석이 잘못, 또는 당신은 당신 multiply이 목록에 동작하는 것을 언급하는 것을 잊었다. 이전 버전 인 경우 제거하십시오. 매우 혼란 스럽습니다. 후자의 경우 - 목록에 << 연산자가 정의되어 있지 않으므로 기존 코드는 전혀 작동하지 않습니다.

그래서, multiply 더 나은 작성 및 수정 : 최종 제안으로

또한
def multiply(a,b): 
    bitsa = reversed("{0:b}".format(a)) 
    g = [(b<<i)*int(bit) for i,bit in enumerate(bitsa)] 
    return reduce(lambda x,y: x+y,g)  

은 왜 파이썬은 당신을 위해 일을 할 수없는 것? 임의의 긴 정수에 대한 지원 기능이 내장되어 있으므로 모든 예제가 a*b과 같거나 결과가 바이너리 형식이되도록하려는 경우 "{0:b}".format(a*b)

+0

감사합니다. 이제 댓글이 정확해야합니다.당신 말이 맞아요, 내장을 사용 하겠지만 x1, y1 조합에서는 작동하지 않아서 의심스러워 보입니다. min, max 문이 필요했습니다 (가장 큰 값을 반복하기 때문에 생각합니다). 그것은 여전히 ​​마지막 사건을 위해 작동하지 않습니다,이 unb.edu 계산기 (테스트를위한 값으로 사전 설정)를 참조하십시오 또한 x1, y1에 대한이 계산기를 확인하시기 바랍니다 - 내장과 이것의 차이를 볼 수 ---- http://www.ee.unb.ca/cgi-bin/tervo/calc.pl?num=100000000000011&den=1000110&f=m&e=1&p=1&m=1 – stackuser

+0

사용하는 도구가 잘못 나온 것 같습니다. 예를 들어 3 자릿수에서 4 자로 이월됩니다. 그럴 수 있단 말인가? 또한 목록에 대해 연산을 수행해야한다면 - 곱하기는 이제는 수행하지 않을 것입니다. 다시리스트에 정의 된 연산자가 없기 때문입니다. – J0HN

+0

x1 * y1은 1001을 제공하고 carryover는 1101이어야합니다.하지만 내장 된 것이 제공하는 10101은 아닙니다. 그래서 이것은 또한 틀린 것입니다 --- http://www.ee.unb.ca/cgi-bin/tervo/calc.pl?num=1000110&den=100000000000011&f=d&e=1&p=1&m=1 ---- 형식 (x/y), "{0 : b}"형식 (x % y)은 11101010111을 반환하므로 기본 제공 권한이 있으므로이 도구는 보이지 않습니다 모든 테스트 예제에서 바이너리를 올바르게 처리하고 있습니까? – stackuser

-1

GF (2)에 비트를 곱하면 안되며? 그래서 할 수는 없습니다 :

x = int("1001",2) 
y = int("1010",2) 
z = x&y 
print "{0:b}".format(z) 
+0

아니요, 본질적으로 제품입니다. – J0HN