Wpisany przez Tomasz Lubiński,
13 listopada 2006 23:59
W niektórych przypadkach mamy potrzebę obliczenia wartości a mod n dla bardzo dużej liczby a. Tak dużej, że nie można jej przechowywać w zmiennej całkowitoliczbowej, a jedynie jako tekst. Nawet dla tak dużych liczb jesteśmy w stanie obliczyć wartość modulo. Tak wielką liczbę możemy podzielić na kilka mniejszych łańcuchów a następnie obliczać wartość modulo dla częsci od lewej do prawej strony, za każdym razem doklejając (łącząc łańcuchy) do kolejnej częsci wynik z poprzedniej. W ten sposób jesteśmy w stanie obliczyć wartość modulo dla praktycznie dowolnie dużej liczby wejściowej a. Algorytm zapisany w pseudokodzie wygląda następująco (założymy, że długość łańcuchów, na które dzielimy liczbę wejściową to 1), znak "+" oznacza tutaj łączenie łancuchów np: "1" + "2" = "12":
wynik = "";
for i=1 to length(a)
begin
wynik = wynik + a[i];
wynik = wynik mod n;
end;
Obliczymy następującą wartość 1295302 mod 7
Bierzemy zatem pierwszą cyfrę z lewej i wykonujemy operacje modulo: 1 mod 7 = 1
Do wyniku z poprzedniego kroku dodajemy kolejną cyfrę (2) i dzielimy modulo: 12 mod 7 = 5
Dodajemy kolejną cyfrę (9) i znów dzielimy modulo: 59 mod 7 = 3
Do wyniku z poprzedniego kroku dodajemy kolejną cyfrę (5), wykonujemy kolejną operację modulo: 35 mod 7 = 0
Dodajemy kolejną cyfrę (3) i znów dzielimy modulo: 3 mod 7 = 3
Dodajemy kolejną cyfrę (0) i znów dzielimy modulo: 30 mod 7 = 2
Dodajemy kolejną cyfrę (2) i znów dzielimy modulo: 22 mod 7 = 1
Zatem ostateczny wynik to: 1295302 mod 7 = 1
wynik = "";
for i=1 to length(a)
begin
wynik = wynik + a[i];
wynik = wynik mod n;
end;
Przykład:
Obliczymy następującą wartość 1295302 mod 7
Bierzemy zatem pierwszą cyfrę z lewej i wykonujemy operacje modulo: 1 mod 7 = 1
Do wyniku z poprzedniego kroku dodajemy kolejną cyfrę (2) i dzielimy modulo: 12 mod 7 = 5
Dodajemy kolejną cyfrę (9) i znów dzielimy modulo: 59 mod 7 = 3
Do wyniku z poprzedniego kroku dodajemy kolejną cyfrę (5), wykonujemy kolejną operację modulo: 35 mod 7 = 0
Dodajemy kolejną cyfrę (3) i znów dzielimy modulo: 3 mod 7 = 3
Dodajemy kolejną cyfrę (0) i znów dzielimy modulo: 30 mod 7 = 2
Dodajemy kolejną cyfrę (2) i znów dzielimy modulo: 22 mod 7 = 1
Zatem ostateczny wynik to: 1295302 mod 7 = 1
Implementacje
Autor | Język programowania | Komentarz | Otwórz | Pobierz | Ocena |
Tomasz Lubiński | Ada | .ada | .ada | ***** / 2 | |
Tomasz Lubiński | C/C++ | .cpp | .cpp | ***** / 5 | |
Marian | C/C++ | C++ | .cpp | .cpp | ***** / 11 |
Tomasz Lubiński | Delphi/Pascal | .pas | .pas | ***** / 3 | |
Tomasz Lubiński | Java | .java | .java | ***** / 3 | |
tmarcin | Matlab | .mat | .mat | ***** / 2 |
Poprawiony: 26 maja 2010 22:30
Co z przypadkiem np.: 12953043543643453453453454352 mod 7435346346455543534?
Jaki algorytm nadaje się do takiego działanie?
Pozdrawiam
gdzie:
X = 100'000 cyfr
Y = 20'000 cyfr