2015-08-06 9 views
6

Ich versuche, eine Funktion zu schreiben, die die Frage beantwortet: Wenn Sie bei a Zählen starten und stoppen bei b zu zählen, ist c in diesem Bereich (aka c zwischen a und b).Algorithmus zu bestimmen, ob Zahl zwischen zwei Zahlen in der modularen Arithmetik ist

Normalerweise a < c && c < b würde genügen, aber ich bin in der modularen Arithmetik:

(Diagram)

gegen den Uhrzeigersinn zunimmt.

Grün Farben: Werte für c sind, wo der Algorithmus wahr zeigen sollte (wobei c zwischen a und b)

Blauen Farben: sind Werte für c, wo der Algorithmus sollte falsch angeben (wobei c nicht zwischen a und b) (was passiert, die gleiche sein, wie wobei c zwischen b und einem)

die einfachen a < c && c < b ausfällt, wo der Bereich von a und b kreuzen 0.

Angenommen, A = 300 und B = 45. Wenn C ist 10, dann sollte die Funktion wahr werden: , 301, 302 ... 359, 0, 1, 2, 3 ... 8, 9, , 11, 12 ... 43, 44, . Daher ist 10 zwischen 300 und 45 in Mod 360.

Letztlich, was ich versuche zu bestimmen ist, wenn ein Farbton zwischen zwei anderen Farbtönen ist, wo Farbtöne in Grad um ein Farbrad (das ist ein Mod 360 System). Es wäre großartig, wenn die Antwort in Form von Mod wäre, also würde es den allgemeinen Fall lösen und nicht spezifisch für mein Problem sein.

+0

ich dort denken sind drei Fälle: a≤x≤b OR b≤a≤x OR x≤b≤a (vorausgesetzt, die Zahlen in kanonischer Form 0 ≤ a sind, b , x

Antwort

4

Erste calc late a mod n, b mod n und c mod n.

Wenn a < b dann müssen wir überprüfen, dass a < c && c < b. Dies ist der einfache Fall, in dem die modulare Arithmetik keine große Rolle spielt.

Da [a, b] und [b, a] disjunkte Regionen bilden, anstatt zu versuchen, das Problem der Kreuzung von 0 zu lösen, können wir das Umgekehrte für Fälle mit b < a testen. Wenn b < c && c < a wahr ist, ist c tatsächlich zwischen b und a und daher nicht zwischen a und b.

Codebeispiel:

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

Die Nummer wird zwischen den angegebenen zwei Zahlen liegen, wenn entweder der folgenden drei Bedingungen erfüllt ist.

Bedingung 1:

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

Bedingung 2:

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

Bedingung 3:

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

Das funktioniert, aber warum? –

+0

@KevinJohnson Die erste Bedingung ist geradlinig. –

+0

10 @KevinJohnson Die zweite und dritte Bedingung behandelt den Fall der Modulo-Arithmetik. Nehmen Sie nur einige Beispiele und es wird klar sein. –