[Python-de] [Python vs. C] 3n+1-Problem

Jens Kubieziel python at kubieziel.de
Die Feb 10 17:42:03 CET 2004


Hallo,

ich habe mir kürzlich diverse Programmieraufgaben der Universidad da
Valladolid (http://acm.uva.es) angeschaut und u.a auch
http://acm.uva.es/p/v1/100.html.

Hierbei wird das 3n+1-Problem (teile eine Zahl solange durch zwei, wenn
sie gerade ist oder, falls nicht, multipliziere mit drei und addiere
eins, bis man eins erreicht.) vorausgesetzt. Wenn z.B. 3 eingegeben
wird, entsteht die Folge: 3 10 5 16 8 4 2 1. Aufgabe ist nun, in einem
einzugebenden Intervall die Anzahl aller Folgenglieder (im obigen Bsp.
8) zu errechnen und auszugeben.

Dies habe ich zunächst mit folgendem Brute-Force-Ansatz probiert:

#v+
i = int(raw_input("Please enter the lower boundary: "))
j = int(raw_input("Please enter the upper boundary: "))

total_rounds = []

print i,j,
for number in range(i,j+1):
  rounds = 1
  
  while number>1:
    if number % 2 == 0:
      number = number/2
      rounds = rounds+1
    else:
      number = 3*number+1
      rounds = rounds+1
  total_rounds.append(rounds)
  total_rounds.sort()
print total_rounds[len(total_rounds)-1]
#v-

Wenn hier nun spasseshalber alle Zahlen von 1 bis zur in der Aufgabe
gegebenen Obergrenze von 1.000.000 berechnen lasse, dauert das auf
meinem Rechner (AMD Athlon 1 GHz) etwas über 20 Stunden. Das Äquivalent
in C hingegen:

#v+
#include <stdio.h>
#include <stdlib.h>

#define MAX 1000000

int main(void)
{
   int i, max=0, imax;
   
   for (i=1; i <= MAX; ++i) {
      register long long z=i;
      register int cnt=1;
      while (z != 1) {
	 if (z % 2 == 0)
	   z /= 2;
	 else
	   z = 3*z+1;
	 
	 ++cnt;
      }
      
      if (cnt > max) {
	 max = cnt;
	 imax = i;
      }
   }
   
   printf("Max bei %d mit %d Schritten\n", imax, max);
   
   return EXIT_SUCCESS;
}
#v-

benötigt für selbigen Durchlauf nur 2-3 Sekunden.

Bis auf die fehlenden Eingaberoutinen im C-Programm sind beide Programme
IMHO äquivalent (Meine ich zumindest). Wo könnte hier das Problem
liegen, dass die Python-Variante derart langsamer ist?
-- 
Jens Kubieziel                                  http://www.kubieziel.de