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 OverflowError:
44
print("OverflowError: skipping {}".format(m.rows()))
45
continue
46
except:
47
print("Error while checking {}".format(m.rows()))
48
raise
49
if not noCounterExample: break
50
if noCounterExample:
51
print("No counterexample found")
52
break
53
if not noCounterExample:
54
l = conjecture(objects, invariants, mainInvariant, upperBound=upperBound)
55
if verbose:
56
print("Found the following conjectures:")
57
for c in l:
58
print(" {}".format(c))
59
print("")
60
return l
61
62
def inverseTriangularNumber(t):
63
n = int(sqrt(2*t))
64
assert n*(n+1)==2*t, "Not a triangular number: {}".format(t)
65
return n
66
67
68
def symmetricMatrixFromList(l):
69
n = inverseTriangularNumber(len(l))
70
m = [None] * n
71
end = 0
72
for i in range(n):
73
start = end
74
end += n - i
75
m[i] = [m[j][i] for j in range(i)] + l[start:end]
76
return matrix(m)
77
78
def int2base21(i, length):
79
if not i: return [0] * int(length)
80
l = []
81
while i:
82
l.append(i%21)
83
i//=21
84
l += [0]* (int(length)-len(l))
85
return l
86
87
def generateSymmetricMatrices(size):
88
length = ((size+1)*size/2)
89
count = 21**length
90
i = 0
91
while i < count:
92
yield symmetricMatrixFromList([n-10 for n in int2base21(i, length)])
93
i+=1
94
95
objects = [matrix([[1,1],[1,1]]), matrix([[-1,1,1],[1,-1,1],[1,1,-1]])]
96
97
mainInvariant = invariants.index(determinant)
98
99
conjectures = automatedGraphSearch(objects, invariants, 2, 4, steps=100, verbose=True, mainInvariant=mainInvariant)
100
101
print("The conjectures are stored in the variable conjectures.")
102
103