Вступление
В теории чисел мы говорим, что число является гладким, когда все его простые множители не больше . Так , например, 2940 : 7-гладкой , так как .
Здесь мы определяем -гладкую пару как два последовательных целых числа, оба из которых -гладкие. Пример 7-гладкой пары будет , так как и . Забавный факт: это на самом деле самая большая пара из 7-гладких .
В 1897 году Штермер доказал, что для каждого существует только конечное число -гладких пар , и этот факт известен как теорема Штермера .
Вызов
Ваша задача - написать программу или функцию, которая при заданном вводе простого числа выводит или возвращает все -гладкие пары без дубликатов (порядок внутри пары не имеет значения) в любом порядке.
Следует отметить, что для простых чисел и , предполагая, что , все -гладкие пары также являются -гладкими парами.
Образец ввода / вывода
Input: 2
Output: (1, 2)
Input: 3
Output: (1, 2), (2, 3), (3, 4), (8, 9)
Input: 5
Output: (1, 2), (2, 3), (3, 4), (4, 5), (5, 6), (8, 9), (9, 10), (15, 16), (24, 25), (80, 81)
Input: 7
Output: (1, 2), (2, 3), (3, 4), (4, 5), (5, 6), (6, 7), (7, 8), (8, 9), (9, 10), (14, 15),
(15, 16), (20, 21), (24, 25), (27, 28), (35, 36), (48, 49), (49, 50), (63, 64),
(80, 81), (125, 126), (224, 225), (2400, 2401), (4374, 4375)
ограничение
Программа или функция должны теоретически завершаться за конечное время для всех входов. Стандартные лазейки по умолчанию запрещены.
Критерии победы
Поскольку это соревнование по коду для игры в гольф , выигрывает самая короткая действительная подача для каждого языка.
источник
(1, 2)
Обязательна ли часть выходных данных? ..(1, 2)
пару.Ответы:
JavaScript (ES7),
234232 байтаНаходит решения путем решения уравнений Пелла видаx2−2qy2=1 , где q - P -гладкое квадратное свободное число.
Это реализация процедуры Деррика Генри Лемера , основанная на оригинальной процедуре Штермера.
Возвращает объект, ключи и значения которого описываютP -гладкие пары.
Попробуйте онлайн!
Как?
Вспомогательная функцияs проверяет, является ли данное целое число n гладким P числом, когда оно вызывается с i=0 , или свободным 1- гладким числом P когда оно вызывается с i=1 .
Мы ищем все квадратные свободные 1P -гладкие числа в [1..PP−1] , гдеPP используется в качестве верхней границы дляP! ,
Для каждого числаn найденного выше, мы ищем фундаментальное решение уравнения Пелла x2−ny2=1 :
(приведенный выше код является нерекурсивной версией моего ответа на этот другой вызов )
Когда фундаментальное решение(x1,y1) найдено, мы вычисляем решения (xk,yk) с k≤max(3,(P+1)/2) , используя рекуррентные соотношения:
Для каждогоxk мы проверяем, является ли xk нечетным и оба (xk−1)/2 и (xk+1)/2 являютсяP гладкими. Если это так, мы храним их в объектеr .
1: поскольку она не проверяет простоту делителей, функцияs будет действительно верна для некоторых не квадратичных свободных чисел, даже если она вызывается с i=1 . Идея состоит в том, чтобы отфильтровать большинство из них, чтобы было решено не слишком много бесполезных уравнений Пелла.
источник
x = ~-x / 2
и.-~P / 2
Это какое-то закругление ...~x
- побитовое НЕ, которое вычисляет-(x+1)
. Следовательно,~-x
есть-(-x+1)
=x-1
и-~x
есть-(-(x+1))
=x+1
. Как и все побитовые операции в JS, учитывается только 32-битная целочисленная часть. Таким образом, они действительно могут быть использованы для округления. Но оба иЖеле ,
1614 байтовПопробуйте онлайн!
Проверяет на пары до4k что неэффективно для большихk но должно гарантировать, что ни одно не пропущено.
Спасибо @JonathanAllan за сохранение 1 байта!
объяснение
источник
05AB1E , 8 байтов
Попробуйте онлайн!
Объяснение:
источник
Желе , 123 байта
Попробуйте онлайн!
Полная программа, которая принимает один аргумент,К и возвращает список списков пар. Приведенный выше код не сортирует окончательный результат, но ссылка TIO делает.
источник
Haskell ,
118107 байтов-11 байт благодаря Ними
Попробуйте онлайн!
q n
вычисляет список всех основных факторовn
f k
генерирует списокисточник
[2..n]
внутриp
и вставить его вq
. Попробуйте онлайн!Желе , 24 байта
Попробуйте онлайн!
Это занимает много времени для 7, но вычисляется намного быстрее, если вы уберете квадрат факториала: попробуйте онлайн!
Объяснение:
-3 байта благодаря @JonathanAllen
источник
(8,9)
3-гладкая пара, так какk!
(кроме 3, у которого есть маленький факториал, потому что это небольшое число).Python 3 + sympy, 116 байт
Попробуйте онлайн!
Python 3 + sympy, 111 байт
Попробуйте онлайн!
Две вариации на мой ответа Jelly, но в Python 3. Они оба определяют функцию, которая принимает аргумент
k
. Первый возвращает список кортежей пар, которые соответствуют критериям. Второй выводит их на стандартный вывод.источник
Wolfram Language (Mathematica) , 241 байт
использует уравнения Пелла
Попробуйте онлайн!
источник
Pyth , 15 байт
Попробуйте онлайн!
Использует замечание Ника Кеннеди о том, что ни один выходной номер не будет больше, чем
4^k
.источник
05AB1E , 16 байтов
Попробуйте онлайн (крайне неэффективно, поэтому время ожиданияn > 3 ..). Здесь немного более быстрая альтернатива , хотя все еще довольно медленная ..
Объяснение:
источник
Stax , 14 байт
Запустите и отладьте его
Это не самая короткая из возможных программ, но она начинает производить вывод, как только найдены подходящие пары. Это в конечном итоге завершается , но вывод производится, как он был найден.
источник
Рубин , 89 + 8 = 97 байт
Используетя от 1 до 4N , сопоставьте его, N -Smooth, в противном случае сопоставьте его
-rprime
флаг. Для каждого номера[i, i+1]
если обаfalse
, затем удалите всеfalse
из списка.Попробуйте онлайн!
источник