2015-08-06 6 views
6

Sto cercando di scrivere una funzione che risponde alla domanda: se si inizia a contare a a e smettere di contare a b, è c in tale intervallo (alias è c tra a e b).algoritmo per determinare se il numero è tra due numeri in aritmetica modulare

Normalmente a < c && c < b sarebbe sufficiente, ma sono in aritmetica modulare:

(Diagram)

senso antiorario è in aumento.

colori verdi: sono valori per c in cui l'algoritmo dovrebbe indicare vero (dove c è tra A e B)

colori

blu: sono i valori per c in cui l'algoritmo dovrebbe indicare falso (dove c non è tra un e b) (che risulta essere uguale a dove c è tra b ed un)

la semplice a < c && c < b fallisce in cui la gamma di a e b croci superiore a 0.

ad esempio, supponiamo a = 300 e B = 45. Se C è 10 quindi la funzione deve restituire true: , 301, 302 ... 359, 0, 1, 2, 3 ... 8, 9, , 11, 12 ... 43, 44, . Pertanto, 10 è tra 300 e 45 in mod 360.

In definitiva, quello che sto cercando di determinare è se una tonalità è tra due altre tonalità, dove le tonalità sono specificate in gradi attorno a una ruota dei colori (che è una mod Sistema 360). Sarebbe bello se la risposta fosse in termini di mod n in modo da risolvere il caso generale e non essere specifico del mio problema.

+0

Penso che ci sono 3 casi: a≤x≤b O b≤a≤x O x≤b≤a (assumendo i numeri sono in forma canonica 0≤a, b , x

risposta

4

Prima calc ul. a mod n, b mod n e c mod n.

Se a < b allora dobbiamo controllare che a < c && c < b. Questo è il caso in cui l'aritmetica modulare non gioca un ruolo enorme.

Poiché [a, b] e [b, a] formano regioni disgiunte, invece di provare a gestire il problema dell'incrocio di 0, possiamo verificare il contrario per i casi in cui b < a. Se b < c && c < a è vero, c è in realtà tra b e a e quindi non tra a e b.

Esempio di codice:

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

Il numero sarà compreso tra i due numeri indicati se delle seguenti tre condizioni è soddisfatto o.

Condizione 1:

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

Condizione 2:

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

Condizione 3:

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

Funziona, ma perché? –

+0

@KevinJohnson La prima condizione è semplice. –

+0

@KevinJohnson La seconda e terza condizione gestisce il caso dell'aritmetica del modulo. Prendi alcuni esempi e sarà chiaro. –

Problemi correlati