Algorytm chyba mówi coś takiego:
x ≡ 1 (mod N) # x is congruent to 1 (modulo N)
The (mod N)
i potrójnych znaku równości oznaczają, że pracujesz z arytmetyki modularnej, nie jest normalne arytmetycznej. Pomyśl o tym jak o zegarach. W arytmetykach modułowych x ≡ 1
oznacza, że x
i 1
należą do tego samego residue class. Jeśli masz zegar z podziałem godzinowym N
, obrót czasu o 1
lub x
spowoduje przesunięcie ręki do tej samej pozycji końcowej.
dla konkretnego przypadku, x ≡ 1 (mod N)
może być reprezentowana jako x % N === 1
w JavaScript jeśli x
nigdy nie jest ujemny. W przeciwnym razie twoja równość nie będzie się utrzymywać, chociaż powinna: na przykład -1 ≡ 1 (mod 2)
, ale (-1) % 2 === -1
, która nie jest równa 1
, mimo że są one "równe" w modułowym znaczeniu arytmetycznym.
Jeśli oczekujesz x
być ujemny, można po prostu przestawić kongruencją:
x ≡ 1 (mod N)
⇒ x - 1 ≡ 0 (mod N)
x - 1
będąc przystające do 0
oznacza, że jest podzielna przez samą N
, więc można użyć operatora modulo bezpiecznie:
if ((x - 1) % N === 0) {
...
}
"1 modulo coś (lub 1% N) wynosi 1" - chyba N wynosi 1, w takim przypadku wynik wynosi zero. –
Kluczową rzeczą do zrozumienia jest to, że w notacji matematycznej '(mod n)' odnosi się do * obu * boków wyrażenia, nawet , chociaż zwykle jest napisane tylko po prawej stronie (patrz [Confused about modular notations] (http://math.stackexchange.com/questions/78367/confused-about-modular-notations)). Tak więc, wychodząc z odpowiedzi @ Blendera, wyrażenie 'a ≡ 1 (mod N)' powinno być odczytywane jako "' a ≡ 1' kiedy system jest wzięty 'modulo N'" lub 'a% N == 1 % N' (lub po prostu 'a% N == 1', ponieważ' 1% N' zawsze ma wartość 1). – sevko