codon/bench/fannkuch/fannkuch.py

46 lines
770 B
Python

# FANNKUCH benchmark
from math import factorial as fact
from sys import argv
from time import time
def perm(n, i):
p = [0] * n
for k in range(n):
f = fact(n - 1 - k)
p[k] = i // f
i = i % f
for k in range(n - 1, -1, -1):
for j in range(k - 1, -1, -1):
if p[j] <= p[k]:
p[k] += 1
return p
n = int(argv[1])
max_flips = 0
t0 = time()
for idx in range(fact(n)):
p = perm(n, idx)
flips = 0
k = p[0]
while k:
i = 0
j = k
while i < j:
p[i], p[j] = p[j], p[i]
i += 1
j -= 1
k = p[0]
flips += 1
max_flips = max(flips, max_flips)
print(f'Pfannkuchen({n}) = {max_flips}')
t1 = time()
print(t1 - t0)