Wpisany przez Tomasz Lubiński
wtorek, 14 listopada 2006 00:02
Powiedzmy, że chcemy obliczyć wartość ab mod n. Jak to zrobić, gdy wartość ab przekracza wartość mogącą pomieścić się w zmiennej całkowitoliczbowej?
Po pierwsze jeżeli a ≥ n to wówczas najpierw obliczymy wartość a mod n a następnie dopiero ją będziemy podnosić do potęgi b. Jeżeli a jest bardzo duże możemy posłużyć się operacją modulo na dużych liczbach.
Dalej zakładamy, że wynik jest równy 1, a następnie mnożymy go b razy przez a, przy czym po każdym mnożeniu wynik dzielimy modulo n.
W pseudo kodzie całą operację potęgowania modulo można zapisać następująco:
result = 1;
a = a mod n;
for i=1 to b do
begin
result = result * a;
result = result mod n;
end;
Schemat blokowy przedstawionego algorytmu wygląda następująco:
Matematycznie wygląda to tak:
ab mod n = (...(((a mod n) * a mod n) * a mod n) ...* a mod n)
Przykład
Obliczmy 124 mod 7
A więc najpierw obliczymy 12 mod 7 = 5
Teraz wykonamy pierwsze mnożenie 1 * 5 = 5, wynik podzielimy modulo: 5 mod 7 = 5
Wynik z poprzedniego działania znów pomnożymy razy pięć. 5 * 5 = 25, wynik podzielimy modulo: 25 mod 7 = 4
Teraz wykonamy trzecie mnożenie 4 * 5 = 20, wynik podzielimy modulo: 20 mod 7 = 6
I w końcu czwarte mnożenie 6 * 5 = 30, wynik podzielimy modulo: 30 mod 7 = 2
Zatem ostateczny wynik to: 124 mod 7 = 2
Po pierwsze jeżeli a ≥ n to wówczas najpierw obliczymy wartość a mod n a następnie dopiero ją będziemy podnosić do potęgi b. Jeżeli a jest bardzo duże możemy posłużyć się operacją modulo na dużych liczbach.
Dalej zakładamy, że wynik jest równy 1, a następnie mnożymy go b razy przez a, przy czym po każdym mnożeniu wynik dzielimy modulo n.
W pseudo kodzie całą operację potęgowania modulo można zapisać następująco:
result = 1;
a = a mod n;
for i=1 to b do
begin
result = result * a;
result = result mod n;
end;
Schemat blokowy przedstawionego algorytmu wygląda następująco:
Matematycznie wygląda to tak:
ab mod n = (...(((a mod n) * a mod n) * a mod n) ...* a mod n)
Przykład
Obliczmy 124 mod 7
A więc najpierw obliczymy 12 mod 7 = 5
Teraz wykonamy pierwsze mnożenie 1 * 5 = 5, wynik podzielimy modulo: 5 mod 7 = 5
Wynik z poprzedniego działania znów pomnożymy razy pięć. 5 * 5 = 25, wynik podzielimy modulo: 25 mod 7 = 4
Teraz wykonamy trzecie mnożenie 4 * 5 = 20, wynik podzielimy modulo: 20 mod 7 = 6
I w końcu czwarte mnożenie 6 * 5 = 30, wynik podzielimy modulo: 30 mod 7 = 2
Zatem ostateczny wynik to: 124 mod 7 = 2
| Autor | Język programowania | Komentarz | Otwórz | Pobierz | Ocena |
| Tomasz Lubiński | Ada | ![]() | ![]() |
![]() ![]() ![]() ![]() / 1 | |
| Tomasz Lubiński | C# | MS Visual Studio .net | ![]() | ![]() |
![]() ![]() ![]() ![]() / 1 |
| Tomasz Lubiński | C/C++ | ![]() | ![]() |
![]() ![]() ![]() ![]() / 1 | |
| Marian | C/C++ | C++ | ![]() | ![]() |
![]() ![]() ![]() ![]() / 1 |
| Tomasz Lubiński | Delphi/Pascal | ![]() | ![]() |
![]() ![]() ![]() ![]() / 1 | |
| Tomasz Lubiński | Java | ![]() | ![]() |
![]() ![]() ![]() ![]() / 1 | |
| _marass_ | Php | ![]() | ![]() |
![]() ![]() ![]() ![]() / 1 |
Poprawiony: środa, 26 maja 2010 22:31



/ 1



