Algorytmika Praktyczna Algorytmy teorioliczbowe dr in Szymon Wsik
Algorytmika Praktyczna Algorytmy teorioliczbowe dr inż. Szymon Wąsik mgr inż. Artur Laskowski
Arytmetyka modularna Operacje dodawania, odejmowania i mnożenia modulo można upraszczać: (a * b) mod n = = ((a mod n) * (b mod n)) mod n (a * b * c) mod n = = (((a * b) mod n) * c) mod n ● Maksymalna liczba, która będzie używana to (n-1)2 ●
Arytmetyka modularna Przykład: (143 * 220 + 19) % 7 = (((143 % 7) * (220 % 7) + 19 % 7) % 7 = ((3 * 3)%7 + 5) % 7 = (9 % 7 + 5) % 7 = (2 + 5) % 7 = 0
Przykład – silnia mod p int silnia(int n, int p) { int res = 1; for (int i = 2; i <= n; i++) { res *= i % p; res %= p; } return res; }
Euclides - przypomnienie ● Znajdowanie największego wspólnego dzielnika liczb (NWD) int nwd(int a, int b) { return b ? nwd(b, a % b) : a; } ● Jeżeli NDW(a, b) = 1, to mówimy że liczby są względnie pierwsze
Rozszerzony Euclides Znajdowanie liczb d, x, y takich że: d = NDW(a, b) = ax + by ● Na przykład: NWD(99, 78) = 3 x = -11 y = 14 bo: 3 = -11 * 99 + 14 * 78 ●
Rozszerzony Euclides void nwd(int a, int b, int &d, int &x, int &y){ if (b == 0) { d = a; x = 1; y = 0; return; } nwd(b, a % b, d, x, y); int tmp = y; y = x - (a / b) * y; x = tmp; }
Liniowe równania modularne ● ● Znaleźć x takie, że: ax (mod n) = b (mod n) Niech d = NWD(a, n), wtedy: ● ● ● Równanie ma rozwiązanie wtedy i tylko wtedy, kiedy d | b (d jest dzielnikiem b) Równanie ma dokładnie d różnych rozwiązań (modulo n) W szczególności, gdy b = 1, liczbę x nazywamy odwrotnością modularną (multiplikatywną) liczby a (istnieje tylko jedna), np. : ● (3 * 5) mod 7 = 1
Liniowe równania modularne Znajduje najmniejsze int solve_linear_equation rozwiązanie równania (int a, int b, int n) { int d, x, y, x 0, res; Wykorzystujemy rozszerzonego Euclidesa nwd(a, n, d, x, y); if(b % d != 0) return -1; x 0 = ((x * (b / d)) % n + n) % n; res = x 0; FOR(i, d) res <? = (x 0 + i * (n / d)) % n; return res; Wszystkie przeglądane } liczby są rozwiązaniami
Małe twierdzenie Fermata ● Jeżeli liczba p jest liczbą pierwszą, to dla każdej liczby całkowitej a zachodzi: ap-1 mod p = 1
Układy równań liniowych ● Dany jest układ równań liniowych: ● Należy znaleźć rozwiązanie układu, o ile istnieje
Eliminacja Gaussa ● Przekształcenie macierzy współczynników A: ● W macierz trójkątną górną C:
Eliminacja Gaussa ● Implementacja – dość karkołomna, patrz np. : ● Stańczyk ● Szczególne przypadki: ● Ciało Z 2 – dla arytmetyki binarnej ● Ciało Zp – w arytmetyce modularnej modulo p, zamiast dzielenia wykorzystywana odwrotność modularna
Algorytmy aproksymacyjne ● ● Wyznaczają rozwiązanie przybliżone z gwarancją jakości (np. nie gorsze niż 120% minimalnego) Schemat aproksymacyjny (AS) – umożliwia znalezienie rozwiązania dla dowolnej gwarancji jakości Wielomianowy schemat aproksymacyjny (PTAS) – algorytm działa wielomianowo względem rozmiaru instancji W pełni wielomianowy schemat aproksymacyjny (FPTAS) – algorytm działa wielomianowo względem rozmiaru instancji i gwarancji jakości
Problem sumy podzbioru ● ● Dany jest zbiór n liczb. Czy istnieje jego podzbiór o sumie elementów równej t? Rozwiązanie wykładnicze: Utrzymujemy zbiór wszystkich możliwych sum podzbiorów ● Zaczynamy od zbioru A={0} ● Dodajemy kolejne elementy x dla każdego z nich zwiększając dwukrotnie liczbę elementów w A (dodając do każdego x lub nie) ●
Problem sumy podzbioru ● Dla zbioru {1, 4, 5} mamy: ● A={0} ● A={0; 0+1}={0; 1} ● A={0; 0+4; 1; 1+4}={0; 1; 4; 5} ● A={0; 0+5; 1; 1+5; 4; 4+5; 4; 5+5}= ={0; 1; 4; 5; 6; 9; 10}
Problem sumy podzbioru - FPTAS Nie utrzymujemy na liście elementów większych od t ● Nie utrzymujemy na liście elementów ax, takich, że: (ax- ax-1)/ax < d ● ● Np. listę ={0; 1; 4; 5; 6; 9; 10} dla d=25% można zredukować do {0; 1; 4; 6; 9}
- Slides: 17