Свертка Дирихля является особым видом свертка , который выглядит как очень полезным инструмент в теории чисел. Он действует на множестве арифметических функций .
Вызов
Для двух арифметических функций (т.е. функций ) вычисляется свертка Дирихле как определено ниже.
Детали
- Мы используем соглашение .
- Свертка Дирихле двух арифметических функций снова является арифметической функцией, и она определяется как(Обе суммы эквивалентны. Выражение означает делит , поэтому суммирование производится по натуральным делителям числа . Аналогично мы можем заменитьи мы получаем вторую эквивалентную формулировку. Если вы не привыкли к этой нотации, ниже приведен пошаговый пример.) Просто для уточнения (это не имеет непосредственного отношения к этой задаче): определение исходит из вычисления произведения ряда Дирихле :
- Ввод дается в виде двух функций черного ящика . В качестве альтернативы, вы также можете использовать бесконечный список, генератор, поток или что-то подобное, что может привести к неограниченному количеству значений.
- Есть два метода вывода: либо возвращается функция , либо вы можете взять дополнительный вход и вернуть напрямую.
- Для простоты вы можете предположить, что каждый элемент может быть представлен, например, с помощью положительного 32-битного целого числа.
- Для простоты вы также можете предположить, что каждая запись может быть представлена, например, одним действительным числом с плавающей запятой.
Примеры
Давайте сначала определим несколько функций. Обратите внимание, что список чисел под каждым определением представляет первые несколько значений этой функции.
- мультипликативная идентичность ( A000007 )
case
1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ...
- постоянная единичная функция ( A000012 )
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, ...
- функция тождества ( A000027 )
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, ...
- функция Мёбиуса ( A008683 )
1, -1, -1, 0, -1, 1, -1, 0, 0, 1, -1, 0, -1, 1, 1, 0, -1, 0, -1, ...
- функция Эйлера ( A000010 )
1, 1, 2, 2, 4, 2, 6, 4, 6, 4, 10, 4, 12, 6, 8, 8, 16, 6, 18, 8, ...
- функция Лиувилля ( A008836 )
где - число простых множителей подсчитанных с кратностью
1, -1, -1, 1, -1, 1, -1, -1, 1, 1, -1, -1, -1, 1, 1, 1, -1, -1, -1, ...
- функция суммы делителей ( A000203 )
1, 3, 4, 7, 6, 12, 8, 15, 13, 18, 12, 28, 14, 24, 24, 31, 18, 39, 20, ...
- функция подсчета делителей ( A000005 )
1, 2, 2, 3, 2, 4, 2, 4, 3, 4, 2, 6, 2, 4, 4, 5, 2, 6, 2, 6, 4, 4, 2, 8, ...
- характеристическая функция квадратных чисел ( A010052 )
1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, ...
Тогда у нас есть следующие примеры:
- и
- и
- и
- и
Последнее для является следствием инверсии Мёбиуса : для любого уравнение эквивалентно .
Шаг за шагом Пример
Это пример, который вычисляется шаг за шагом для тех, кто не знаком с обозначениями, используемыми в определении. Рассмотрим функции и . Теперь оценим их свертку при . Их первые несколько терминов перечислены в таблице ниже.
Сумма повторяется по всем натуральным числам которые делят , поэтому принимает все натуральные делители числа . Это . В каждом слагаемом мы оцениваем при и умножаем его на вычисленный при . Теперь мы можем сделать вывод
fun
?cond
чтобы сохранить 5 байтовHaskell , 46 байтов
Попробуйте онлайн!
Спасибо flawr за -6 байтов и большой вызов! И спасибо H.PWiz за еще один -6!
источник
Python 3 , 59 байт
Попробуйте онлайн!
источник
//
действительно необходимо вместо/
?/
будет производить поплавки правильно?d
является делителемn
, дробная частьn/d
равна нулю, поэтому с арифметикой с плавающей запятой не должно быть никаких проблем. Плавы с дробной нулевой частью достаточно близки к целым числам для целей Pythonic, и вывод функции является действительным числом, поэтомуn/d
вместо этогоn//d
должно быть все в порядке.Wolfram Language (Mathematica) , 17 байт
Конечно, Mathematica имеет встроенный. Также бывает известно, что многие из примеров функций. Я включил несколько рабочих примеров.
Попробуйте онлайн!
источник
Добавить ++ , 51 байт
Попробуйте онлайн!
Принимает две предопределенные функции в качестве аргументов плюсN и выводит ( ф∗ г) ( n )
Как это устроено
источник
R , 58 байт
Попробуйте онлайн!
Принимает
n
,f
иg
. К счастью, вnumbers
пакете уже реализовано немало функций.Если векторизованные версии были доступны, что возможно путем переноса каждой из них
Vectorize
, то возможна следующая 45-байтовая версия:R , 45 байт
Попробуйте онлайн!
источник
APL (Dyalog Classic) , 20 байтов
с
⎕IO←1
Попробуйте онлайн!
Легко решить, трудно проверить - как правило, не мой тип задач. Тем не менее, мне очень понравилось это!
{
}
определяет диадический оператор, операнды⍺⍺
и⍵⍵
две свертываемые функции;⍵
числовой аргумент∪⍵∨⍳⍵
делители⍵
в возрастающем порядке, то есть unique (∪
) из LCM (∨
)⍵
со всеми натуральными числами до него (⍳
)⍵⍵¨
применить правильный операнд к каждому⍺⍺¨∘⌽
применить левый операнд к каждому в обратном порядке+.×
внутреннее произведение - умножить соответствующие элементы и сложитьТо же самое в ngn / apl выглядит лучше из-за идентификаторов Unicode, но занимает 2 дополнительных байта из-за 1-индексации.
источник
Желе , 9 байт
Попробуйте онлайн!
источник
Swift 4 ,
74 7054 байтаПопробуйте онлайн!
источник
JavaScript (ES6), 47 байт
Принимает вход как
(f)(g)(n)
.Попробуйте онлайн!
Примеры
источник
C (gcc) , 108 байтов
Простая реализация, бесстыдно украденная из ответа Питона Никинской Python .
Ungolfed:
Попробуйте онлайн!
источник
F #, 72 байта
Принимает две функции
f
иg
натуральное числоn
. Отфильтровывает значения,d
которые естественно не делятся наn
. Затем оцениваетf(n/d)
иg(d)
, умножает их вместе и суммирует результаты.источник
Пари / ГП , 32 байта
Попробуйте онлайн!
Есть встроенная
dirmul
функция, но она поддерживает только конечные последовательности.источник
APL (NARS), 47 символов, 94 байта
где m и n - функции, которые нужно использовать (это потому, что я не знаю, как вызвать один массив функций в одной функции в APL). Используя приведенный выше пример умножения функции Мёбиуса (здесь это 12π) и суммы функции делителей (здесь это 11π) для значения 12, умножение будет:
если нужно вычислить другое значение:
Можно увидеть, если, например, первое число 2000 результат функции является тождеством
источник