У меня есть функция
f(x)=(1^1)*(2^2)*(3^3)*.....(x^x)
я должен рассчитать (f(x)/(f(x-r)*f(r)))modulo c
я можно вычислить F (X) и (е (хт) * е (г)). Предположим, что f (x) - это , а f (x-r) * f (r) - b. c - некоторое число, которое очень велико. `` так я, как можно вычислить (a/b)%c
Как рассчитать (A/B)% C, где а, б и в очень большом количестве
-1
A
ответ
0
ваш п (х) просто ᴨ (PI кумулятивное умножение) в квадрате
- трудно писать здесь, так я буду deifine г (x0, x1) вместо
g(x0,x1)=x0*(x0+1)*(x0+2)*...*x1
- так:
f(x)=g(1,x)^2
вычислительное
h(x,r,c)=f(x)/(f(x-r)*f(r))%c
- когда вы переписать его г() вы получите:
h(x,r,c)=((g(1,x)/(g(1,x-r)*g(1,r)))^2)%c
- Теперь упростить (и ниже величины) столько, сколько вы можете
- так вычислить
sqr
, как последний (не нужно иметь в подрезультатах) - избавиться от дублирующих термов
- есть два оптических устройства нс избавиться от
g(1,x-r)
илиg(1,r)
- выбрать то, что лучше для вас, я бы выбрал какой больше
- так что если
(x-r>r)
тогда: h(x,r,c)=(g(x-r+1,x)/g(1,r)^2)%c
- еще:
h(x,r,c)=(g(r+1,x)/g(1,x-r)^2)%c
некоторые математические изменения
- вы должны вычислить оба термы а, Ь (из (а/б)% с) параллельно
- когда оба могут быть разделены любым из первых простых чисел, а затем разделить их стенд, чтобы сохранить величину низкой
- что-то вроде ::
- `if ((a & 1 == 0) & & (b & 1 == 0)) {a >> = 1; б >> = 1; } // деление на prime = 2 ... обычно этого достаточно
- , но если ваши величины очень большие, то, возможно, вы должны добавить также некоторые, например 3,5,7, ...
- но всегда измерять падение производительности и остановится, если она падает слишком много
если
x
большой иr
мал- затем вычислить
b
первый - и при вычислении
a
- в дополнение к проверке простых чисел также, если субрезультат делится также на
b
- , если он затем разделить
a
наb
и добавить результат к конечному результату деления
- затем вычислить
некоторые повышение скорости
- можно вычислить частичную
a,b
- и начать тестирование делимость только если у стенда есть величины больше, чем некоторая сумма
- также вы можете сделать расчет ожидающим друг друга
- так что если
a>1000000
затем ждать, покаb
не также настолько велик, или весь - и сделать то же самое и в отворотами (если
b>100000
....) - тем больше Treshold лучшую скорость, но вы ограничены вашим целым числом реализация
- при использовании bigints, то вы должны использовать Treshold меньше, чем вдвое биты базового числа ...
- можно вычислить частичную
Надеется, что я не делала какую-то глупые математическую ошибку ...
На каком языке? Возможно, у него есть библиотека с несколькими точками. – Barmar
Вы можете по крайней мере отменить все факторы из 'r + 1' thru' x-r'. –
http://stackoverflow.com/questions/10118137/fast-n-choose-k-mod-p-for-large-n/10118336#10118336 –