Форум — Development a*b mod m 0 0 Есть 3 32 разрядных числа a, b и m. Можно-ли вычислить значение выражения a*b mod m, не выходя за рамки 32-разрядных чисел? Ссылка
a*b mod c = (a mod c) * (b mod c) mod c CMEPTb_C_KOCOiiii (15.10.06 17:59:21 MSD) Показать ответы Ссылка
Ответ на: комментарий от CMEPTb_C_KOCOiiii 15.10.06 17:59:21 MSD И вообще, что на алгебру в универе ходить не модно стало? Обычная группа вычетов по модулю m. Или я что-то путаю? CMEPTb_C_KOCOiiii (15.10.06 18:01:41 MSD) Ссылка
Ответ на: комментарий от CMEPTb_C_KOCOiiii 15.10.06 17:59:21 MSD Хм, а если (a mod c) * (b mod c) в 32 бита не влазит? CMEPTb_C_KOCOiiii (15.10.06 18:18:22 MSD) Показать ответ Ссылка
Ответ на: комментарий от CMEPTb_C_KOCOiiii 15.10.06 18:18:22 MSD ну это в общем-то и происходит. и пары я не прогуливал. Тут скорее не математическая задача. Нужен некий алгоритмический трюк. alexru ★★★★ (15.10.06 19:50:15 MSD) автор топика Ссылка
Уважаемый alexru! А вы можете озвучить выражение a*b mod m ? Ибо деление по модулю/кольца вычетов не есть mod или % в языках программирования... anonymous (15.10.06 22:58:07 MSD) Показать ответ Ссылка
>Есть 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 ★★ (16.10.06 00:31:52 MSD) Показать ответ Ссылка
Ответ на: комментарий от ival 16.10.06 00:31:52 MSD a*b mod m = (a*(b mod 2) mod m + 2*(a*(b div 2) mod m)) mod m grob ★★★★★ (16.10.06 06:15:22 MSD) Показать ответы Ссылка
Ответ на: комментарий от anonymous 15.10.06 22:58:07 MSD Не знал таких тонкостей. Нужно выполнить сишную операцию (a*b) % m. В 32-х разрядных числах. alexru ★★★★ (16.10.06 09:39:27 MSD) автор топика Ссылка
Ответ на: комментарий от grob 16.10.06 06:15:22 MSD Записал это на си так: (a*(b % 2) % m + 2*(a*(b>>1) % m)) % m. Сходу не заработало. Как получилось это выражение ? alexru ★★★★ (16.10.06 09:43:15 MSD) автор топика Ссылка
Ответ на: комментарий от grob 16.10.06 06:15:22 MSD Формула судя по всему верная (на калькуляторк все сходится), но тоже переполняется. alexru ★★★★ (16.10.06 09:50:07 MSD) автор топика Показать ответы Ссылка
Ответ на: комментарий от alexru 16.10.06 09:50:07 MSD a*(b>>1) % m надо рекурсивно считать grob ★★★★★ (16.10.06 10:47:32 MSD) Показать ответ Ссылка
Ответ на: комментарий от alexru 16.10.06 09:50:07 MSD > пары я не прогуливал > Формула судя по всему верная (на калькуляторк все сходится) мдяяя grob ★★★★★ (16.10.06 10:52:57 MSD) Ссылка
Ответ на: комментарий от grob 16.10.06 10:47:32 MSD Я догадался. Спасибо. alexru ★★★★ (16.10.06 11:52:16 MSD) автор топика Ссылка