Lösungen einer Diophantische Gleichung in N

Neue Frage »

lostgeek Auf diesen Beitrag antworten »
Lösungen einer Diophantische Gleichung in N
Hi,

Ich hänge gerade bei Problem 108 bei Project Euler.

Es geht um folgende Diophantische Gleichung:



Gesucht ist das n, bei dem die Anzahl der Lösungen das erste Mal über 1000 steigt.

Ich habe nach y aufgelöst und kam auf

Ich habe gemerkt, dass y für gegen n konvergiert.

Also dacht ich mir, dass ich für x, anfangend bei n+1, soweit Werte einsetzen muss, bis , weil es danach keine ganzzahligen y Werte mehr geben kann.

Wenn ich für n = 1260 die Anzahl der Lösungen berechne komme ich auf 108 Lösungen.
Bei Aufgabe 110 steht aber (zur selben Gleichung): "It can be verified that when n = 1260 there are 113 distinct solutions"
Seht ihr den Fehler?

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
double y = n+1; // Um die Anfangsbedingung der For-Schleife zu erfüllen.
for(double x = n+1; y >= n+1 ; x++) {
  y = x/((x/n)-1);
  if(y == (int)y) {
    count++;
  }
}
AD Auf diesen Beitrag antworten »

Umgestellt bedeutet diese Gleichung , für heißt das dann

,

diese Gleichung hat genau ganzzahlige Lösungen . Abzüglich der Lösung , die ja keine Lösung der Ausgangsgleichung ist, macht das genau 449 Lösungen von

.

Betrachtet man nun nur geordnete Lösungen mit O.B.d.A. , so bleiben davon immer noch 225 Lösungen übrig.

Oder interessieren dich nur positive Lösungen? In dem Fall wären die Anzahl Lösungen richtig.


P.S.: Dein Programm ist wegen numerischer Instabilitäten höchst fragwürdig. Vermutlich deswegen entgehen dir ein paar Lösungen. Schreib es mal um, dass alles rein auf Integerbasis handhabbar ist!
lostgeek Auf diesen Beitrag antworten »

Ich schätze ich bin auf ein Thema gestoßen, was sehr viel schwerer ist, als ich dachte.
Ich kann dir in so ziemlich keinem der Schritte wirklich folgen.

Gibt es vielleicht irgendetwas, das man sich dazu durchlesen könnte? Durch Google bin ich leider auf nichts Verständliches gestoßen.

Ich werde mich morgen/heute noch einmal stärker damit beschäftigen. Mir fallen gerade die Augen zu.
AD Auf diesen Beitrag antworten »

Dann heißt das ziemlich sicher, dass du noch nicht reif bist für das Nachfolgeproblem 110. Wie dort richtig steht, kommt man da mit einfachem Bruteforce (wie es dein Programm darstellt) nicht sehr weit - da wirst du schon meine Schritte nachvollziehen müssen, wenn du da weiterkommen willst.

Dreh- und Angelpunkt bei der Bestimmung der Anzahl der Lösungen ist die Anzahl der der positiven Teiler von , dabei ist die sogenannte Teileranzahlfunktion:

Denn jedem Teiler von kann man über die Produktdarstellung die Lösung



zuordnen, und umgekehrt (!).
lostgeek Auf diesen Beitrag antworten »

Selber könnte ich die Schritte zwar nicht machen, aber ich kann sie jetzt nachvollziehen.
Ich muss nur noch einen guten Algorithmus für die Primfaktorzerlegung implementieren, um die Teileranzahlfunktion ausführen zu können. Die stupide Methode braucht zu viel Rechenzeit.

Danke dir smile
AD Auf diesen Beitrag antworten »

Zitat:
Original von lostgeek
Ich muss nur noch einen guten Algorithmus für die Primfaktorzerlegung implementieren, um die Teileranzahlfunktion ausführen zu können.

Ich wüsste jetzt nicht, wozu dieser Algorithmus konkret beim vorliegenden Problem nützlich sein könnte. Generell kriegt man nämlich folgendes schnell raus:


Sucht man zu gegegebenen, festen Wert die kleinste positive ganze Zahl mit , dann besitzt dieses die Gestalt



mit , wobei die Folge aller Primzahlen ist, also beginnend mit .


Der Nachweis ist sehr einfach, denn die Annahme für irgendein Paar führt zum Widerspruch der Minimalität, da dann für die durch Austausch der Exponenten kleinere Zahl



ebenfalls gelten würde.


Du kannst dich also bei der Suche auf Zahlen der Form (*) beschränken, was den Suchraum erheblich eingrenzt. Selbstverständlich weist die genannte Zahl 1260 auch diese Eigenschaft auf:

