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ż

Źródła