Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Download
2188 views
1
'''
2
This file assumes that the conjecturing spkg is installed and that 'conjecturing.py' and
3
'matrixtheory.py' are loaded.
4
'''
5
6
def automatedGraphSearch(objects, invariants, minimumSize, maximumSize, upperBound=True, steps=10, mainInvariant=1, verbose=False):
7
if verbose:
8
print("Starting with these objects:")
9
for m in objects:
10
print(" {}".format(m.rows()))
11
print("")
12
print("Available invariants:")
13
for pos, invariant in enumerate(invariants):
14
if type(invariant) == tuple:
15
name, _ = invariant
16
elif hasattr(invariant, '__name__'):
17
name = invariant.__name__
18
else:
19
name = 'invariant_{}'.format(pos)
20
if pos + 1 == mainInvariant:
21
print(" * {}".format(name))
22
else:
23
print(" {}".format(name))
24
print("")
25
for _ in range(steps):
26
l = conjecture(objects, invariants, mainInvariant, upperBound=upperBound)
27
if verbose:
28
print("Found the following conjectures:")
29
for c in l:
30
print(" {}".format(c))
31
print("")
32
noCounterExample = True
33
for i in range(minimumSize, maximumSize+1):
34
if verbose:
35
print("Looking for counterexamples of size {}".format(i))
36
for m in generateSymmetricMatrices(i):
37
try:
38
if any([not c.evaluate(m) for c in l]):
39
print("Adding {}".format(m.rows()))
40
objects.append(m)
41
noCounterExample = False
42
break
43
except:
44
print("Error while checking {}".format(m.rows()))
45
raise
46
if not noCounterExample: break
47
if noCounterExample:
48
print("No counterexample found")
49
break
50
if not noCounterExample:
51
l = conjecture(objects, invariants, mainInvariant, upperBound=upperBound)
52
if verbose:
53
print("Found the following conjectures:")
54
for c in l:
55
print(" {}".format(c))
56
print("")
57
return l
58
59
def inverseTriangularNumber(t):
60
n = int(sqrt(2*t))
61
assert n*(n+1)==2*t, "Not a triangular number: {}".format(t)
62
return n
63
64
65
def symmetricMatrixFromList(l):
66
n = inverseTriangularNumber(len(l))
67
m = [None] * n
68
end = 0
69
for i in range(n):
70
start = end
71
end += n - i
72
m[i] = [m[j][i] for j in range(i)] + l[start:end]
73
return matrix(m)
74
75
def int2base21(i, length):
76
if not i: return [0] * int(length)
77
l = []
78
while i:
79
l.append(i%21)
80
i//=21
81
l += [0]* (int(length)-len(l))
82
return l
83
84
def generateSymmetricMatrices(size):
85
length = ((size+1)*size/2)
86
count = 21**length
87
i = 0
88
while i < count:
89
yield symmetricMatrixFromList([n-10 for n in int2base21(i, length)])
90
i+=1
91
92
objects = [matrix([[1,1],[1,1]])]
93
94
mainInvariant = invariants.index(determinant)
95
96
conjectures = automatedGraphSearch(objects, invariants, 2, 4, upperBound=False, steps=100, verbose=True, mainInvariant=mainInvariant)
97
98
print("The conjectures are stored in the variable conjectures.")
99
100