Seite 1 von 1
Project Euler 21
Verfasst: Donnerstag 12. November 2009, 20:19
von nemomuk
Hallo,
habe gerade aus Langeweile versucht Problem 21 von Project Euler zu lösen:
Code: Alles auswählen
total = 0
for i in xrange(1, 10000):
result = sum([j for j in xrange(1, i/2+1) if i % j == 0])
if sum([j for j in xrange(1, result/2+1) if result % j == 0]) == i:
total += i
print total
Irgendwie stehe ich gerade auf dem Schlauch oder habe das Problem falsch verstanden... auf jeden Fall kommt nicht das raus, was raus kommen soll.
Kann mir da jemand einen "Tipp" geben...?^^
Verfasst: Donnerstag 12. November 2009, 20:38
von BlackJack
@SchneiderWeisse: Du hast den selben Fehler gemacht, wie jemand anders, der das Thema hier im Forum schon einmal gebracht hat. → Suchfunktion.
Verfasst: Donnerstag 12. November 2009, 21:04
von ms4py
Meine Tipps:
- die Funktion d(n) cachen
- itertools.combinations verwenden
Hab damit ca. 30s gebraucht.
Verfasst: Donnerstag 12. November 2009, 21:21
von nemomuk
Danke @ BlackJack... hatte ich übersehen.
@ice2k3: Erstens geht es mir nicht um Performance, solange es nicht zu lange dauert und zweitens braucht meine Version 8s... (dennoch danke für die Tipps, auch wenn mir itertools durchaus bekannt sind)
Verfasst: Donnerstag 12. November 2009, 21:25
von BlackJack
@SchneiderWeisse: Das kommt ganz auf den Rechner an. Schau Dir in dem anderen Thread mal die Zeiten an, die ich auf dem C64 in BASIC mit so einem naiven Ansatz gebraucht habe.

Verfasst: Donnerstag 12. November 2009, 21:49
von ms4py
``combinations`` ist in diesem Fall natürlich voll der overload...
Hatte irgendwie einen Denkfehler
(Komm jetzt auf 3s

)
Verfasst: Donnerstag 12. November 2009, 23:03
von BlackJack
Booah dauert das lange. 0.125 s sinds bei mir. Dabei habe ich jetzt die C64-BASIC-Lösung wieder nach Python rückübersetzt.
Tipp: Man muss die "teuren" Operationen wie Division eliminieren. Der ganze Code macht nur noch eine einzige (insgesamt!) davon. Und das auch noch durch 2, dass heisst bei einer "nativ" kompilierten Sprache könnte der Compiler das sogar zu einer Shift-Operation optimieren. Bzw. sogar schon zur Übersetzungszeit ausrechnen.
Verfasst: Freitag 13. November 2009, 06:03
von nemomuk
Ja, ich hatte den Thread gesehen, vllt. versuch ich mich auch an einer Rückübersetzung deiner Lösung, aber da müsste mir schon sehr langweilig sein...

Verfasst: Freitag 13. November 2009, 08:51
von BlackJack
@SchneiderWeisse: Das wird nicht soviel bringen, denn in dem
anderen Thread steht ja noch die langsame, naive Variante, die auf dem C64 3h 40m gebraucht hat, und nicht die "schnelle", die "nur" 15½ Minuten braucht.

Im letzten Beitrag dort von mir ist ein Hinweis, wie die Lösung aussieht.
Hab das mal nach C portiert, da braucht der C64 jetzt nur noch 14 Sekunden.
Verfasst: Freitag 13. November 2009, 13:52
von pillmuncher
BlackJack hat geschrieben:Booah dauert das lange. 0.125 s sinds bei mir.
Danke für den Hinweis mit der Division, dadurch sind es jetzt 0.050 s bei mir

. Vorher dauerte es 6.5 mal so lang. Erst hab ich ja nicht so recht gewusst, was du meinst, aber dann

ist mir dieses Gedicht unbekannten Ursprungs wieder eingefallen:
Sieve the twos and sieve the threes -
The sieve of Eratosthenes!
When the multiples sublime
The numbers which remain are prime!
Ich wusste nicht mehr ganz genau wie es geht, deswegen hab ich es gegoogelt und dabei noch dies hier gefunden:
I've factored large numbers,
I've factored small,
Sooner or later,
I'll factor them all.
-- Scott Contini
Gruß,
Mick.
Verfasst: Freitag 13. November 2009, 13:56
von Hyperion
Oha... Mathe-Lyric - ist ja grauenvoll

Verfasst: Freitag 13. November 2009, 14:23
von numerix
Falls jemand weiterhin das Bedürfnis verspürt, sich mit der Berechnung von Teilersummen zu beschäftigen und dabei Wert auf gute Laufzeit legt, kann er sich hiermit vergnügen (und messen ....):
Nicht so schwer:
https://www.spoj.pl/problems/DIVSUM/
Nicht so einfach:
https://www.spoj.pl/problems/DIVSUM2/
Verfasst: Freitag 13. November 2009, 15:31
von pillmuncher
Hyperion hat geschrieben:Oha... Mathe-Lyric - ist ja grauenvoll

Und das erst:
http://www.trurl.net/gedicht.html

Gruß,
Mick.
Verfasst: Freitag 13. November 2009, 15:57
von nemomuk
Komme mit meiner Lösung auf 0.07 Sekunden, die an BlackJacks Lösung angelehnt ist...
Verfasst: Freitag 13. November 2009, 18:51
von pillmuncher
Meine braucht bei mir 0.047 s. (Python 2.6.4, WinXP, Intel T6570 2.1GHz, 3GB RAM)
Vielleicht sollten wir die Lösungen morgen wieder löschen, damit wir niemanden um den Spaß bringen, es selbst heraus zu knobeln?
Gruß.
Mick.
*edit*
hab's gelöscht.
Verfasst: Samstag 14. November 2009, 08:53
von nemomuk
Ich habe meine Lösung mal wieder raus...
Re: Project Euler 21
Verfasst: Donnerstag 13. Mai 2010, 23:22
von pillmuncher
Das ist meine beste Lösung, ca. 13 msec:
Code: Alles auswählen
def amicable_pairs(n):
"""snip"""
import itertools
flatten = itertools.chain.from_iterable
def test(n):
return sum(flatten(amicable_pairs(n)))
print test(10000)
Wollte die schon vor 6 Monaten posten, war aber verhindert.
Sonntag lösch ich sie wieder.
[edit]done[/edit]