.
 
 
lostgeek Auf diesen Beitrag antworten »

Die Fragestellung lautet: "What is the least value of n for which the number of distinct solutions exceeds one-thousand?"

Sprich es wird das n gesucht, wo t zum ersten mal über 1000 liegt.

Deine Form (*) gilt aber nur für ein festes t, was hier aber nicht gegeben ist.

Soweit ich es verstanden hab, suche ich nämlich nach dem kleinsten positiven n mit und .

Und wenn ist, kann bei
sein, oder vertue ich mich da?
AD Auf diesen Beitrag antworten »

Zitat:
Original von lostgeek
Deine Form (*) gilt aber nur für ein festes t, was hier aber nicht gegeben ist.

Denk nochmal genauer nach, ob das nicht auch für deine Fragestellung von Belang ist. Forum Kloppe
lostgeek Auf diesen Beitrag antworten »

Wenn ich z.B. nach mehr als 3 Lösungen suche, dann such ich erstmal für t = 4 und komme auf n = 8. Aber bei t = 5 ist n = 6, sprich bei t = 5 ist das n niedriger als bei t = 4.
Und könnte es nicht sein, dass ich bei t = 6 vielleicht sogar etwas noch niedrigeres finde?

Mein Problem ist, dass ich nicht sagen kann, ab wo an das Erhöhen von t zum Finden von niedrigerem n sinnlos wird.
tmo Auf diesen Beitrag antworten »

Ich habe das Problem gelöst, indem ich einfach mal mit angefangen habe und dann immer überlegt habe, ob es nun besser ist die nächste Primzahl dranzuhängen oder ob man vorne einen Exponenten erhöhen sollte.

Dabei auch beachten, dass es um und nicht um geht.
AD Auf diesen Beitrag antworten »

Zitat:
Original von lostgeek
Soweit ich es verstanden hab, suche ich nämlich nach dem kleinsten positiven n mit und .

Richtig - nennen wir den zu diesem minimalen zugehörigen Wert . Die Annahme, dass nicht die Form (*) hat, führt auch wie oben zum Widerspruch!!!
lostgeek Auf diesen Beitrag antworten »

Zitat:
Original von Arthur Dent
Die Annahme, dass nicht die Form (*) hat, führt auch wie oben zum Widerspruch!!!


Ok stimmt. Meine Formulierung war falsch. Mein Problem ist das, was ich vor ein paar Posts geschrieben habe.
AD Auf diesen Beitrag antworten »

Eben: Kein Mensch behauptet, dass die Folge der zu gehörigen minimalen mit monoton bzgl. ist - das ist tatsächlich falsch. Aber darum geht es hier doch gar nicht. unglücklich


EDIT: Ein Nachtrag noch zu

code:
1:
2:
3:
4:
5:
6:
7:
8:
double y = n+1; // Um die Anfangsbedingung der For-Schleife zu erfüllen.
for(double x = n+1; y >= n+1 ; x++) {
  y = x/((x/n)-1);
  if(y == (int)y) {
    count++;
  }
}


Da erhalte ich (mit MS Visual Express 2008) auch den Wert 108. Die mathematisch äquivalente, aber numerisch robustere Integervariante

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
int y = n+1; // Um die Anfangsbedingung der For-Schleife zu erfüllen.
for (int x = n+1; y >= n+1 ; x++) {
  double fy = (double)x/(((double)x/(double)n)-1.0);
  int y = (int)(fy+0.5);
  if (x*y == n*(x+y))
  {
    count++;
  }
}


liefert den tatsächlichen richtigen Wert 225. Dir sind durch die numerische Schlamperei also sage und schreibe 117 Lösungen verlorengegangen. Augenzwinkern
lostgeek Auf diesen Beitrag antworten »

Zitat:
Original von Arthur Dent
Da erhalte ich (mit MS Visual Express 2008) auch den Wert 108. Die mathematisch äquivalente, aber numerisch robustere Integervariante

liefert den tatsächlichen richtigen Wert 225. Dir sind durch die numerische Schlamperei also sage und schreibe 117 Lösungen verlorengegangen. Augenzwinkern


Hui. Da hast du wohl recht. Dauert trotzdem eine halbe Ewigkeit, bis der mal die t > 100 findet. Geschweige denn die t > 1000 in der Aufgabe.

