2015-08-06 39 views
6

Próbuję napisać funkcję, która odpowiada na pytanie: jeśli zaczniesz liczyć na a i przestać liczyć na b, to c w tym zakresie (aka jest c między a i b).Algorytm do określenia, czy liczba jest między dwoma numerami w arytmetyce modularnej

Normalnie a < c && c < b wystarczyłoby, ale jestem w arytmetyce modularnej:

(Diagram)

Licznik ruchu wskazówek zegara zwiększa się.

Zielone kolory: są wartości dla C, gdzie algorytm powinien wskazać prawdziwe (gdzie c jest między A i B)

Błękitnych kolorach: są wartości dla C, gdzie algorytm powinien wskazywać fałszywe (gdzie c nie zawiera się między oraz b) (który okazuje się być taki sam jak gdzie c jest między b i)

prosta a < c && c < b zawodzi, gdy zakres a i b zazębia 0.

na przykład, że a = 300 i B = 45. Jeśli C jest 10, funkcja powinna zwrócić true: , 301, 302 ... 359, 0, 1, 2, 3 ... 8, 9, , 11, 12 ... 43, 44, . W związku z tym 10 wynosi od 300 do 45 w mod 360.

Ostatecznie próbuję ustalić, czy jeden odcień jest pomiędzy dwoma innymi odcieniami, gdzie odcienie są określone w stopniach wokół koła kolorów (co jest modem 360). Byłoby wspaniale, gdyby odpowiedź była w sensie mod n, więc rozwiązałoby to ogólny przypadek i nie było to jednak specyficzne dla mojego problemu.

+0

I, że istnieje 3 przypadki: a≤x≤b lub b≤a≤x lub x≤b≤a (przy założeniu, że liczby te są w postaci kanonicznej 0≤a b , x

Odpowiedz

4

pierwsze obliczono ulate a mod n, b mod n i c mod n.

Jeśli to a < b, musimy sprawdzić, czy a < c && c < b. Jest to prosty przypadek, w którym modułowa arytmetyka nie odgrywa ogromnej roli.

Ponieważ [a, b] i [b, a] tworzą rozłączne regiony, zamiast próbować rozwiązać problem przekroczenia 0, możemy przetestować odwrotność dla przypadków, w których b < a. Jeśli b < c && c < a jest prawdziwe, c jest faktycznie pomiędzy b a a, a więc nie między a i b.

próbki Kod:

a = a % n; // % = mod 
b = b % n; 
c = c % n; 

if (a < b) { 
    if (a < c && c < b) return true; 
    else return false; 
} else { // b < a 
    if (b < c && c < a) return false; // if in [b, a] then not in [a, b] 
    else return true; 
} 
1

Liczba będzie między podanymi dwoma liczbami, jeśli albo spełnienia trzech warunków.

Warunek 1:

c mod n > a mod n && c mod n < b mod n 

Warunek 2:

a mod n > b mod n && c mod n < b mod n. 

Warunek 3:

a mod n > b mod n && c mod n > a mod n. 
+0

To działa, ale dlaczego? –

+0

@KevinJohnson Pierwszy warunek jest prosty. –

+0

@KevinJohnson Drugi i trzeci warunek obsługuje przypadek arytmetyki modulo. Po prostu weź kilka przykładów i będzie jasne. –