Java Berechnungen

Crusade

Hack User
10 Dec 2015
288
61
#1


Momentan sehr langsame Lösung zu a)
(Max wert wird übergeben)
Bin mir sicher das geht schneller, weiß leider nur nicht wie.

Java:
public static String berechneTupel(long max) {
        for(long c=1;c<max;c++)
            for(long b=1;b<c;b++)
                for(long a=1;a<=b;a++)
                    if((a*a*a)+(b*b*b) == c*c)
                        System.out.println(+a+", "+b+", "+c);
        return" " + max;
    }
Edit: Lösung zu b:
Java:
 public static double berechneSnVonX (int n, double x){
        check(x>0, "Bitte x groeßer 0 wählen");
        check(n>0, "bitte n groeßer 0 wählen");

        double summe=0;
        double zwischensumme1= 0;
        double zwischensumme2= 0;

        for (int i = 1; i <= n; i++) {
            zwischensumme1 = Math.pow(x-1,i);
            zwischensumme2 = i*Math.pow(x,i);
            summe += zwischensumme1 / zwischensumme2;
        }
        return summe;
    }
Kritik und Verbesserungsvorschläge sind sehr willkommen
 
Last edited:

floezzzzzzzzzzzznnn

Real Advanced User
29 Nov 2014
128
265
#2
Zu a):
Edit: Meine Lösung war nicht ganz richtig, da sie dir nur Quadratzahlen für c liefert. Andere Version kommt später.

Zu b):
Das pow kannst du dir sparen, indem du (x - 1) und x außerhalb der Loop ablegst und damit jeden Durchlauf den Dividend bzw. den Divisor multiplizierst.
 
Last edited:
18 Jun 2015
584
752
#3
Zu a):
Substituiere (a, b, c) mit (xz, yz, z^2)
=> (xy)^3 + (yz)^3 = (z^2)^2
<=> z = x^3 + y^3 unter Annahme, dass z /= 0

Jetzt kannst du über x und y iterieren und z berechnen.

Zu b):
Das pow kannst du dir sparen, indem du (x - 1) und x außerhalb der Loop ablegst und damit jeden Durchlauf den Dividend bzw. den Divisor multiplizierst.
scheiß cheater
Ukulele Ukulele ist der echte java profi
 

Crusade

Hack User
10 Dec 2015
288
61
#5
Zu a):
Edit: Meine Lösung war nicht ganz richtig, da sie dir nur Quadratzahlen für c liefert. Andere Version kommt später.

Zu b):
Das pow kannst du dir sparen, indem du (x - 1) und x außerhalb der Loop ablegst und damit jeden Durchlauf den Dividend bzw. den Divisor multiplizierst.
zu a)
Performance :
für max 100k findet er 211 Trippel in 19 Millisekunden (geht wahrscheinlich noch schneller?!)
für max 200k : 292 Trippel in 44 Millisekunden
für max 1000k: 616 Trippel in 329 Millisekunden
Java:
   public static String berechneTrippel(long max) {
        check(max > 0, "bitte positive zahlen verwenden");
        long time1 = System.currentTimeMillis(); // speichern der start-time
        int i = 0;
        double c = 0;
        for (long b = 1; b < max; b++) {
            for (long a = 1; a <= b ; a++) {
                c = Math.sqrt(a*a*a + b*b*b);
                if (c>max) // exiten der schleife wenn das maximum erreicht ist!
                    break;
                if (Math.floor(c) == c) { // wenn c % 1 == 0.0 , beziehungsweise wenn c abgerundet == c ist trippel ausgeben!
                    System.out.println(+a + ", " + b + ", " + c);
                    i++; // "counter" für trippel erhöhen
                }
            }

        }
        long time2 = System.currentTimeMillis(); // speichern der end-time
        long duration = time2 - time1;           // berechnen der berechnungsdauer
        return "für das maximum : " + max + "  wurden  " + i +  " trippel gefunden!" +" dies hat: "+ duration + " Milisekunden gedauert";
    }
 
Last edited:

ZeCjy

