Greates Commong Dividend - euklidischer Algorithmus, modulos not positive

Lukases2

Aktives Mitglied
Hallo wieder mal,

ich habe eine Methode geschrieben, die den größten gemeinsamen Teiler (= ggT = gcd = greates common dividend) mit Hilfe des euklidischen Algorithmus berechnet:

Java:
public BigInteger gcdEuclid(BigInteger n, BigInteger m){
		/* Beginne Initialisierung */
		BigInteger g = BigInteger.ZERO; // g = Lösung
		int zw = n.compareTo(m); // Vergleichsspeicher
		BigInteger a = BigInteger.ZERO; // erster Zwischenspeicher
		BigInteger b = BigInteger.ZERO; // zweiter Zwischenspeiche
		/* Beende Initialisierung */
		
		while(zw != 0){ 
				a = m;
				b = n.mod(m);
				n = a;
				m = b;
				zw = n.compareTo(m);
				g = n;
		}
		return g;
	}

Nach dem dritten Durchlauf der Schleife bekomme ich die "java.lang.ArithmeticException: BigInteger: modulus not positive". Ich komme nicht drauf, wie ich das beheben kann.
 
Zuletzt bearbeitet:

Diabolus

Aktives Mitglied
Ich hätte so eine Methode so geschrieben:
Java:
public int gcdEuclid(int n, int m){
	int h = 0;
	while(m != 0) {
		h = n%m;
		n = m;
		m = h;
	}
	return n;
}
mfg Diabolus
 
Zuletzt bearbeitet:

Diabolus

Aktives Mitglied
Natürlich würde es auch mit BigInteger gehen:
Java:
public BigInteger gcdEuclid(BigInteger n, BigInteger m) {
	BigInteger g = BigInteger.ZERO;
 
	while(!m.equals(BigInteger.ZERO)) { 
		g = n.mod(m);
		n = m;
		m = g;
	}
	return n;
}
mfg Diabolus
 

Lukases2

Aktives Mitglied
Ist das denn auch der euklidische Algorithmus? Der mir vorgegebene Pseudocode enthält nämlich diese a's und b's, die ich eben auch eingebaut habe.
 

Diabolus

Aktives Mitglied
Hallo Lukases2,

Ich kenne ja nicht deinen dir vorliegenden Pseudocode aber laut Wikipedia(Euklidischer Algorithmus – Wikipedia) lautet der iterative Algorithmus in Pseudocode wie folgend:
Code:
EUCLID(a,b)
1  solange b ≠ 0
2      h <- a mod b
3      a <- b
4      b <- h
5  return a

und hier der Javacode für diesen Pseudocode (als Kommentare hab ich das Pseudocode Pendant geschrieben):
Java:
public BigInteger gcdEuclid(BigInteger a, BigInteger b) {
    BigInteger h = BigInteger.ZERO;//initialisierung der variable h
 
    while(!b.equals(BigInteger.ZERO)) {  //solange b != 0
        h = a.mod(b);  //h <- a mod b
        a = b;  //a <- b
        b = h;  //b <- h
    }
    return a;  //return a
}

Wie du siehst ist das genau der Code den ich vorhin schon gepostet habe nur mit anderen Variablennamen!

mfg Diabolus
 

Neue Themen


Oben