首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >jsbn2 modInverse返回未定义的

jsbn2 modInverse返回未定义的
EN

Stack Overflow用户
提问于 2016-03-09 11:01:37
回答 1查看 102关注 0票数 0

我找到了一个名为jsbn2的大整数库,由Tom编写,在我不得不使用modInverse方法之前,它似乎工作得很好。由于某种原因,它将返回未定义的。图书馆中的方法是:

代码语言:javascript
复制
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;
    };

我把它和很长的数字放在一起,用于前。

代码语言:javascript
复制
var a = new BigInteger("26243431849380303664210129223718904471391758038739441955848319764858899645035");
var b = new BigInteger("fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f", 16);

(固定b值,ty Rudy Velthuis)

但是a.modInverse(b)返回未定义的。

这个方法有什么问题吗?这需要修正吗?我怎么才能让它起作用?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-17 12:21:25

好的..。像几百个日志之类的东西,我终于找到了我的问题所在。虽然我给出的示例值本身似乎确实有效,但是方法modInverse (再次.对不起,如果这误导了某人)。

它的问题(jsbn2中的jsbn2方法)是它不知道如何处理负数(而 modInverse知道)。

我的解决方案是检查我给出的值是否为正,如果不是,我准备好了(感谢this topic for explaining how):

代码语言:javascript
复制
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值。

希望这能帮助像我这样迷路的人

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35889724

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档