[java] iterationer under algoritmberäkning.

Permalänk
Medlem

[java] iterationer under algoritmberäkning.

Tjenare!
Sitter här glor på min kod och kan inte se vart det lilla felet uppstår, så jag tänkte att ett par extra ögon kan väl inte skada.

Har skrivit ett litet program som med Hjälp av "Euklides utvidgade algoritm" beräknar U*x+V*y=d, d=gcd(x,y). Denna fungerar som den ska.
Sedan ville jag utveckla programmet ett steg så att maximala antalet iterationer beräknas för en mängd tal.
ex.
maxIter(5) ska ta och utföra den ovanstående algoritmen för gcd(5,{4,3,2,1}) och kolla vilken av de kräver flest iterationer i Euklides utvidgade algoritm.
Problemet som uppstår är att antalet iterationer är fel av någon anledning och jag har stirrat mig blind utan någon som helst framgång...

tabell med förväntade värden.

Dold text

min kod.

public class Euc { private static int counter=0; private static int U[]; public static void main(String [] args) { //gcd(5,4); //System.out.print("["+getU(0)+" , "+getU(1)+" , "+getU(2)+ "]"); maxIter(10); System.out.print(getCounter()); } public static void maxIter(int m) { for(int i=2;i<m-1;i++) { int newCounter=getCounter(); if(gcd(m,i)==1) if(newCounter>getCounter()) setCounter(newCounter); } } public static int gcd(int m, int a) { int counter=0; int[] U = {a,1,0}; int[] V = {m,0, 1}; int[] Z = new int[3]; while (V[0] != 0) { int W = U[0]/V[0]; for (int i=0;i<U.length;i++) { Z[i]= U[i]-V[i]*W; U[i]=V[i]; V[i]=Z[i]; } counter++; } setU(U); setCounter(counter); return getU(2); } public static void setCounter(int c) { counter= c; } public static int getCounter() { return counter; } public static void setU(int u[]) { U = u; } public static int getU(int i) { return U[i]; } }

Tack på förhand!

Permalänk
Medlem

Nu kollade jag bara som hastigast igenom det hela utan att egentligen förstå algoritmen. Hur som helst, den enda gången du sätter den statiska countern är i gcd och då sätter du den alltid till den lokala gcd-countern. Är det vad du vill? Med andra ord kommer static-countern alltid ha samma värde som den senaste körda gcd-anropet.

//C

Permalänk
Medlem
Skrivet av conio:

Nu kollade jag bara som hastigast igenom det hela utan att egentligen förstå algoritmen. Hur som helst, den enda gången du sätter den statiska countern är i gcd och då sätter du den alltid till den lokala gcd-countern. Är det vad du vill? Med andra ord kommer static-countern alltid ha samma värde som den senaste körda gcd-anropet.

//C

Tanken är att varje gång gcd() körs så ska den statiska variabeln countern öka och sedan ska den globala countern tilldelas det lokala värdet.
Så efter alla iterationer får man fram max antal iterationer efter att tex gcd(5,{4,3,2,1}) utförts.

När jag tex testar maxIter(5) returneras värdet 4 som är korrekt enligt den bifogade tabellen. Men när jag istället använder 10 isf 5 så blir resultatet 4 som är fel.

Jag har förmodligen något litet tankefel där som jag verkligen inte ser :/