пощупать тройки

Я стараюсь в последнее время помнить о том, как полезно пощупать конкретные данные, а не только думать о задаче абстрактно (как мне свойственно по характеру). Вот тривиальный, но характерный пример. В твиттере попалась забавная задачка: "Доказать, что на окружности радиусом 1 вокруг начала координат есть бесконечное количество "десятичных" точек, то есть таких, как (0.6, 0.8 ) или (0.28, 0.96) - координаты в десятичной оканчиваются, а не продолжаются бесконечно" (дальше будет решение, если хотите решать самостоятельно, не читайте) Думаю так. Можно перевести это из дробей в целые числа, 6^2+8^2 = 10^2, то же самое с (28,96), но сумма уже 100 в квадрате, итд. Должны быть все растущие и растущие такие пары чисел, причем оканчивающиеся не на нули. Откуда их взять? И тут я остановился и сказал себе: стоп. Посмотри на конкретные данные. Немедленно зашел в питон и прямо в командной строке написал код, который печатает все такие пары для данной степени 10. Самое тривиальное и тупое: >>> def pr(n): ... for i in range(n): ... for j in range(n): ... if i != j and i**2+j**2==n**2: ... print(f"{i},{j}") Запускаю pr от 10, 100, 1000, 10000. Что я вижу: что кроме тривиальных примеров - если 6,8 подходит для 10, то 60,80 для 100 - есть только один нетривиальный пример для каждого числа цифр: 6,8 28,96 352,936 5376,8432 Раз есть только один, то может они как-то связаны и из меньших можно сделать большие. Начинаю играть с ними, делить большие на меньшие. Замечаю, что 5376/28 делится нацело, выходит 192. Стоп, 192 это как раз 96*2, дважды второе число в паре. Что с другими парами? 6*8*2 = 96, ага, закономерность. Если (x,y) пара, то 2xy - одно из чисел в другой паре. Почему? x^2+y^2 степень десятки, смотрим на (2xy)^2... сразу становится понятно, что оно связано с квадратом (x^2+y^2) и формула пишет себя сама: (y^2-x^2)^2 + (2xy)^2 = (x^2+y^2)^2 так мы получаем новую пару из старой. Написав это, я сразу вспоминаю, что знал это из темы пифагоровых троек, целых чисел, которые могут быть сторонами прямоугольного треугольника, и как их находить. Но не подумал об этом с самого начала, не соединил. Теперь очевидно. Ясно также, что если начать с (6,8), все следующие тройки будут нетривиальными, потому что 2xy никогда не даст 0 в конце числа. Вот и все, это доказательство нескончаемого потока "десятичных" точек на единичной окружности. Все это заняло 5 минут, значительно меньше, чем написать об этом. Остается непонятым: почему из трех цифр есть тоже только одна нетривиальная пара, (352,936)? Она как-то связана с (6,8) или сама по себе? После 4 разрядов тоже сохраняется правило "всего одна нетривиальная пара на каждое число цифр" или появляются какие-то другие варианты? Вполне возможно, что эти три вопроса очень просты и ответы лежат на поверхности, а может и нет. Я специально удержал себя от того, чтобы о них думать, есть другие дела сейчас. Хотите попробовать?

Фев 2, 2025 - 03:37
 0
пощупать тройки
Я стараюсь в последнее время помнить о том, как полезно пощупать конкретные данные, а не только думать о задаче абстрактно (как мне свойственно по характеру). Вот тривиальный, но характерный пример. В твиттере попалась забавная задачка:

"Доказать, что на окружности радиусом 1 вокруг начала координат есть бесконечное количество "десятичных" точек, то есть таких, как (0.6, 0.8 ) или (0.28, 0.96) - координаты в десятичной оканчиваются, а не продолжаются бесконечно"

(дальше будет решение, если хотите решать самостоятельно, не читайте)

Думаю так. Можно перевести это из дробей в целые числа, 6^2+8^2 = 10^2, то же самое с (28,96), но сумма уже 100 в квадрате, итд. Должны быть все растущие и растущие такие пары чисел, причем оканчивающиеся не на нули. Откуда их взять?

И тут я остановился и сказал себе: стоп. Посмотри на конкретные данные. Немедленно зашел в питон и прямо в командной строке написал код, который печатает все такие пары для данной степени 10. Самое тривиальное и тупое:
>>> def pr(n):
... for i in range(n):
... for j in range(n):
... if i != j and i**2+j**2==n**2:
... print(f"{i},{j}")

Запускаю pr от 10, 100, 1000, 10000. Что я вижу: что кроме тривиальных примеров - если 6,8 подходит для 10, то 60,80 для 100 - есть только один нетривиальный пример для каждого числа цифр:

6,8
28,96
352,936
5376,8432

Раз есть только один, то может они как-то связаны и из меньших можно сделать большие. Начинаю играть с ними, делить большие на меньшие. Замечаю, что 5376/28 делится нацело, выходит 192. Стоп, 192 это как раз 96*2, дважды второе число в паре. Что с другими парами? 6*8*2 = 96, ага, закономерность. Если (x,y) пара, то 2xy - одно из чисел в другой паре. Почему? x^2+y^2 степень десятки, смотрим на (2xy)^2... сразу становится понятно, что оно связано с квадратом (x^2+y^2) и формула пишет себя сама:

(y^2-x^2)^2 + (2xy)^2 = (x^2+y^2)^2

так мы получаем новую пару из старой. Написав это, я сразу вспоминаю, что знал это из темы пифагоровых троек, целых чисел, которые могут быть сторонами прямоугольного треугольника, и как их находить. Но не подумал об этом с самого начала, не соединил. Теперь очевидно. Ясно также, что если начать с (6,8), все следующие тройки будут нетривиальными, потому что 2xy никогда не даст 0 в конце числа. Вот и все, это доказательство нескончаемого потока "десятичных" точек на единичной окружности.

Все это заняло 5 минут, значительно меньше, чем написать об этом.
Остается непонятым: почему из трех цифр есть тоже только одна нетривиальная пара, (352,936)? Она как-то связана с (6,8) или сама по себе? После 4 разрядов тоже сохраняется правило "всего одна нетривиальная пара на каждое число цифр" или появляются какие-то другие варианты?

Вполне возможно, что эти три вопроса очень просты и ответы лежат на поверхности, а может и нет. Я специально удержал себя от того, чтобы о них думать, есть другие дела сейчас. Хотите попробовать?