我找到了一个名为jsbn2的大整数库,由Tom编写,在我不得不使用modInverse方法之前,它似乎工作得很好。由于某种原因,它将返回未定义的。图书馆中的方法是:
bnModInverse(m) {
var ac = m.isEven();
if((this.isEven() && ac) || m.signum() == 0) return new BigInteger(0);
var u = m.clone(), v = this.clone();
var a = new BigInteger(1), b = new BigInteger(0), c = new BigInteger(0), d = new BigInteger(1);
while(u.signum() != 0) {
while(u.isEven()) {
u.rShiftTo(1,u);
if(ac) {
if(!a.isEven() || !b.isEven()) { a.addTo(this,a); b.subTo(m,b); }
a.rShiftTo(1,a);
}
else if(!b.isEven()) b.subTo(m,b);
b.rShiftTo(1,b);
}
while(v.isEven()) {
v.rShiftTo(1,v);
if(ac) {
if(!c.isEven() || !d.isEven()) { c.addTo(this,c); d.subTo(m,d); }
c.rShiftTo(1,c);
}
else if(!d.isEven()) d.subTo(m,d);
d.rShiftTo(1,d);
}
if(u.compareTo(v) >= 0) {
u.subTo(v,u);
if(ac) a.subTo(c,a);
b.subTo(d,b);
}
else {
v.subTo(u,v);
if(ac) c.subTo(a,c);
d.subTo(b,d);
}
}
if(v.compareTo( BigInteger.ONE ) != 0) return new BigInteger(0);
if(d.compareTo(m) >= 0) return d.subtract(m);
if(d.signum() < 0) d.addTo(m,d); else return d;
// MODIFIED BY ATS 2008/11/22 FOR COMPATIBILITY TO Flash ActionScript
// if(d.signum() < 0) return d.add(m); else return d;
if(d.signum() < 0) return d.ope_add(m); else return d;
};我把它和很长的数字放在一起,用于前。
var a = new BigInteger("26243431849380303664210129223718904471391758038739441955848319764858899645035");
var b = new BigInteger("fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f", 16);(固定b值,ty Rudy Velthuis)
但是a.modInverse(b)返回未定义的。
这个方法有什么问题吗?这需要修正吗?我怎么才能让它起作用?
发布于 2016-03-17 12:21:25
好的..。像几百个日志之类的东西,我终于找到了我的问题所在。虽然我给出的示例值本身似乎确实有效,但是方法modInverse (再次.对不起,如果这误导了某人)。
它的问题(jsbn2中的jsbn2方法)是它不知道如何处理负数(而 modInverse知道)。
我的解决方案是检查我给出的值是否为正,如果不是,我准备好了(感谢this topic for explaining how):
if(a.compareTo(ZERO)<0)
{
a = a.negate(); //make it positive
a = a.mod(b); //get modulo
a = b.subtract(a); //get remainder of modulo
}我不知道这是否是最好的解决办法(当然不是),但它似乎是可行的。我测试的结果值现在等于Java的modInverse值。
希望这能帮助像我这样迷路的人
https://stackoverflow.com/questions/35889724
复制相似问题