Markoff-Zahl

Bitte aktiviere JavaScript!
Guten Tag zusammen,

ich hab ein Problem und komme einfach auf keine Lösung :( Eigentlich ist die Aufgabe die ich hier versuche überhaupt nicht schwer doch Ich bekomme es nicht hin :(

Also ich versuche die Markoff-Zahlen zu programmieren. Das ganze versuche ich so das ich ein Array erstelle dort die Quersummen der Zahlen speichern möchte und dann drüber laufen will ob die Quersumme in dem Array schon vorhanden ist doch ich bekomme ja nicht mal die Zahlen vernünftig ins Array rein :(

Hier mal mein Versuch:

Code:
int n=10;
        int[] quersumme=new int[n*n];
        int counter=0;
        int tmp=0;
       
        for(int i=1;i<=n;i++) {
            for(int j=1;j<=n;j++) {
                for(int k=1;k<=n;k++) {
                if(i*i+j*j+k*k==3*i*j*k) {
                    tmp=i+j+k;
                    System.out.println(i+" "+j+" "+k+" "+tmp);

                }

                    }
                }
            }
Die Ausgabe ist:
1 1 1 3
1 1 2 4
1 2 1 4
1 2 5 8
1 5 2 8
2 1 1 4
2 1 5 8
2 5 1 8
5 1 2 8
5 2 1 8

Ich will jetzt alle Zahlen die ein doppelten tmp haben raus werfen. Doch immer wenn ich versuche eine neue Quersumme in mein Array zu speichern überschreibt er mir das ganze Array mit der gefunden quersumme. Ich hab keine Ahnung wie ich in so einer Schleifen-Kaskade vernünftig nochmal durch mein quersummen Array laufen kann.
Bin über jede Hilfreiche Antwort sehr dankbar :)

LG
 
A

Anzeige


Vielleicht hilft dir dieser Kurs hier weiter: (hier klicken)
Flown stimmt :D ich hab meinen ersten Versuch Kopiert grrr...
Hier mal der bis jetzt neue Versuch. Nun ist es gar nicht mehr ganz so schlimm :D Das Array wird mit Quersummen gefüllt doch noch immer so wie ich es gerne hätte. Denn es werden weiterhin Dupletten Kopiert :(

Java:
int n=100;
    int quersumme=0;
    int tmp=0;
    int[] qArray=new int[n*n];
    int counter=0;
   
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            for(int k=1;k<=n;k++) {
                if(i*i+k*k+j*j==3*i*k*j) {
                    tmp=quersumme;
                    quersumme=i+j+k;
                    if(tmp!=quersumme) {
                        qArray[counter]=quersumme;
                        System.out.println("("+i+","+k+","+j+")");
                        counter++;
                    }
                   
                }
            }
   
    for(int i=0;i<=counter;i++)
        System.out.println(qArray[i]);
 
Du prüfst ja immer nur ab, ob die neue Quersumme sich von der letzten Quersumme unterscheidet.
 
ja weil ich es nicht anders hin bekomme :(
ich sitze hier schon seit stunden an sowas :( das ist sicherlich so schwer nicht doch ich bekomme es gerade überhaupt nicht hin. Ich denke ich werde es erstmal sein lassen sonst macht man sich nur Verrückt :D
 
Also es geht darum die Markhoffzahlen zu ermitteln?
Eine Markoff-Zahl ist eine natürliche Zahl x , y oder z, die als Lösung der diophantischen Markoff-Gleichung
x^2 + y^2 + z^2 = 3*x*y*z vorkommt.
Die ersten Markoff-Zahlen sind 1, 2, 5, 13, 29, 34, 89, 169, 194, 233, 433, 610, 985, 1325, …

Man kann aus einer Lösung (x ,y ,z ) der Markoff-Gleichung mittels (x ,y ,z) → (x ,y ,3*x*y − z) weitere Lösungen erzeugen.

Ich würde ein Klasse für die Trippel bauen mit obigen Bedingungen.
z.B.
Java:
import java.util.Arrays;

public class MarkhoffTripple {
    private int[] values = new int[3];

    public MarkhoffTripple(int x, int y, int z) throws IllegalArgumentException {
        values[0] = x;
        values[1] = y;
        values[2] = z;
        setValues(values);
    }

    public MarkhoffTripple(int[] values) throws IllegalArgumentException {
        setValues(values);
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        MarkhoffTripple other = (MarkhoffTripple) obj;
        if (!Arrays.equals(values, other.values))
            return false;
        return true;
    }

    public int getCrossSum() {
        return values[0] + values[1] + values[2];
    }

    public int[] getValues() {
        return Arrays.copyOf(values, values.length);
    }

    public MarkhoffTripple[] getFollower() {
        MarkhoffTripple[] neigbours = new MarkhoffTripple[2];
        if (getCrossSum() == 3) {
            neigbours = new MarkhoffTripple[1];
            neigbours[0] = new MarkhoffTripple(1, 1, 2);
            return neigbours;
        }
        if (getCrossSum() == 4) {
            neigbours = new MarkhoffTripple[1];
            neigbours[0] = new MarkhoffTripple(1, 2, 5);
            return neigbours;
        }
        int x = values[1];
        int y = values[2];
        int z = values[0];
        neigbours[1] = new MarkhoffTripple(x, y, 3 * x * y - z);
        x = values[0];
        y = values[2];
        z = values[1];
        neigbours[0] = new MarkhoffTripple(x, y, 3 * x * y - z);
        return neigbours;

    }

    public static boolean isMarkhoffTripple(int x, int y, int z) {
        return x * x + y * y + z * z == 3 * x * y * z;
    }

    private void setValues(int[] values) {
        if (values == null || values.length != 3 || !isMarkhoffTripple(values[0], values[1], values[2]))
            throw new IllegalArgumentException("No Markhofftripple!");
        this.values = Arrays.copyOf(values, values.length);
        Arrays.sort(this.values);
    }

    @Override
    public String toString() {
        return "[" + values[0] + "," + values[1] + "," + values[2] + "]";
    }
}
Java:
    public static void main(String[] args) {
        Vector<MarkhoffTripple> tripples = new Vector<MarkhoffTripple>();
        tripples.add(new MarkhoffTripple(1, 1, 1));
        getMarkahoff(tripples, 0, 10);
        for (MarkhoffTripple i : tripples)
            System.out.print(i + " ");
    }

    private static void getMarkahoff(Vector<MarkhoffTripple> tripples, int pos, int n) {
        if (pos == n)
            return;
        MarkhoffTripple t = tripples.get(pos);
        MarkhoffTripple[] follows = t.getFollower();
        for (int i = 0; i < follows.length; i++) {
            if (tripples.size() < n)
                tripples.add(follows[i]);
        }
        pos++;
        getMarkahoff(tripples, pos, n);
    }
Aus den Trippel lassen sich dann die Markhoff Zahlen einfach abbilden.
 
Danke für eure Antworten.
Von Blender verstehe ich fast nix obwohl wir das fast alles hatten ein paar sachen sind neu doch normalerweise sollte ich das mitlerweile besser verstehen können! Denke ich lasse es einfach.

Danke nochmals =)

LG
 
Ja irgendwie hab ich das gefühl egal wieviel ich lerne und Üben tue es klappt einfach nicht! :(

so hab ich es jetzt gemacht:
Java:
public class MarkoffMain {

    static boolean contains(int[] arr, int len, int value) {
        for(int i=0;i<len;i++)
            if(arr[i]==value)
                return true;
        return false;
    }
   
    public static void main(String[] args) {
   
        int n=10;
        int[] a=new int[n*n];
        int pos=0;
        int quersumme=0;
       
        for(int x=1;x<=n;x++)
            for(int y=1;y<=n;y++)
                for(int z=1;z<=n;z++) {
                    if(x*x+y*y+z*z==3*x*y*z) {
                        quersumme=x+y+z;
                       
                           
                        }
                    }
       
        }   
    }

Wie ich jetzt mit der Methode umzugehen habe weis ich auch nicht so recht :(
 
so nun stehen nur noch die Quersummen im Array ;)
Morgen werde ich nun versuchen das sobald eine Quersumme kommt die schon dran war soll er die Zahl nicht Printen! also nochmal durch das Array laufen und vergleichen oder?
Bin grade am Überlegen ob das nicht dann wieder Doppelt gemoppelt ist und ich mal wieder etwas übersehe! Doch heute hab ich mich genug über diese Aufgabe aufgeregt :D Das kann doch nicht so schwer sein :D man man man

Java:
public class MarkoffMain {

    static boolean contains(int[] arr, int len, int value) {
        for(int i=0;i<len;i++)
            if(arr[i]==value)
                return true;
        return false;
    }
  
    public static void main(String[] args) {
  
        int n=100;
        int[] a=new int[n*n];
        int pos=0;
        int quersumme=0;
      
        for(int x=1;x<=n;x++)
            for(int y=1;y<=n;y++)
                for(int z=1;z<=n;z++) {
                    if(x*x+y*y+z*z==3*x*y*z) {
                        quersumme=x+y+z;
                        if(!contains(a,a.length,quersumme)) {
                            a[pos]=quersumme;
                            pos++;
                        }
                      
                      
                        }
                    }
        for(int i=0;i<a.length;i++)
            System.out.println(a[i]);
      
        }  
    }
Okay so läuft es nun danke =)
Java:
public class MarkoffMain {

    static boolean contains(int[] arr, int len, int value) {
        for(int i=0;i<len;i++)
            if(arr[i]==value)
                return true;
        return false;
    }
   
    public static void main(String[] args) {
   
        //16-5000
        int n=8000;
        int[] a=new int[n*n];
        int pos=0;
        int quersumme=0;
        int counter=18;
       
            for(int x=1;x<=n&&counter>0;x++)
                for(int y=1;y<=n&&counter>0;y++)
                    for(int z=1;z<=n&&counter>0;z++) {
                        if(x*x+y*y+z*z==3*x*y*z) {
                            quersumme=x+y+z;
                            if(!contains(a,a.length,quersumme)) {
                                a[pos]=quersumme;
                                pos++;
                                System.out.println(counter+" ("+x+","+y+","+z+")");
                                counter--;
                            }
                        }
                   
        }
           
       
        }   
    }

Problem ist nur ich glaube das funktioniert mit der quersumme nicht so einfach!
Gibt man den Wertebereich n=10.000 und den counter = 50 dann kommen auch Markoff-Zahlen die in Wikipedia auf dem Bild nicht zu sehen sind! :( Kann auch sein das es trozdem Markoff-Zahlen sind und das Bild nicht vollständig ist :D
Habs mal so weit laufen lassen:
50 (1,1,1)
49 (1,1,2)
48 (1,2,5)
47 (1,5,13)
46 (1,13,34)
45 (1,34,89)
44 (1,89,233)
43 (1,233,610)
42 (1,610,1597)
41 (1,1597,4181)
40 (2,5,29)
39 (2,29,169)
38 (2,169,985)
37 (2,985,5741)
36 (5,13,194)
35 (5,29,433)
34 (5,194,2897)
33 (5,433,6466)
32 (13,34,1325)
31 (13,194,7561)
30 (30,5515,8873)
29 (34,89,9077)
28 (98,3175,4635)
27 (175,6369,6447)
26 (203,9331,9858)
25 (215,2643,5058)
24 (217,2617,7601)
23 (229,2434,7745)

In Wikipedia auf dem Bild kommt nach 5.433.6466 gleich 29.433.37666 also entweder klappt es wie gesagt mit der quersumme nicht oder die haben einfach viele nicht dazu genommen. Das mit der Quersumme war ja auch nur ein schneller Einfall von mir und es sollte ein Übung mit Arrays sein die ich nicht hin bekommen habe.

Nochmals Danke =)
 
Zuletzt bearbeitet:
28 (98,3175,4635)
27 (175,6369,6447)
26 (203,9331,9858)
25 (215,2643,5058)
24 (217,2617,7601)
23 (229,2434,7745)
Die erfüllen die Markhoff Gleichung nicht!
x^2 + y^2 + z^2 = 3*x*y*z
Bei int als Type kann es bei großen Zahlen zu einem Überlauf kommen.
Bei einem 64-Bit System ist es möglich den Zahlenbereich mittels Typ Long zu vergrößern.
Ich habe mir die Lösung von Dir nicht genau angeschaut, aber ein Integer Feld der Größe 8000x8000 = 64.000.000 erscheint mir als unnötig hoher Speicherbedarf. Jedes Markhofftrippel hat genau 3 Nachbarn ( Ausgenommen (1,1,1) 1 Nachbar und ( 1,1,2 ) 2 Nachbarn ).
Meine Lösung verwendet die Berechnung der Nachbarn, um weitere Trippel zu finden. Außerdem würde die Klasse Markhofftrippel einen Fehler werfen, wenn man eine Instanz mit den Falschen Zahlen erstellt. So ist sichergestellt, dass nur gültige Trippel verwendet werden. ( Überlauf ausgenommen. Bei großen Werten Long oder besser BigInteger verwenden )
Schau Dir meine Lösung vielleicht noch einmal an.
 
Zuletzt bearbeitet:
Hier die Lösung für "beliebig" große Zahlen.
Java:
import java.math.BigInteger;
import java.util.Arrays;

public class MarkhoffTripple implements Comparable<MarkhoffTripple> {
    private BigInteger[] values = new BigInteger[3];

    public MarkhoffTripple(BigInteger x, BigInteger y, BigInteger z) throws IllegalArgumentException {
        values[0] = x;
        values[1] = y;
        values[2] = z;
        setValues(values);
    }

    public MarkhoffTripple(BigInteger[] values) throws IllegalArgumentException {
        setValues(values);
    }

    public MarkhoffTripple() {
        for (int i = 0; i < values.length; i++)
            values[i] = BigInteger.valueOf(1);
        setValues(values);
    }

    @Override
    public int compareTo(MarkhoffTripple o) {
        int cmp = 0;
        for (int i = 2; i > 0; i--) {
            cmp = values[i].compareTo(o.values[i]);
            if (cmp != 0)
                return cmp;
        }
        return cmp;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        MarkhoffTripple other = (MarkhoffTripple) obj;
        if (!Arrays.equals(values, other.values))
            return false;
        return true;
    }

    public BigInteger getCrossSum() {
        return values[0].add(values[1]).add(values[2]);
    }

    public BigInteger[] getValues() {
        return Arrays.copyOf(values, values.length);
    }

    public MarkhoffTripple[] getFollower() {
        MarkhoffTripple[] neigbours = new MarkhoffTripple[2];
        if (getCrossSum().equals(BigInteger.valueOf(3))) {
            neigbours = new MarkhoffTripple[1];
            neigbours[0] = new MarkhoffTripple(BigInteger.valueOf(1), BigInteger.valueOf(1), BigInteger.valueOf(2));
            return neigbours;
        }
        if (getCrossSum().equals(BigInteger.valueOf(4))) {
            neigbours = new MarkhoffTripple[1];
            neigbours[0] = new MarkhoffTripple(BigInteger.valueOf(1), BigInteger.valueOf(2), BigInteger.valueOf(5));
            return neigbours;
        }
        BigInteger x = values[1];
        BigInteger y = values[2];
        BigInteger z = values[0];
        neigbours[1] = new MarkhoffTripple(x, y, BigInteger.valueOf(3).multiply(x).multiply(y).subtract(z));
        x = values[0];
        y = values[2];
        z = values[1];
        neigbours[0] = new MarkhoffTripple(x, y, BigInteger.valueOf(3).multiply(x).multiply(y).subtract(z));
        return neigbours;

    }

    public static boolean isMarkhoffTripple(BigInteger x, BigInteger y, BigInteger z) {
        BigInteger sum1 = x.multiply(x).add(y.multiply(y)).add(z.multiply(z));
        BigInteger sum2 = BigInteger.valueOf(3).multiply(x).multiply(y).multiply(z);
        return sum1.equals(sum2);
    }

    private void setValues(BigInteger[] values) {
        if (values == null || values.length != 3 || !isMarkhoffTripple(values[0], values[1], values[2]))
            throw new IllegalArgumentException("No Markhofftripple!");
        this.values = Arrays.copyOf(values, values.length);
        Arrays.sort(this.values);
    }

    @Override
    public String toString() {
        return "[" + values[0] + ", " + values[1] + ", " + values[2] + "]";
    }
Java:
public static void main(String[] args) {
        Vector<MarkhoffTripple> tripples = new Vector<MarkhoffTripple>();
        tripples.add(new MarkhoffTripple());
        getMarkahoff(tripples, 0, 15);
        MarkhoffTripple[] t = new MarkhoffTripple[tripples.size()];
        t = tripples.toArray(t);
        Arrays.sort(t);
        int num = 0;
        for (MarkhoffTripple i : t) {
            System.out.println(++num + "\t" + i);
        }
    }

    private static void getMarkahoff(Vector<MarkhoffTripple> tripples, int pos, int max) {
        if (pos == max)
            return;
        MarkhoffTripple t = tripples.get(pos);
        MarkhoffTripple[] follows = t.getFollower();
        for (int i = 0; i < follows.length; i++) {
            if (tripples.size() < max)
                tripples.add(follows[i]);
        }
        pos++;
        getMarkahoff(tripples, pos, max);
    }
 
Oh, Mist, die Pyramide der Illuminaten; in Form eines Dreiecks... und ich denke mir die ganze Zeit, wie kommt der Markoff nur auf den Faktor 3?
 
Danke nochmals an euch alle :)
Das ist echt super Nett. Weiß auch nicht was gestern wieder los war.
Sitze jetzt 20 Minuten in der Mensa und hab es so hinbekommen mit der Quersumme ins Array zu schreiben:
Java:
public class MarkoffZwei {
    public static void main(String[] args) {
       
        int n=100;
        int quersumme=0;
        int[] a=new int[n];
        int pos=0;
        int tmp=pos;
        int i=0;
       
       
        for(int x=1;x<=n;x++)
            for(int y=1;y<=n;y++)
                for(int z=1;z<=n;z++)
                    if(x*x+y*y+z*z==3*x*y*z) {
                        quersumme=x+y+z;
                        tmp=pos;
                        i=0;
                        boolean u=true;
                        boolean abbruch=false;
                        while(!abbruch&&tmp>=0) {
                           
                            if(a[i]==0)
                                a[i]=quersumme;
                            if(a[i]!=quersumme) {
                                i++;
                                u=false;
                            }
                            if(a[i]==quersumme)
                                abbruch=true;
                            if(u)
                             i++;
                             tmp--;
                        }
                        pos++;
                    }
        for(int k=0;k<a.length;k++)
            System.out.println(a[k]);
    }

}
Nein es ist nicht schön aber es klappt die Quersummen stehen alleine in meinem Array drin =)
Natürlich fehlen dann noch das abgleichen der Markoff Zahlen das mache ich vielleicht nochmal später doch ich finde den ansatz mit der Method von dir Mihe7 besser ;)

Das ganze von Blender ist KLASSE nur sei mir bitte nicht böse doch ich verstehe das aller meiste davon nicht! :( Trozdem ein super Liebes Dank dafür =)
 
Passende Stellenanzeigen aus deiner Region:

Neue Themen

Oben