2014-11-09 1 views
-1

У меня есть функция
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, где а, б и в очень большом количестве

+2

На каком языке? Возможно, у него есть библиотека с несколькими точками. – Barmar

+0

Вы можете по крайней мере отменить все факторы из 'r + 1' thru' x-r'. –

+0

http://stackoverflow.com/questions/10118137/fast-n-choose-k-mod-p-for-large-n/10118336#10118336 –

ответ

0
  1. ваш п (х) просто ᴨ (PI кумулятивное умножение) в квадрате

    • трудно писать здесь, так я буду deifine г (x0, x1) вместо
    • g(x0,x1)=x0*(x0+1)*(x0+2)*...*x1
    • так:
    • f(x)=g(1,x)^2
  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
  3. некоторые математические изменения

    • вы должны вычислить оба термы а, Ь (из (а/б)% с) параллельно
    • когда оба могут быть разделены любым из первых простых чисел, а затем разделить их стенд, чтобы сохранить величину низкой
    • что-то вроде ::
    • `if ((a & 1 == 0) & & (b & 1 == 0)) {a >> = 1; б >> = 1; } // деление на prime = 2 ... обычно этого достаточно
    • , но если ваши величины очень большие, то, возможно, вы должны добавить также некоторые, например 3,5,7, ...
    • но всегда измерять падение производительности и остановится, если она падает слишком много
  4. если x большой и r мал

    • затем вычислить b первый
    • и при вычислении a
    • в дополнение к проверке простых чисел также, если субрезультат делится также на b
    • , если он затем разделить a на b и добавить результат к конечному результату деления
  5. некоторые повышение скорости

    • можно вычислить частичную a,b
    • и начать тестирование делимость только если у стенда есть величины больше, чем некоторая сумма
    • также вы можете сделать расчет ожидающим друг друга
    • так что если a>1000000 затем ждать, пока b не также настолько велик, или весь
    • и сделать то же самое и в отворотами (если b>100000 ....)
    • тем больше Treshold лучшую скорость, но вы ограничены вашим целым числом реализация
    • при использовании bigints, то вы должны использовать Treshold меньше, чем вдвое биты базового числа ...

Надеется, что я не делала какую-то глупые математическую ошибку ...

 Смежные вопросы

  • Нет связанных вопросов^_^