-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathack.py
85 lines (69 loc) · 1.61 KB
/
ack.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
import functools
import sys
sys.setrecursionlimit(100000)
mask = 0x7fff
mod = 0x8000
def blah(n, key):
if key == 0:
return n
res = 0
base = key+1
for i in range(n):
res = (res*base+1) & mask
return res
'''
elif m == 1:
return (key+n+1) & mask
elif m == 2:
return ((key+1)*(n+2)-1) & mask
elif m == 3:
return (key + (key+1)**2 + ((key+1)**3)*blah(n,key)) & mask
(1 + 4 + ((2)**3)*((2)**n - 8))
'''
@functools.lru_cache(maxsize=None)
def ackermann(m,n,key):
#print(m,n,key)
if m == 0:
return (n+1) & mask
elif m == 1:
return (key+n+1) & mask
elif m == 2:
return ((key+1)*(n+2)-1) & mask
elif m == 3:
return (key + (key+1)**2 + ((key+1)**3)*blah(n,key)) & mask
elif n == 0:
return ackermann(m-1, key, key)
return ackermann(m-1, ackermann(m, n-1, key), key)
'''
for n in range(20):
for key in range(20):
test = ((key+1)*(n+2)-1) & mask
res = ackermann(2, n, key)
print(n, key, test, res, res-test)
print()
'''
#for key in range(0x8000)[::-1][10:
# print(ackermann(4, 1, key))
'''
for key in range(10):#range(0x8000)[::-1]:
#print(i, ((i+1)*(123+2)-1) & mask, ackermann(2, 123, i))
#assert(((i+1)*(23+2)-1) & mask == ackermann(2, 23, i))
res = ackermann(4, 1, key)
print()
'''
for key in range(0x8000):
res = ackermann(4, 1, key)
#if key % 1000 == 0:
# print(key, res)
if res <= 10:
print("{} -> {}".format(key, res))
'''
n=0: 0
n=1: (key+1)**3
n=2: (key+2)*(key+1)**3
key=1: 8*(2^n-1)
0: key
1: (2^key - 1)/1
2: (3^key - 1)/2.
3: (4^key - 1)/3.
'''