def collatz_sequence(n): sequence = [n] while n != 1: if n % 2 == 0: n = n // 2 else: n = 3 * n + 1 sequence.append(n) return sequence def convert_to_sti_using_6k_plus_4(sequence): sti_steps = [] for n in sequence: if n % 2 == 0 and (n - 4) % 6 == 0: i = (n - 1) // 3 sti_steps.append(i) if len(sti_steps) == 8: break return sti_steps def mod_16_segment(sti_sequence): mod_16_steps = [i % 16 for i in sti_sequence] segment = '-->'.join(map(str, mod_16_steps)) return segment def calculate_i(k, b, x): return 2**k * x + b def check_segments_for_x(k, b, display=True): segments = [] for x in range(1, 3): i = calculate_i(k, b, x) sti_sequence = convert_to_sti_using_6k_plus_4(collatz_sequence(i)) segment = mod_16_segment(sti_sequence) segments.append(segment) if x == 1 and display: print(f"i = 2^{k} * {x} + {b} = {i}") print(f"STI de i = {sti_sequence}") if all(s == segments[0] for s in segments): return True, f"Tous les segments i mod 16 de cette STI sont identiques quel que soit x :\n{segments[0]}" else: return False, f"Segments différents pour les valeurs de x testées :\n{segments}. Le couple (k, b) proposé est trivial." def calculate_b_prime(i, k_minus_1): return i - 2**(k_minus_1) * 1 def check_k_minus_1(k, b): i = calculate_i(k, b, 1) b_prime = calculate_b_prime(i, k-1) return check_segments_for_x(k - 1, b_prime, display=False) print(""" Bienvenue dans ce défi mathématique ! Votre objectif est de trouver un couple (k, b) non trivial pour lequel l'expression i = 2^k * x + b génère, pour toutes les valeurs de x, le même segment de transformations (mod 16) dans une suite de Collatz modifiée. Attention, parmi une infinité de couples (k, b), seuls 8 * 3^7 sont non triviaux pour le segment de longueur L=8 que nous analysons. """) k = int(input("Proposez une valeur pour k : ")) while True: b = int(input("Proposez une valeur pour b (impair) : ")) if b % 2 == 0: print("b doit être impair. Veuillez réessayer.") else: break is_valid, message = check_segments_for_x(k, b) print(message) if is_valid: is_valid_k_minus_1, message_k_minus_1 = check_k_minus_1(k, b) if is_valid_k_minus_1: print(f"Bravo, les segments sont tous identiques, mais le couple (k, b) proposé est trivial. Ce couple (k, b) ne couvre pas tous les impairs i possibles avec ce segment.") else: print(f"Bravo, votre couple (k, b) est non trivial ! Sauriez-vous toujours trouver du premier coup, un couple non trivial ?")