Nietypowe równanie modulo i jego poszukiwany parametr

Podzielność. Reszty z dzielenia. Kongruencje. Systemy pozycyjne. Równania diofantyczne. Liczby pierwsze i względnie pierwsze. NWW i NWD.
Morfeo
Użytkownik
Użytkownik
Posty: 32
Rejestracja: 8 wrz 2015, o 19:21
Płeć: Mężczyzna
Lokalizacja: z daleka
Podziękował: 1 raz

Nietypowe równanie modulo i jego poszukiwany parametr

Post autor: Morfeo »

Mam problem.

Poszukujemy określonego \(\displaystyle{ k}\) dla którego równanie:

\(\displaystyle{ (a \cdot k) \% z = y}\)

ma określoną wartość (tj. \(\displaystyle{ y}\)).

\(\displaystyle{ a}\), \(\displaystyle{ y}\) i \(\displaystyle{ z}\) jest dane. Szukamy \(\displaystyle{ k}\).

Dla przykładu niech

\(\displaystyle{ a = 3}\), \(\displaystyle{ y = 2}\) i \(\displaystyle{ z = 11}\)

Prawidłowy wynik otrzymamy dla \(\displaystyle{ k = 8}\):

\(\displaystyle{ (3 \cdot 8) \% 11 = 2}\)

Czy istnieje jakiś sposób aby szybko obliczyć \(\displaystyle{ k}\) mając komplet pozostałych danych?
Mi przychodzi do głowy tylko sposób trywlalny gdzie obliczamy wszystkie możliwości modulo i po drodze szukamy potrzebnego rezultatu. Niestety w tym przypadku musimy obliczyć dla powyższego przypadku sporo równań (k od 1 do 10). Dla liczb wielkości \(\displaystyle{ z = 10^{100}}\) jest to już niewykonalne na komputerze.

Może ma ktoś jakiś pomysł?
Awatar użytkownika
Premislav
Użytkownik
Użytkownik
Posty: 15687
Rejestracja: 17 sie 2012, o 13:12
Płeć: Mężczyzna
Lokalizacja: Warszawa
Podziękował: 196 razy
Pomógł: 5221 razy

Nietypowe równanie modulo i jego poszukiwany parametr

Post autor: Premislav »

Jeżeli \(\displaystyle{ \NWD(a,z)=1}\), to za pomocą rozszerzonego algorytmu Euklidesa możesz znaleźć
element odwrotny do \(\displaystyle{ a}\) względem mnożenia modulo \(\displaystyle{ z}\) (tj. takie działanie: normalnie mnożymy liczby, a potem bierzemy resztę z dzielenia tego iloczynu przez \(\displaystyle{ z}\)).
Jeżeli \(\displaystyle{ \NWD(a,z)=r>1}\), to:
-jeśli \(\displaystyle{ r}\) dzieli \(\displaystyle{ y}\), to dzielimy kongruencję stronami;
w przeciwnym przypadku kongruencja nie ma rozwiązań.

Przedstawię przykład na podstawie tamtego konkretnego zadanka:
\(\displaystyle{ (3\cdot k)\%11=2}\)
Mamy (alogrytm Euklidesa):
\(\displaystyle{ 11=3\cdot 3+2\\3=1\cdot 2+1}\)
zatem \(\displaystyle{ 1=3-1\cdot 2=3-1\cdot(11-3\cdot 3)=4\cdot 3-1\cdot 11}\), więc
\(\displaystyle{ 11+1={\red 4}\cdot 3 \equiv 1_pmod{11}}\).
Zaczerwienione to jest nasz element odwrotny. Mnożymy stronami kongruencję przez tenże element
i redukujemy wielokrotności \(\displaystyle{ 11}\) (bo nie mają one znaczenia dla reszty z dzielenia przez 11):
\(\displaystyle{ (4\cdot 3\cdot k)\%11=8\\ (11k+k)\%11=8\\k\%11=8}\),
czyli na przykład \(\displaystyle{ k=8}\) jest rozwiązaniem (rozwiązań jest nieskończenie wiele i każde jest postaci \(\displaystyle{ 11l+8}\) dla pewnego l całkowitego).

Aha, jeszcze problem może być w implementacji tego, bo informatyczne \(\displaystyle{ \%}\) to nie dokładnie to samo, co normalne działanie na resztach, bo jeszcze mogą być dopuszczone reszty ujemne. Dlatego pewnie lepiej użyć np. funkcji fmod z biblioteki cmath.-- 22 cze 2016, o 18:07 --lol, to sobie od razu założyłem, że jeśli ktoś programuje, to na pewno w C++. Dobra, lepiej pominąć tę moją uwagę, bo nie znam się na programowaniu i mogła ona być bardzo głupia...
Morfeo
Użytkownik
Użytkownik
Posty: 32
Rejestracja: 8 wrz 2015, o 19:21
Płeć: Mężczyzna
Lokalizacja: z daleka
Podziękował: 1 raz

Nietypowe równanie modulo i jego poszukiwany parametr

Post autor: Morfeo »

Premislav pisze:lol, to sobie od razu założyłem, że jeśli ktoś programuje, to na pewno w C++. Dobra, lepiej pominąć tę moją uwagę, bo nie znam się na programowaniu i mogła ona być bardzo głupia...
Nie szkodzi W sumie to dość słusznie założyłeś

Mam jeszcze jedno pytanie.

Mamy hipotetyczne równanie: \(\displaystyle{ 2^{b} \% b == z}\).

Przyjmijmy, że znamy \(\displaystyle{ z}\) oraz \(\displaystyle{ b}\). Czyli wszystko! Chcemy wiedzieć tylko i wyłącznie czy powyższe równanie jest prawdziwe.

Nie chcę stosować potęgowania modulo - szukam jakiejś szybszej metody. Nie muszę znać dokładnej wartości \(\displaystyle{ 2^{b} \% k}\). Chcę tylko wiedzieć czy wynosi ona \(\displaystyle{ z}\).

Da się to zrobić bez trywialnego potęgowania modulo?
ODPOWIEDZ