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.
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
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
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