Ответ Арьябхатты для
подсчет количества способов внести изменения с монетами фиксированной
Деноминации очень мило, но также нецелесообразно осуществлять как
описано. Вместо того, чтобы использовать комплексные числа, мы будем использовать модульные
арифметика, аналогично тому, как теоретико-числовое преобразование заменяет
Преобразование Фурье для умножения целочисленных полиномов.
Пусть D
будет наименьшим общим кратным номинала монет. От
Теорема Дирихле об арифметических прогрессиях существует бесконечно
многие простые числа p
такие, что D
делит p - 1
. (Если повезет,
они даже будут распространяться таким образом, чтобы мы могли их найти
эффективно.) Мы рассчитаем количество способов по модулю p
удовлетворяющих этому условию. Получая грубую оценку каким-либо образом (например,
n + k - 1
выберите k - 1
, где n
- это сумма, а k
- это число.
конфессий), повторяя эту процедуру с несколькими различными
простые числа, произведение которых превышает эту границу, и применяя китайские
теорема об остатке, мы можем восстановить точное число.
Проверка кандидатов 1 + k*D
для целых чисел k > 0
, пока мы не найдем простое число
p
. Пусть g
будет примитивным корнем по модулю p
(генерировать кандидатов в
случайным образом и применить стандартный тест). Для каждого номинала d
, экспресс
полином x**d - 1
по модулю p
как произведение факторов:
x**d - 1 = product from i=0 to d-1 of (x - g**((p-1)*i/d)) [modulo p].
Обратите внимание, что d
делит D
делит p-1
, поэтому показатель действительно является
целое число.
Пусть m
будет суммой деноминаций. Соберите все константы
g**((p-1)*i/d)
как a(0), ..., a(m-1)
. Следующий шаг - найти
частичное разложение фракции A(0), ..., A(m-1)
такое, что
sign / product from j=0 to m-1 of (a(j) - x) =
sum from j=0 to m-1 of A(j)/(a(j) - x) [modulo p],
, где sign
равно 1
, если существует четное число конфессий и
-1
если есть нечетное количество конфессий. Вывести систему
линейные уравнения для A(j)
путем оценки обеих сторон заданного
уравнение для различных значений x
, а затем решить его с помощью гауссиана
устранение. Жизнь усложняется, если есть дубликаты; вероятно, проще всего выбрать другое простое число.
Учитывая эту настройку, мы можем вычислить количество способов (по модулю p
, из
конечно) внести изменения на сумму n
как
sum from j=0 to m-1 of A(j) * (1/a(j))**(n+1).