2013-06-27 4 views
0

Cette fonction renvoie des valeurs inhabituelles dans la liste g. Il devrait retourner 32774, 65548, 1048768 mais à la place, ses valeurs sont plutôt comme traiter le binaire entier comme un gros slinky et simplement déplacer les LSB vers les MSB au lieu de les déplacer réellement.Python --- multiplication dans le champ GF (2)

est ici la fonction:

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) 

C'est ce que je teste avec:

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) 

Seulement x1, y1 fonctionne en ce moment, les autres ne le font pas. Ce est toute l'équation pour la dernière entrée:

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

Comme vous pouvez le voir, pour obtenir le produit, les deux binaires doivent avoir leurs index vérifiés pour 1 et de append puis sur cette base. Je ne suis pas sûr de savoir comment adapter cette partie, et comment le faire afin qu'il renvoie la valeur correcte. Essayer de comprendre pourquoi x1, y1 fonctionne et pas les autres.

EDIT:

Je veux juste qu'il soit clair que la réponse de J0HN semble être tout à fait exact et de plus il a attrapé une erreur dans l'outil en ligne qui a été référencé. De ce qu'il semble maintenant, les built-in sont préférentiels lorsque vous travaillez avec des mathématiques de terrain fini de cette façon. N'importe qui qui passe à travers cela devrait certainement envisager de lui montrer un peu d'amour pour ces talents d'observateur-à-payer-les-factures.

Répondre

2

Vous avez enumerate mal. Il commence former le MSB, alors

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

produirait (0, 1), (1, 1), (2, 0), pas (0, 0), (1, 1), (2, 1).

En dehors de cela, quelques suggestions de style:

  • Please avoid using ; in python. Recherchez des Compound statements sur la page
  • Use list comprehensions if possible
  • Soit le commentaire est faux, ou vous avez oublié de mentionner que vous multiply fonctionne sur les listes. Si ancien - l'enlever, c'est très confus. Si ce dernier - votre code existant ne fonctionnera pas du tout car il n'y a pas << opérateur défini sur les listes.

Ainsi, multiply mieux écrit et fixé:

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)  

En outre, comme dernière suggestion, pourquoi ne pas vous laisser python faire les choses pour vous? Il a un support intégré pour les entiers longs arbitraires, donc tous vos exemples sont équivalents à juste a*b, ou, si vous voulez que le résultat soit sous forme binaire "{0:b}".format(a*b)

+0

merci, le commentaire devrait maintenant être correct.vous avez raison, j'allais utiliser le built-in, mais il semble que cela ne fonctionne pas pour la combinaison x1, y1 et par conséquent semblait discutable. les instructions min, max étaient nécessaires (je pense que c'est l'itération sur la plus grande valeur). il ne fonctionne toujours pas pour le dernier cas, se référer à cette calculatrice unb.edu (préréglé aux valeurs pour les tests), aussi s'il vous plaît vérifier cette calculatrice pour le x1, y1 pour voir la différence entre le built-in et ce ---- http://www.ee.unb.ca/cgi-bin/tervo/calcul.pl?num=100000000000011&den=1000110&f=m&e=1&p=1&m=1 – stackuser

+0

J'ai peur que l'outil que vous utilisez se trompe, dans le Par exemple, il manque le report du troisième chiffre au quatrième. Est-ce censé être ainsi les reports sont ignorés? De plus, s'il est supposé fonctionner sur des listes, le 'multiply' comme vous l'avez maintenant ne le fera pas, car, encore une fois, il n'y a pas d'opérateur << <<' sur les listes. – J0HN

+0

x1 * y1 donne 1001, et avec le report il devrait être 1101. mais ce n'est toujours pas le 10101 que le built-in donne. alors c'est aussi faux --- http://www.ee.unb.ca/cgi-bin/tervo/calc.pl?num=1000110&den=100000000000011&f=d&e=1&p=1&m=1 ---- dans le l'impression intégrée "{0: b}". format (x/y), "{0: b}". format (x% y) renvoie 11101010 111, ainsi est le droit intégré et cet outil ne semble pas traiter correctement le binaire pour chaque exemple de test? – stackuser

-1

Ne se multiplie pas dans GF (2) juste un peu de bit et? Donc, vous ne pourriez pas le faire:

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

Non ce n'est pas, c'est essentiellement un produit. – J0HN