Я пытаюсь вычислить nCr по модулю p, где p - простое число.Вычисление nCr по модулю p, простое
Один из подходов, который я пробовал, - это вычислить n!/(r! * (n-r)!) по модулю p с использованием мультипликативных обратных, но это не удается, если либо r, либо n - r больше или равно p, так как тогда факториалы равны нулю по модулю p, а обратные не существуют.
Какой метод работает во всех случаях, а не только при наличии мультипликативных инверсий?
«Этот алгоритм даст nCr = 0 для каждого n, большего чем p, так как mod factorial станет равным нулю. Но это неправильный расчет. Ex. 14C1 mod 13 = 1, а не 0. «Как вы получаете 0 с помощью вашего алгоритма? – IVlad
' f [n] * ((InverseEuler (f [r], p) * InverseEuler (f [nr], p))% p))% p', где 'f [n] (n!% p)' и InverseEuler (a, b) есть '((a^(p-2))% p)'. Это была бы дискретная формула для nCr, используя теорему Эйлера для модулярного мультипликативного обратного. f [n] при n> = p будет равна нулю, и, следовательно, значение nCr станет равным нулю. Исправьте меня, если я ошибаюсь. @IVlad – Ashwini
Эта формула работает только для 'f [x], p' coprime. Умножения 'p' не являются взаимно простыми с' p'. – IVlad