Фон
В прошлый раз мы посчитали группы заданного размера , что является нетривиальной задачей.
На этот раз мы будем считать только абелевы группы , т. Е. Группы с коммутативной операцией. Формально группа (G, *) абелева , если х * у = у * х для для всех х, у в G .
Таким образом, проблема становится намного проще, поэтому мы будем эффективно их подсчитывать.
задача
Напишите программу или функцию, которая принимает неотрицательное целое число n в качестве входных данных и печатает или возвращает количество неизоморфных абелевых групп порядка n .
Один из способов вычисления количества групп, который мы обозначим через A (n), заключается в следующем:
A (0) = 0
Если p простое число, A (p k ) равно числу целочисленных разбиений k . (ср. OEIS A000041 )
Если n = mk , а m и k взаимно просты, A (n) = A (m) A (k) .
Вы можете использовать этот или любой другой метод вычисления A (n) .
Контрольные примеры
Input Output
0 0
1 1
2 1
3 1
4 2
5 1
6 1
7 1
8 3
9 2
10 1
11 1
12 2
13 1
14 1
15 1
16 5
17 1
18 2
19 1
20 2
4611686018427387904 1300156
5587736968198167552 155232
9223371994482243049 2
(взято из OEIS A000688 )
Дополнительные правила
При наличии достаточного количества времени, ОЗУ и размера регистра, который может содержать ввод, ваш код должен работать (теоретически) для сколь угодно больших целых чисел.
Ваш код должен работать для всех целых чисел от 0 до 2 63 - 1 и заканчиваться менее чем за 10 минут на моем компьютере (Intel i7-3770, 16 ГБ ОЗУ, Fedora 21).
Пожалуйста, убедитесь, что вы указали свой код для последних трех тестовых случаев, прежде чем отправлять свой ответ.
Встроенные модули, которые упрощают эту задачу, такие как Mathematica
FiniteAbelianGroupCount
, не допускаются.Встроенные модули, которые возвращают или подсчитывают целочисленные разделы числа или разделы списка, не допускаются.
Применяются стандартные правила игры в гольф .
источник
Ответы:
CJam (
3938 байт)Онлайн демо
Это следует предложенной линии нахождения простой факторизации (
mF
), а затем вычисляет разбиения каждой степени и принимает их произведение.Есть два особых случая для
mF
: это факторы0
как0^1
и1
как1^1
. Последнее не требует особой обработки: существует одна абелева группа размера 1 и одно разбиение 1. Однако для нуля требуется особый случай.Подсчет разделов использует повторение для
A008284(n, k)
количества разделенийn
наk
части. В OEIS это дается какно я думаю, что более полезно думать о сумме в диапазоне от
1
доmin(k, n-k)
.рассечение
источник
CJam,
50494743 байтаИспользует встроенную
mF
факторизацию CJam и запомненный порт этой функции номера раздела Python:или без золота
Как и ответ @ RetoKoradi, последний случай занимает около 17 секунд в автономном переводчике, потому что CJam это занимает много времени, чтобы факторизовать число. Поэтому я оставил это вне этого набора онлайн-тестов .
Полное объяснение
источник
Mathematica,
969488 байтЯ не очень хорошо разбираюсь в Mathematica, но я решил попробовать. Спасибо @ MartinBüttner за -6 байтов.
При этом используется формула производящей функции для целочисленных разбиений.
источник
CJam, 58 байт
Попробуйте онлайн
Самый последний тестовый пример длится бесконечно (или, по крайней мере, дольше, чем я хотел ждать) в онлайн-переводчике, но заканчивается через 17 секунд с автономной версией CJam на моем ноутбуке. Все остальные тестовые примеры в значительной степени мгновенные.
При этом используется
mF
оператор CJam , который дает простую факторизацию с показателями степени. В результате получается произведение подсчетов для каждого показателя степени.Основная часть кода - это подсчет количества разделов. Я реализовал рекурсивный алгоритм на странице википедии , используя
j
оператор, который поддерживает рекурсию с запоминанием.Объяснение:
источник