LINUX.ORG.RU

a*b mod m


0

0

Есть 3 32 разрядных числа a, b и m. Можно-ли вычислить значение выражения a*b mod m, не выходя за рамки 32-разрядных чисел?

★★★★
Ответ на: комментарий от CMEPTb_C_KOCOiiii

И вообще, что на алгебру в универе ходить не модно стало?

Обычная группа вычетов по модулю m. Или я что-то путаю?

CMEPTb_C_KOCOiiii
()
Ответ на: комментарий от CMEPTb_C_KOCOiiii

ну это в общем-то и происходит. и пары я не прогуливал. Тут скорее не математическая задача. Нужен некий алгоритмический трюк.

alexru ★★★★
() автор топика

Уважаемый alexru!

А вы можете озвучить выражение a*b mod m ?

Ибо деление по модулю/кольца вычетов не есть mod или % в языках программирования...

anonymous
()

>Есть 3 32 разрядных числа a, b и m. Можно-ли вычислить значение выражения a*b mod m, не выходя за рамки 32-разрядных чисел?

Первое, что приходит на ум - взять двоичное разложение b

b = sum(b_i * 2^i, i=0..N);

тогда (a*b) mod c = sum(a*b_i*(2^i) mod c, i=0..N)

a*(2^i) mod c = ((a*2 mod c)*2 mod c)...

ival ★★
()
Ответ на: комментарий от anonymous

Не знал таких тонкостей.

Нужно выполнить сишную операцию (a*b) % m. В 32-х разрядных числах.

alexru ★★★★
() автор топика
Ответ на: комментарий от grob

Записал это на си так: (a*(b % 2) % m + 2*(a*(b>>1) % m)) % m. Сходу не заработало. Как получилось это выражение ?

alexru ★★★★
() автор топика
Ответ на: комментарий от alexru

> пары я не прогуливал

> Формула судя по всему верная (на калькуляторк все сходится)

мдяяя

grob ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.