有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java BigInteger扩展欧氏算法递归错误

我正在尝试用大整数做一个扩展的欧几里德算法。 但我一直在犯这样的错误

线程“main”java中出现异常。算术异常:BigInteger除以零

我在谷歌上搜索,它说我可能会因为非整数部分而出错

我该如何解决这个问题

public static void main(String[] args) throws Exception{

    BigInteger ex1 = new BigInteger("9");
    BigInteger ex2 = new BigInteger("13");
    //if(eA.gcd(eB).equals(BigInteger.ONE))
//  {
        BigInteger[] val = gcd(ex1,ex2);
        
        System.out.println(val[1]);
        System.out.println(val[2]);
//  }
}

   // Returns a triple {d, a, b} such that d = a*p + b*q

   static BigInteger[] gcd(BigInteger p, BigInteger q) {
          if (p.equals(BigInteger.ZERO))
             return new BigInteger[] { p, BigInteger.valueOf(1), BigInteger.valueOf(0) };

          BigInteger[] vals = gcd(q, p.remainder(q));
          BigInteger d = vals[0];
          BigInteger a = vals[2];
          BigInteger b = vals[1].subtract((p.divide(q)).multiply(vals[2]));
          return new BigInteger[] { d, a, b };
       }
}

共 (1) 个答案

  1. # 1 楼答案

    以下是Github副驾驶(经我验证)生产的工作变体:

    // Returns a triple {d, a, b} such that d = a*p + b*q
    static BigInteger[] extendedEuclidean(BigInteger p, BigInteger q) {
        BigInteger[] val = new BigInteger[3];
    
        if (q.equals(BigInteger.ZERO)) {
            val[0] = p;
            val[1] = BigInteger.ONE;
            val[2] = BigInteger.ZERO;
        } else {
            BigInteger[] val2 = extendedEuclidean(q, p.mod(q));
            val[0] = val2[0];
            val[1] = val2[2];
            val[2] = val2[1].subtract(p.divide(q).multiply(val2[2]));
        }
    
        return val;
    }
    

    注意:当p=0时,它返回q,反之亦然

    与您的代码不同的是,它检查q != 0(在某个点上必然变成0),而不是p != 0

    测试:

    input: 9, 13
    d = 1, a = 3, b = -2
    
    input: 2, 15
    d = 1, a = -7, b = 1
    
    input: 9, 12
    d = 3, a = -1, b = 1
    
    input: 0, 10
    d = 10, a = 0, b = 1
    
    input: 0, 0
    d = 0, a = 1, b = 0
    
    input: 1, 1
    d = 1, a = 0, b = 1
    
    input: 3, 0
    d = 3, a = 1, b = 0