redukcja Barretta
W arytmetyce modularnej redukcja Barretta to algorytm redukcji wprowadzony w 1986 roku przez PD Barretta. Naiwny sposób obliczania
byłoby użyć szybkiego algorytmu dzielenia . Redukcja to algorytm zaprojektowany do optymalizacji tej operacji, przy założeniu, dzielenie mnożenie.
Główny pomysł
Niech będzie odwrotnością jako liczby zmiennoprzecinkowej . Następnie
gdzie oznacza funkcję podłogi . Wynik jest dokładny, o ile z wystarczającą dokładnością.
Redukcja Barretta jednym słowem
Barrett początkowo rozważał całkowitą wersję powyższego algorytmu, gdy wartości pasują do słów maszynowych.
Podczas obliczania przy użyciu powyższej metody, ale z liczbami całkowitymi, oczywistym analogiem byłoby użycie dzielenia przez : n
func reduce ( a uint ) uint { q := a / n // Dzielenie niejawnie zwraca dolną część wyniku. zwróć a - q * n }
Jednak podział może być kosztowny, aw ustawieniach kryptograficznych może nie być instrukcją o stałym czasie na niektórych procesorach. Zatem redukcja Barretta jest zbliżona \ ^ słuszne -shift i tak jest tanio.
Aby obliczyć najlepszą wartość dla danego rozważ: m {\ displaystyle m}
Aby , zaokrąglić całkowitej da najlepsze przybliżenie, ale może spowodować, że co może Zatem jest powszechnie używany.
W ten sposób możemy przybliżyć powyższą funkcję za pomocą:
func reduce ( a uint ) uint { q := ( a * m ) >> k // ">> k" oznacza przesunięcie bitowe o k. zwróć a - q * n }
Jednakże, ponieważ w tej
funkcji może mała, a a
być w zakresie zamiast jak jest to ogólnie wymagane. Warunkowe odejmowanie poprawi to:
func reduce ( a uint ) uint { q := ( a * m ) >> k a -= q * n if n <= a { a -= n } return a }
Ponieważ jest to tylko przybliżenie, należy wziąć pod uwagę prawidłowy zakres Błąd przybliżenia wynosi:
Zatem błąd w wartości q
wynosi . Tak długo, jak ważna, więc za . Funkcja redukcji może nie dać od błędnej odpowiedzi, ale granice na poprawną odpowiedź w ogólnym
Wybierając większe wartości można zwiększyć zakres wartości, mogą powodować problemy z przepełnieniem w innych miejscach
Przykład
Rozważ przypadek podczas pracy z 16-bitowymi liczbami całkowitymi.
Najmniejsza wartość , która ma sens, to , ponieważ jeśli to redukcja będzie ważna tylko dla wartości które są już minimalne! Dla wartości siedem . Dla wartości ośmiu . Zatem przybliżenie w tym przypadku ( jest dokładnie takie samo jak . k , otrzymujemy jest lepszym przybliżeniem.
Teraz rozważymy prawidłowe zakresy wejściowe dla i . W pierwszym przypadku więc implikuje . Ponieważ , faktycznie maksymalna wartość to 478. (W praktyce funkcja działa dla wartości do 504).
Jeśli weźmiemy , to a więc maksymalna wartość to 7387. (W praktyce funkcja działa do 7473.)
Następna wartość , która daje lepsze przybliżenie, to 13, co daje . Należy jednak zauważyć, że wartość pośrednia obliczeniach przepełni wartość 16-bitową bez znaku, gdy a zatem lepiej sprawdza się w tej sytuacji.
Dowód na zakres dla określonego k
Niech będzie najmniejszą liczbą całkowitą taką, że . Weź jako rozsądną wartość dla w powyższych równaniach. Podobnie jak w powyższych fragmentach kodu, let
- i
- .
Ze względu na funkcję podłogi jest liczbą całkowitą i } . Ponadto, jeśli za k W takim przypadku zapisanie powyższych fragmentów jako wyrażenia:
Dowód na to jest następujący:
Jeśli , to
za Displaystyle , wynika, że
Wielowyrazowa redukcja Barretta
Główną motywacją Barretta do rozważenia redukcji była implementacja RSA , gdzie omawiane wartości prawie na pewno przekroczą rozmiar słowa maszynowego. W tej sytuacji Barrett dostarczył algorytm, który przybliża powyższą wersję jednowyrazową, ale dla wartości wielowyrazowych. Aby uzyskać szczegółowe informacje, patrz sekcja 14.3.3 Podręcznika Kryptografii Stosowanej .
Algorytm Barretta dla wielomianów
Możliwe jest również użycie algorytmu Barretta do dzielenia wielomianów, poprzez odwrócenie wielomianów i zastosowanie arytmetyki X-adic.
Zobacz też
- Redukcja Montgomery'ego to kolejny podobny algorytm.
Źródła
- Bosselaers, A.; Govaerts, R.; Vandewalle, J. (1993). „Porównanie trzech modułowych funkcji redukcji” . W Stinson, Douglas R. (red.). Postępy w kryptologii — Crypto'93 . Notatki z wykładów z informatyki. Tom. 773. Zygmunt. s. 175–186. CiteSeerX 10.1.1.40.3779 . ISBN 3540483292 .
- Hasenplaugh, W.; Gaubatz, G.; Gopal, V. (2007). „Szybka redukcja modułowa” (PDF) . 18. Sympozjum IEEE na temat arytmetyki komputerowej (ARITH'07) . s. 225–9. doi : 10.1109/ARITH.2007.18 . ISBN 978-0-7695-2854-0 . S2CID 14801112 .