Ce challenge très intéressant est en gros surtout un problème d'arithmétique des nombres entiers. Ça m'a amusé de pouvoir en refaire. Allons-y pour la résolution.
Les contraintes sont que
et que
D'où
On va maintenant s'intéresser particulièrement à la 4ème équation. On peut supposer sans nuire à la généralité que
Donc $487 c \left(\frac{485 + 159}{485}\right) $ est un nombre entier qui divise
On notera
Or
Pour que
Ensuite pour que tous les facteurs premiers de
Puisque
D'où il existe
On obtient donc immédiatement que
On a par ailleurs immédiatement qu'un tel
Étudions à présent l'équation donnée par
Notons
On a
Et après quelques recherches sur internet on reconnaît bien sûr une équation de Pell.
Sans plus d'ambages nous l'avons résolue avec la méthode des fractions continues.
Puisque ce problème revient à trouver une solution, pas forcément toutes les solutions, si on trouve une telle solution
Par ailleurs pour que
Voici donc le programme qui trouve une solution à cette équation de Pell et donc au problèmeuh amusant quoique je pense un peu bovinant à créer pour l'orga. Merci encore.
import math
import sys
from hashlib import sha256
sys.set_int_max_str_digits(31337)
def flag(a: int, b: int, c: int, x: int, y: int) -> None:
try:
## Ce que le programme faisait initialement
# a, b, c, x, y = [int(input(f'{x} = ')) for x in 'abcxy']
assert a > 0
assert a == 487 * c
assert 159 * a == 485 * b
assert x**2 == a + b
assert y * (3 * y - 1) == 2 * b
h = sha256(str(a).encode()).hexdigest()
print(f'FCSC{{{h}}}')
except:
print('Nope!')
def get_c(n: int) -> int:
return n**2 * 485 * 487 * 7 * 23
def get_b(a: int) -> int:
return 159 * a // 485
def get_a(c: int) -> int:
return 487 * c
def pell(n: int) -> tuple[int, int]:
if n <= 0:
raise ValueError('n must be a positive integer')
sqrt_n_int = int(n**0.5)
if sqrt_n_int * sqrt_n_int == n:
raise ValueError("n cannot be a perfect square for Pell's equation x^2 - n*y^2 = 1")
a0 = sqrt_n_int
m = 0
d = 1
a = a0
p_prev, q_prev = 1, 0
p_curr, q_curr = a0, 1
while True:
m = d * a - m
d = (n - m**2) // d
if d == 0:
raise ValueError('Division by zero encountered in Pell solver.')
a = (a0 + m) // d
p_next = a * p_curr + p_prev
q_next = a * q_curr + q_prev
if p_next**2 - n * q_next**2 == 1:
return p_next, q_next
p_prev, p_curr = p_curr, p_next
q_prev, q_curr = q_curr, q_next
def main() -> None:
d, n = pell(24 * 159 * 487**2 * 7 * 23)
print(f'd = {d}, n = {n}')
c = get_c(n)
a = get_a(c)
b = get_b(a)
x = math.isqrt(a + b)
if ((1 + d) % 6) == 0:
y = (1 + d) // 6
else:
y = (1 - d) // 6
print(f'a = {a}, b = {b}, c = {c}, x = {x}, y = {y}')
flag(a, b, c, x, y)
if __name__ == '__main__':
main()