Мы хотели бы факторизовать полупервичное . Цель этой задачи состоит в нахождении два небольших целых чисел и такие , что может быть разложено тривиальным методом Ферма, что позволяет легко вычесть факторы .у v U v N N
Задание
Для заданного полупростого числа и положительного целого числа мы определяем и как:к х у
y=x2-kN
Шаг № 1 - Найти
Сначала вам нужно найти наименьшее возможное значение такое что - это квадратное число ( или идеальный квадрат).у
Это позволяет факторизовать за одну итерацию метода факторизации Ферма . Конкретнее, это сразу приводит к:
(Обновление: эта последовательность теперь опубликована как A316780 )
Шаг № 2 - Факторизовать
Затем вы должны найти два положительных целых числа и такие что:v
c u = x + √
где и являются главными факторами .d N
Резюме
Ваша задача - написать программу или функцию, которая принимает качестве входных данных и печатает или выводит и в любом порядке и в любом разумном формате.u v
пример
Давайте рассмотрим
Шаг 1
Наименьшее возможное значение составляет , что дает:40
y=28232-40×199163=7969329-7966520=2809=532kN=(2823+53)×(2823-53)kN=2876×2770
Шаг 2
Правильная факторизация равна , потому что:k = 4 × 10
k N = ( 719 × 4 ) × ( 277 × 10 ) N = 719 × 277
Таким образом, правильный ответ будет либо либо .[ 10 , 4 ]
правила
- Не обязательно строго применять два шага, описанных выше. Вы можете использовать любой другой метод, если он находит правильные значения и .v
- Вход гарантированно будет полупростым.
- Это код-гольф, поэтому выигрывает самый короткий ответ в байтах.
- Стандартные лазейки запрещены.
Контрольные примеры
N | k | Output
-----------+------+------------
143 | 1 | [ 1, 1 ]
2519 | 19 | [ 1, 19 ]
199163 | 40 | [ 4, 10 ]
660713 | 1 | [ 1, 1 ]
4690243 | 45 | [ 9, 5 ]
11755703 | 80 | [ 40, 2 ]
35021027 | 287 | [ 7, 41 ]
75450611 | 429 | [ 143, 3 ]
806373439 | 176 | [ 8, 22 ]
1355814601 | 561 | [ 17, 33 ]
3626291857 | 77 | [ 7, 11 ]
6149223463 | 255 | [ 17, 15 ]
6330897721 | 3256 | [ 74, 44 ]
Пример реализации
источник
N
самом деле вход будет полупростым?Ответы:
Mathematica,
8179 байтСпасибо Мартину Эндеру за сохранение 2 байта!
Чистая функция, принимающая полупростую в качестве входных данных и возвращающая упорядоченную пару натуральных чисел. В
For
реализует цикл точную процедуру , описанную в вопросе (используя#
для ввода в местеn
), сx
такими , как определено здесь, хотя мы хранить ,j = k*n
а неk
сам по себе , иz=Sqrt[y]
вместо того ,y
само по себе. Мы также вычисляемp={x+z,x-z}
внутриFor
цикла, который заканчивается сохранением одного байта (как при седьмой попытке). Тогда двумя желаемыми факторами являются(x+z)/GCD[#,x+z]
и(x-z)/GCD[#,x-z]
, которые сжатое выражениеp/#~GCD~p
вычисляет непосредственно как упорядоченная пара.Курьезы: мы хотим зациклить, пока
z
не будет целое число; но так как мы собираемся использоватьCeiling
уже в коде, он экономит два байта,!IntegerQ@z
чтобы определитьc=Ceiling
(что, как известно гольфистам Mathematica), стоит четыре байта, а затем проверить, есть лиc@z>z
. Мы должны что-то инициализироватьz
, и что-то лучше не быть целым числом, чтобы цикл мог начаться; к счастью,E
это лаконичный выбор.источник
JavaScript (ES7),
8681 байтРедактировать: 4 байта сохранены благодаря @Arnauld.
источник
Python 2,
12712111711110710410199 байт-1 байт благодаря Нейлу и -3 байта благодаря ovs
Попробуйте онлайн!
Неформат:
p
инициализируется.5
так, чтобы условие цикла было истинным на первой итерации. Обратите внимание, что его короче хранитьp
(какx
+sqrt(y)
), чем хранить каждый из нихx
иy
отдельно.источник
x*x
вместоx**2
?Аксиома,
131115 байтФункция, которая могла бы решить вопрос - это r (n) выше. разгрызть и проверить
источник