(Und eigentlich war das Java und kein C#. Scheint aber fast 1:1 der selbe Code zu sein.)

Zitat:
Original von tmo
Ich habe das Problem gelöst, indem ich einfach mal mit angefangen habe und dann immer überlegt habe, ob es nun besser ist die nächste Primzahl dranzuhängen oder ob man vorne einen Exponenten erhöhen sollte.

Dabei auch beachten, dass es um und nicht um geht.


Ich hab das mal bis zu dem Punkt in Code gegossen, wo man die Entscheidung treffen muss.

Die Frage ist nur, was man da als sicheren Indikator nehmen kann, welche Entscheidung die richtige ist. Ich konnte keinen finden.
AD Auf diesen Beitrag antworten »

Zitat:
Original von tmo
Ich habe das Problem gelöst, indem ich einfach mal mit angefangen habe und dann immer überlegt habe, ob es nun besser ist die nächste Primzahl dranzuhängen oder ob man vorne einen Exponenten erhöhen sollte.

Genau hast du hier aber nicht erklärt, welchen Exponenten du nun genau erhöhst in jedem Schritt. Und ob man auf diese Weise immer für jede vorgebene untere Schranke das kleinste mit findet, wage ich zu bezweifeln.


Ich kann mir gut vorstellen, dass deine iterierten die Eigenschaft

für alle

erfüllen, aber das ist nicht genug für die vorliegende Problemstellung.
tmo Auf diesen Beitrag antworten »

Zitat:
Original von Arthur Dent
Und ob man auf diese Weise immer für jede vorgebene untere Schranke das kleinste mit findet, wage ich zu bezweifeln.

Ich auch, aber bei der Aufgabe hat es geklappt Augenzwinkern
lostgeek Auf diesen Beitrag antworten »

Zitat:
Original von tmo
Ich auch, aber bei der Aufgabe hat es geklappt Augenzwinkern


Schummler! Big Laugh


Mir ist aber auch kein Algorithmus eingefallen, mit dem ich 100%ig sicher das kleinste n finden kann und unter Jahrzehnten an Laufzeit bleiben kann.

Ich werde einfach mal für die niedrigstmöglichen n suchen. Ich denk das sollte dann auch relativ sicher das niedrigste sein.
AD Auf diesen Beitrag antworten »

@tmo

Ich lass mal nicht locker, da du die genaue Vorgehensweise bei der Auswahl des nächsten Exponenten nach wie vor im Dunkeln gelassen hast:

Was ergibt dein Verfahren beispielsweise für ? Oder falls dir das zu groß ist, für ?

(Ich will nur ein wenig von den Werten bzw. aus diesem Projekt Euler fernbleiben, um lostgeek nicht zuviel zu verraten. Big Laugh )

Wohlgemerkt, es geht nur um positiven Lösungen mit o.B.d.A. , oder anders gesprochen: ungeordnete Paare, der Symmetrie des Problems wegen.


EDIT: Sorry, meinte natürlich L statt n - korrigiert.
tmo Auf diesen Beitrag antworten »

Einen präzisen Algorithmus dazu habe ich nicht.

Ich habe mir einfach überlegt, dass man die Teileranzahl von

- mit 3 multipliziert, wenn man einen neuen Primfaktor dranhängt
- mit 5/3 multipliziert, wenn man aus einer 1 im Exponent eine 2 macht.
etc...

Für L = 2000 hat das wunderbar geklappt (einfach mal gucken wie man nur mit 3en und 5en schnell auf über 2000 kommt), ich habe aber nie behauptet, dass es für höhere L auch klappt.
AD Auf diesen Beitrag antworten »

Ich will dir ja auch nicht den Kopf abreißen. Augenzwinkern

Sondern nur einen Vergleichswert haben, um meinen schnell zusammengehauenen Bruteforce-Algorithmus zu prüfen. Natürlich Bruteforce im Bereich der oben eingegrenzten Zahlen.
Airblader Auf diesen Beitrag antworten »

Ich habe hier mal ein paar spontane Überlegungen. Wäre nett, wenn die jemand überprüft, da sie, wie gesagt, sehr spontan waren und ich grade mal weg muss Augenzwinkern








Für welche x(n) ist n/x also ein Bruch mit abbrechender Dezimaldarstellung (denn nur dann ist der Zähler ein Vielfaches vom Nenner und y damit ganzzahlig)?
bzw. anders formuliert:
Für welche ganze k ist 1/k ein Bruch mit abbrechender Dezimaldarstellung (wenn man x(n) in Vielfachen k von n angibt)?

Genau dann, wenn k sich nicht ausschließlich durch die Primfaktoren 2 und 5 erzeugen lässt. Kommt also in der Primfaktorzerlegung von k eine Primzahl ungleich 2 und 5 raus, so kann man diesen x-Wert als Lösung vergessen.

Und noch besser: Kommen nur 2 und 5 raus, so ist dieser x-Wert eine Lösung und nach obiger Gleichung errechnet sich direkt y.


air
AD Auf diesen Beitrag antworten »

Ich kann den meisten Schlüssen deiner Logik nicht folgen, z.B. dem nicht: unglücklich

Zitat:
Original von Airblader
Für welche x(n) ist n/x also ein Bruch mit abbrechender Dezimaldarstellung (denn nur dann ist der Zähler ein Vielfaches vom Nenner und y damit ganzzahlig)?

Oder das:

Zitat:
Original von Airblader
Genau dann, wenn k sich nicht ausschließlich durch die Primfaktoren 2 und 5 erzeugen lässt. Kommt also in der Primfaktorzerlegung von k eine Primzahl ungleich 2 und 5 raus, so kann man diesen x-Wert als Lösung vergessen.

Und wenn du die Gleichung im Hexadezimalsystem betrachtest, bekommst du andere Kriterien? Kann schon von daher nicht stimmen.
Airblader Auf diesen Beitrag antworten »

Zitat:
Original von Arthur Dent
Ich kann den meisten Schlüssen deiner Logik nicht folgen, z.B. dem nicht: unglücklich

Zitat:
Original von Airblader
Für welche x(n) ist n/x also ein Bruch mit abbrechender Dezimaldarstellung (denn nur dann ist der Zähler ein Vielfaches vom Nenner und y damit ganzzahlig)?


Hm. Stimmt. Da habe ich wohl viel zu schnell und zu falsch gedacht. Naja, es war ja auch nur ein spontaner Gedanke Augenzwinkern

Zitat:
Oder das:

Zitat:
Original von Airblader
Genau dann, wenn k sich nicht ausschließlich durch die Primfaktoren 2 und 5 erzeugen lässt. Kommt also in der Primfaktorzerlegung von k eine Primzahl ungleich 2 und 5 raus, so kann man diesen x-Wert als Lösung vergessen.

Und wenn du die Gleichung im Hexadezimalsystem betrachtest, bekommst du andere Kriterien? Kann schon von daher nicht stimmen.


Das interessiert mich nun aber. Ich habe das in der Eile mal schlicht von wikipedia übernommen: http://de.wikipedia.org/wiki/Dezimalsystem#Periode
Zweiter Satz nach den Beispielen.

air
AD Auf diesen Beitrag antworten »

Zitat:
Original von Airblader
Ich habe das in der Eile mal schlicht von wikipedia übernommen: http://de.wikipedia.org/wiki/Dezimalsystem#Periode

Das bezweifle ich gar nicht. Nur: Was hat das Dezimalsystem mit den Lösungen von



zu tun? Nichts.
Airblader Auf diesen Beitrag antworten »

Ja, das mag natürlich sein, weil meine vorausgehende Überlegung schon Unsinn war. Ich dachte nur, das 'Argument' sei an und für sich schon falsch.

Einfach nicht mein Tag heute. Erst will ich was bauen und mir fehlt sämtliches Werkzeug und dann das. böse Augenzwinkern
air
AD Auf diesen Beitrag antworten »

Naja, selbstverständlich ist es keine Pflicht, so wie hier an die Sache ranzugehen. Aber wie auch immer man vorgeht, am Ende müssen natürlich dieselben Lösungen



herauskommen, wobei die positiven Teiler von durchläuft.
Airblader Auf diesen Beitrag antworten »

Ich hatte das Thema bisher, um ehrlich zu sein, gar nicht wirklich detailliert verfolgt Augenzwinkern

air
tmo Auf diesen Beitrag antworten »

Nur um kurz zu sagen, wie ich an die Sache rangegangen bin:

Zitat:
Original von Airblader



Ab hier hab ich jetzt Polynomdivision gemacht. Dann erkennt man auch schnell, dass es um die Teiler von geht.
AD Auf diesen Beitrag antworten »

Aber leider keine Antwort auf

Zitat:
Original von Arthur Dent
Was ergibt dein Verfahren beispielsweise für ? Oder falls dir das zu groß ist, für ?

Dann muss ich wohl mal vorlegen: Es ist



mit , sowie



mit . Wäre interessant zu erfahren, ob dein einfacheres, heuristisches Verfahren diese Minima erfasst, oder doch zumindest "suboptimal" nicht so weit weg ist.
Neue Frage »
Antworten »



Verwandte Themen

Die Beliebtesten »
Die Größten »
Die Neuesten »