2014-01-24 2 views
-1

Здравствуйте, я работаю над алгоритмом для gcd и обратных операций с модулем.Проблемы BigInteger

Мне нужно использовать класс BigInteger, но у меня есть несколько проблем на этом.

Не могли бы вы мне помочь?

Проблема в том, что программа java не хочет перезаписывать старый вход 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!"); 

}} 
+0

Что такое 'BigInteger.valueOf (a)'? Это должно быть 'a'. – MariuszS

+0

О, мне так жаль, что вы правы, это shoud be a и в следующем lin b, но это не помогло решить мою проблему завышения значения BigInteger – user3233804

ответ

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 
+0

Спасибо за быстрый ответ! но как я могу это сделать? Жаль, что я новичок в мире Java – user3233804

+0

Там вы, добавленный образец кода. Просто верните свой GCD. –

+0

Кстати, вы знаете, что класс BigInteger имеет метод вычисления gcd? –

5

Вы не должны написать свой собственный метод НОД, поскольку он доступен в классе BigInteger.

a.gcd(b) 
+1

'modInverse'. –

+0

[Да, он делает] (https://stackoverflow.com/questions/21343936/biginteger-problems#comment32179910_21344050), потому что это, вероятно, упражнение из школы. – phant0m

Смежные вопросы