BigInteger的问题

时间:2014-01-24 22:51:33

标签: java algorithm biginteger modulo bluej

您好我正在研究gcd和逆模运算的算法。

我必须使用BigInteger类,但我有一些问题。

你能帮帮我吗?

问题是java programm不想用新的BigInteger输入覆盖旧的BigInteger输入。

    import java.math.BigInteger;
    public class Gcd
 { 
public static void gcd(BigInteger a, BigInteger b){
    BigInteger  modulo =  b;
    BigInteger  wert = a;
    BigInteger  zwischenwert1 =  BigInteger.valueOf(1);
    BigInteger  zwischenwert2 = BigInteger.valueOf(0);

    BigInteger  zwischenwert3 = BigInteger.valueOf(0);
    BigInteger  zwischenwert4 = BigInteger.valueOf(1);
    BigInteger negativ = BigInteger.valueOf(-1);
    BigInteger  q;
    do{
        q = modulo.divide(wert);

        wert = modulo.subtract(wert.multiply(q));           
        zwischenwert3 = zwischenwert1.subtract(zwischenwert3.multiply(q));
        zwischenwert4 = zwischenwert2.subtract(zwischenwert4.multiply(q));

        modulo = negativ.multiply((wert.subtract(modulo)).divide(q));
        zwischenwert1 = negativ.multiply((zwischenwert3.subtract(zwischenwert1)).divide(q));
        zwischenwert2 = negativ.multiply((zwischenwert4.subtract(zwischenwert2)).divide(q));         

    }while((modulo.signum()>1)&&(wert.signum()>1));
      System.out.println("gcd("+a+","+b+") = "+zwischenwert3+" * "+b+ " + "+ zwischenwert4+" * "+ a+" = "+((BigInteger.valueOf(b).multiply(zwischenwert3)).add((BigInteger.valueOf(a).multiply(zwischenwert4)))));
    if (((BigInteger.valueOf(b).multiply(zwischenwert3)).add((BigInteger.valueOf(a).multiply(zwischenwert4)))).signum()==1)
        System.out.println("Inverse "+a+" mod "+b+" is"+zwischenwert4);
    else
        System.out.println("no Inverse!");

}}

2 个答案:

答案 0 :(得分:5)

您不必编写自己的gcd方法,因为它在BigInteger类中可用。

a.gcd(b)

答案 1 :(得分:3)

在java中,所有对象都通过引用副本传递,这意味着如果您将a传递给函数,然后更改分配给引用a的值,则原始值将保持不变,因为您实际上不能访问原始引用,而是访问它的副本。您需要实际返回对新对象的引用,以使其转义函数。

例如:

public BigInteger mod(BigInteger a, BigInteger b){
  // .... create new value x
  return x;
}

顺便说一下,根据Wikipedia page,您几乎可以应用以下内容:

function gcd(a, b)
  while b ≠ 0
     t := b
     b := a mod b
     a := t
  return a