jsbn2 modInverse returns 未定义
jsbn2 modInverse returns undefined
我找到了这个由 Tom Wu 称为 jsbn2 的大整数库,
在我不得不使用 modInverse 方法之前,它似乎运行良好。
出于某种原因,它 returns undefined 无论如何。
库中的方法是:
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)
returns 未定义。
该方法是否有问题,需要修复?
我怎样才能让它发挥作用?
好的.. 在数百个日志和东西之后,我终于找到了我的问题所在。
虽然我在问题中给出的示例值本身似乎确实有效,但方法 modInverse 存在不同的问题(再次..如果误导了某人,抱歉)。
它的问题(jsbn2 中的 modInverse 方法)是它不知道如何处理 negative 数字(而 Java 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。
希望这能帮助像我一样迷路的人:3
我找到了这个由 Tom Wu 称为 jsbn2 的大整数库, 在我不得不使用 modInverse 方法之前,它似乎运行良好。 出于某种原因,它 returns undefined 无论如何。 库中的方法是:
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)
returns 未定义。
该方法是否有问题,需要修复? 我怎样才能让它发挥作用?
好的.. 在数百个日志和东西之后,我终于找到了我的问题所在。 虽然我在问题中给出的示例值本身似乎确实有效,但方法 modInverse 存在不同的问题(再次..如果误导了某人,抱歉)。
它的问题(jsbn2 中的 modInverse 方法)是它不知道如何处理 negative 数字(而 Java 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。
希望这能帮助像我一样迷路的人:3