Найти тему

Кирпичи Эйлера. Третья итерация. Скорее всего последняя

Чего-то решил я перебраться со своими редкими постами из гугловского Блог-поста в Дзен. У гугла всё потихоньку печальнее и печальнее становится: картинки вот начали пропадать. Того и глядишь, доступ из России закроют...

Короче, про кирпичи. Просчитал я нечетную сторону до 2^32, попутно отловив все ошибки и сделав оптимизацию, которую придумал Иван. Оптимизация, конечно, сильно помогла, ниже покажу, это будет заметно. А здесь оставлю ссылку на файл с рассчитанными кирпичами, вдруг кому станет интересно.

Когда сверялся с образцовым файликом, обнаружил, что ребята-то сильно далеко вперед ушли, мне их даже просто догонять долго. Впрочем, как легкое упражнение в программировании для поддержания тонуса пойдет.

Короче, начал считать дальше, перейдя полностью на 128-битную арифметику, попутно оптимизируя кой-чего на ассемблере. Ну то есть пока чисто паскалевская программка считает, я там потихоньку в свободное время на ассемблере некоторые части допиливаю.
Впрочем, не очень успешно. Например, при генерации множителей нечетного числа мой ассемблерный вариант никакого ускорения не дал. То ли потому что в низкоуровневую оптимизацию я в этот раз не смог, то ли потому, что сам процесс генерации упирается в производительность подсистемы памяти.

И вот пока я там на ассемблере оптимизировал, расчет у меня уперся в ограничение. Уже на нечетной стороне с длиной 5916099741 возникают четные стороны, сумма квадратов которых превышает беззнаковое 128 бит. То есть я не могу проверить, дают ли они пифагорову тройку.
Тут возникает задачка написать новый тип, бы что-нибудь вроде UInt192, куда всё точно влезет, но пока что-то лом этим заниматься: никому не нужно, а мне пока лень. Может, со временем возникнет желание написать, ХЗ.

Из того, что посчитано, есть один интересный момент. Если максимально близким к совершенному кубоиду долгое время был мелкий и легко считаемый (37835, 269280, 1244484) с отклонением главной диагонали в ~6.5E-5, позже нашелся лучший кубоид (1939671305, 640347864, 1045085760) с отклонением ~4.1E-5.
Ну, то есть раз есть прогресс, значит остается и шанс, что совершенный кубоид все же существует, и он достаточно не хилый, с учетом бесконечного количества натуральных чисел. Вполне вероятно, что среди них хотя бы один примитивный вариант да найдется.

Вообще в диапазоне до 2^32 есть пять примитивных кубоидов, у которых отклонение главной диагонали от целого меньше 1E-4. Но кроме этого, никаких других общих черт у них я выявить не смог.

Ниже ради любопытства зависимость скорости генерации кубоидов в зависимости от длины нечетной стороны.

Скорость генерации кубоидов в зависимости от длины нечетной стороны.
Скорость генерации кубоидов в зависимости от длины нечетной стороны.

Видно, что кривая имеет сложную форму и состоит как бы из двух частей. Первая часть - это генерация кубоидов подбором нечетных сторон, хорошо видна неоптимальность этого алгоритма на больших длинах. А вот дальше ровненький такой график - это уже используется алгоритм Игоря с генерацией делителей. Видно, что он хоть и замедляется по мере увеличения длины стороны, но медленно, а самое главное - практически линейно.

Ссылки: первая часть, вторая часть, UInt128.