Honorable
7 Jan 2015
3,543
2,503
#7
zu a)
Performance :
für max 100k findet er 211 Trippel in 19 Millisekunden (geht wahrscheinlich noch schneller?!)
für max 200k : 292 Trippel in 44 Millisekunden
für max 1000k: 616 Trippel in 329 Millisekunden
Java:
   public static String berechneTrippel(long max) {
        check(max > 0, "bitte positive zahlen verwenden");
        long time1 = System.currentTimeMillis(); // speichern der start-time
        int i = 0;
        double c = 0;
        for (long b = 1; b < max; b++) {
            for (long a = 1; a <= b ; a++) {
                c = Math.sqrt(a*a*a + b*b*b);
                if (c>max) // exiten der schleife wenn das maximum erreicht ist!
                    break;
                if (Math.floor(c) == c) { // wenn c % 1 == 0.0 , beziehungsweise wenn c abgerundet == c ist trippel ausgeben!
                    System.out.println(+a + ", " + b + ", " + c);
                    i++; // "counter" für trippel erhöhen
                }
            }

        }
        long time2 = System.currentTimeMillis(); // speichern der end-time
        long duration = time2 - time1;           // berechnen der berechnungsdauer
        return "für das maximum : " + max + "  wurden  " + i +  " trippel gefunden!" +" dies hat: "+ duration + " Milisekunden gedauert";
    }
Soweit ich weiß, ist die interne Zeitnahme für solche Zwecke doch Recht unzuverlässig? Wir hatten damals nen Tool was in Assembler geschrieben war und die Effizienz ermittelt hat.
 

Crusade

Hack User
10 Dec 2015
288
61
#8
Soweit ich weiß, ist die interne Zeitnahme für solche Zwecke doch Recht unzuverlässig? Wir hatten damals nen Tool was in Assembler geschrieben war und die Effizienz ermittelt hat.
Ja die Zeiterfassung hier dient nur für grobe vergleichswerte, da wir untereinander ein paar Richtwerte wollten. Komischer weise ist z.B der vergleich mit Math.floor(c) schneller als c mod 1 == 0.0 .Aber wie gesagt diese Zeiterfassung war nur eine Spielerei und nicht gefordert.
Wenn wir die Laufzeit gegen n angeben müssen, müssen wir die O-Notation (auch Landau-Notation) benutzen. Hab's nicht näher überprüft aber würde bei diesem code auf irgendwas um die O(n logn) als Laufzeit tippen?
 
Likes: ShynoX

Sephirot

Well-Known Member
2 Jun 2015
1,408
1,191
#9
Soweit ich weiß, ist die interne Zeitnahme für solche Zwecke doch Recht unzuverlässig? Wir hatten damals nen Tool was in Assembler geschrieben war und die Effizienz ermittelt hat.
Und was hat das Programm gemessen bzw. welche Faktoren wurden berücksichtigt?
 

ZeCjy

Honorable
7 Jan 2015
3,543
2,503
#10
Und was hat das Programm gemessen bzw. welche Faktoren wurden berücksichtigt?
Wir sollten gucken dass die CPU Auslastung gleich null ist und das Programm hat wohl Start und termination gemessen
 
Likes: Logxn

Sephirot

Well-Known Member
2 Jun 2015
1,408
1,191
#11
Wir sollten gucken dass die CPU Auslastung gleich null ist und das Programm hat wohl Start und termination gemessen
Wird dann wirklich gezielt ein Programm gemessen oder das ganze System? Wie dereferenzierst du, dass dein aktuelles Programm für die Auslastung zuständig ist?
 

ZeCjy

Honorable
7 Jan 2015
3,543
2,503
#12
Wird dann wirklich gezielt ein Programm gemessen oder das ganze System? Wie dereferenzierst du, dass dein aktuelles Programm für die Auslastung zuständig ist?
Keine Ahnung was das Tool gemacht hat.
Lehrer kam an, meinte Java ist zum Messen kacke. Hier ASM Tool misst wielange braucht macht alle Programme 10 Mal und macht Tabelle.