Ich habe mehrere Variationen von "modular inverse" gesehen, aber ich kann anscheinend nicht die richtige Art und Weise identifizieren, es für C ++ zu verwenden. Ich bin mir nicht sicher, wie dieser Python-Code in C++ übersetzt wird:
def inverse(x, p):
"""
Calculate the modular inverse of x ( mod p )
the modular inverse is a number such that:
(inverse(x, p) * x) % p == 1
you could think of this as: 1/x
"""
inv1 = 1
inv2 = 0
while p != 1 and p!=0:
inv1, inv2 = inv2, inv1 - inv2 * (x / p)
x, p = p, x % p
return inv2
Meine aktuelle Codierung ist hier: http://coliru.stacked-crooked.com/a/74648b16c2692525
Aber es wird nur wie der erste öffentliche Schlüssel richtig angezeigt, danach vermasselt es sich.
#include <openssl/bn.h>
[...]
BN_mod_inverse ( a, b, c, ctx );
Ich werde es versuchen, ich codiere nicht oft in C++. Mache meistens Java, und ich bin mit Python völlig unbekannt. Ich habe diesen Code getestet.
int inverse(int x,int p)
{
int orig = p;
int inv1 = 1;
int inv2 = 0;
while(p != 1 && p != 0)
{
int temp = inv2;
inv2 = inv1 - inv2 * (x/p);
inv1 = temp;
temp = p;
p = x % p;
x = temp;
}
while(inv2 < 0)
inv2 += orig;
return inv2;
}
Es stellt sich heraus, dass Python % anders arbeitet als C++. Die while(inv2 < 0)-Anweisung korrigiert den durch die Differenz verursachten Vorzeichenfehler. Es gibt wahrscheinlich einen eleganteren Weg, dies zu tun, aber das war schnell und einfach.
Mine