diff --git a/cable_signature.sage b/cable_signature.sage index c4f46ad..ffefb2d 100644 --- a/cable_signature.sage +++ b/cable_signature.sage @@ -14,11 +14,16 @@ class SignatureFunction(object): def __init__(self, values=None, counter=None): # set values of signature jumps if counter is None: + counter = collections.Counter() + if values is None: values = [] - assert all(x < 1 for x, y in values),\ - "Signature function is defined on the interval [0, 1)." - counter = collections.Counter(dict(values)) + + msg = "Signature function is defined on the interval [0, 1)." + assert all(k < 1 for k, v in values), msg + + for k, v in values: + counter[k] += v self.cnt_signature_jumps = counter def sum_of_absolute_values(self): @@ -31,15 +36,16 @@ class SignatureFunction(object): # to read values for t^2 new_data = [] for jump_arg, jump in self.cnt_signature_jumps.items(): - new_data.append((jump_arg/2, jump)) - new_data.append((1/2 + jump_arg/2, jump)) + if jump != 0: + new_data.append((jump_arg/2, jump)) + new_data.append((1/2 + jump_arg/2, jump)) return SignatureFunction(values=new_data) def square_root(self): # to read values for t^(1/2) new_data = [] for jump_arg, jump in self.cnt_signature_jumps.items(): - if jump_arg < 1/2: + if jump_arg < 1/2 and jump != 0: new_data.append((2 * jump_arg, jump)) return SignatureFunction(values=new_data) @@ -47,16 +53,22 @@ class SignatureFunction(object): # to read values for t^(1/2) counter = collections.Counter() for jump_arg, jump in self.cnt_signature_jumps.items(): - if jump_arg >= 1/2: + if jump_arg >= 1/2 and jump != 0: counter[mod_one(2 * jump_arg)] = jump return SignatureFunction(counter=counter) def is_big(self): max = 0 - items = self.cnt_signature_jumps.items() - for arg, _ in items: - # current = sum([jump for jump_arg, jump in items if jump_arg <= arg]) - current = self(arg) + current = 0 + items = sorted(self.cnt_signature_jumps.items()) + for arg, jump in items: + current += 2 * jump + msg = "current = " + str(current) + ", jump = " + str(jump) + msg += "\n" + str(self(arg)) + result = [jump for jump_arg, jump in self.cnt_signature_jumps.items() if jump_arg < mod_one(arg)] + msg += "\nresult = " + str(sum(result)) + msg += "\narg = " + str(arg) + assert current == self(arg) + jump, msg if abs(current) > abs(max): max = current # if abs(max) > 9: @@ -68,7 +80,12 @@ class SignatureFunction(object): new_data = [] for jump_arg, jump in self.cnt_signature_jumps.items(): new_data.append((mod_one(jump_arg + shift), jump)) - return SignatureFunction(values=new_data) + sf = SignatureFunction(values=new_data) + counter = collections.Counter({mod_one(k + shift) : v \ + for k,v in self.cnt_signature_jumps.items()}) + assert SignatureFunction(counter=counter) == \ + SignatureFunction(values=new_data) + return SignatureFunction(counter=counter) def __lshift__(self, shift): return self.__rshift__(-shift) @@ -93,7 +110,8 @@ class SignatureFunction(object): def __str__(self): result = ''.join([str(jump_arg) + ": " + str(jump) + "\n" - for jump_arg, jump in sorted(self.cnt_signature_jumps.items())]) + for jump_arg, jump in sorted(self.cnt_signature_jumps.items()) + if jump != 0]) return result def __repr__(self): @@ -104,10 +122,9 @@ class SignatureFunction(object): def __call__(self, arg): # return the value of the signature function at the point arg, i.e. # sum of all signature jumps that occur before arg - arg = mod_one(arg) - cnt = self.cnt_signature_jumps - before_arg = [jump for jump_arg, jump in cnt.items() if jump_arg < arg] - return 2 * sum(before_arg) + cnt[arg] + items = self.cnt_signature_jumps.items() + result = [jump for jump_arg, jump in items if jump_arg < mod_one(arg)] + return 2 * sum(result) + self.cnt_signature_jumps[arg] def total_sign_jump(self): # Total signature jump is the sum of all jumps. @@ -267,6 +284,65 @@ class TorusCable(object): signature_as_function_of_theta_docstring return signature_as_function_of_theta + + @staticmethod + def get_blanchfield_for_pattern(k_n, theta): + if theta == 0: + sf = TorusCable.get_untwisted_signature_function(k_n) + return sf.square_root() + sf.minus_square_root() + + results = [] + k = abs(k_n) + ksi = 1/(2 * k + 1) + + counter = collections.Counter() + # print("lambda_odd, i.e. (theta + e) % 2 != 0") + for e in range(1, k + 1): + if (theta + e) % 2 != 0: + counter[e * ksi] = 1 * sgn(k_n) + counter[1 - e * ksi] = -1 * sgn(k_n) + + results.append((e * ksi, 1 * sgn(k_n))) + results.append((1 - e * ksi, -1 * sgn(k_n))) + + # for example for k = 9 (q = 19) from this part we get + # for even theta + # 2/19: 1 + # 4/19: 1 + # 6/19: 1 + # 8/19: 1 + # 11/19: -1 + # 13/19: -1 + # 15/19: -1 + # 17/19: -1 + # + # for odd theta + # 1/19: 1 + # 3/19: 1 + # 5/19: 1 + # 7/19: 1 + # 9/19: 1 + # 10/19: -1 + # 12/19: -1 + # 14/19: -1 + # 16/19: -1 + # 18/19: -1 + + # print("lambda_even") + # print("normal") + for e in range(1, theta): + if (theta + e) % 2 == 0: + results.append((e * ksi, 1 * sgn(k_n))) + results.append((1 - e * ksi, -1 * sgn(k_n))) + # print("reversed") + for e in range(theta + 1, k + 1): + if (theta + e) % 2 == 0: + results.append((e * ksi, -1 * sgn(k_n))) + results.append((1 - e * ksi, 1 * sgn(k_n))) + + return SignatureFunction(values=results) + + @staticmethod def get_untwisted_signature_function(j): # return the signature function of the T_{2,2k+1} torus knot @@ -277,6 +353,7 @@ class TorusCable(object): for a in range(k + 1, 2 * k + 1)]) return SignatureFunction(values=w) + def get_knot_descrption(self): description = "" for knot in self.knot_sum: @@ -327,56 +404,6 @@ class TorusCable(object): get_summand_signture_function_docsting return get_summand_signture_function - def get_blanchfield_for_pattern(self, k_n, theta): - if theta == 0: - sf = TorusCable.get_untwisted_signature_function(k_n) - return sf.square_root() + sf.minus_square_root() - - results = [] - k = abs(k_n) - ksi = 1/(2 * k + 1) - - # print("lambda_odd, i.e. (theta + e) % 2 != 0") - for e in range(1, k + 1): - if (theta + e) % 2 != 0: - results.append((e * ksi, 1 * sgn(k_n))) - results.append((1 - e * ksi, -1 * sgn(k_n))) - # for example for k = 9 (q = 19) from this part we get - # for even theta - # 2/19: 1 - # 4/19: 1 - # 6/19: 1 - # 8/19: 1 - # 11/19: -1 - # 13/19: -1 - # 15/19: -1 - # 17/19: -1 - # - # for odd theta - # 1/19: 1 - # 3/19: 1 - # 5/19: 1 - # 7/19: 1 - # 9/19: 1 - # 10/19: -1 - # 12/19: -1 - # 14/19: -1 - # 16/19: -1 - # 18/19: -1 - - # print("lambda_even") - # print("normal") - for e in range(1, theta): - if (theta + e) % 2 == 0: - results.append((e * ksi, 1 * sgn(k_n))) - results.append((1 - e * ksi, -1 * sgn(k_n))) - # print("reversed") - for e in range(theta + 1, k + 1): - if (theta + e) % 2 == 0: - results.append((e * ksi, -1 * sgn(k_n))) - results.append((1 - e * ksi, 1 * sgn(k_n))) - - return SignatureFunction(values=results) def get_number_of_combinations_of_theta(self): number_of_combinations = 1 diff --git a/my_signature.sage b/my_signature.sage index 74f8d32..a9181c7 100644 --- a/my_signature.sage +++ b/my_signature.sage @@ -23,6 +23,10 @@ class Config(object): self.knot_formula = "[[k[0], k[1], k[3]], [-k[1], -k[3]], \ [k[2], k[3]], [-k[0], -k[2], -k[3]]]" + # self.knot_formula = "[[k[3]], [-k[3]], \ + # [k[3]], [-k[3]] ]" + + # self.knot_formula = "[[k[3], k[2], k[0]], [-k[2], -k[0]], \ # [k[1], k[0]], [-k[3], -k[1], -k[0]]]" @@ -198,6 +202,7 @@ def search_for_large_signature_value(knot_formula=None, limit=None, # iterate over q-vector for c in combinations: q = [P.unrank(i + config.start_shift) for i in c] + q[3] = 79 if config.only_slice_candidates: if not (q[3] > 4 * q[2] and q[2] > 4 * q[1] and