2011-11-17 11 views
7

Quando si eseguono calcoli modulo n con numeri grandi, si verificheranno enormi penalità per le prestazioni quando si fa, ad esempio, mod (123456789^987654321) n. Invece devi usare il tuo ^ che calcola internamente mod n anche per i calcoli di intermediazione.Calcolo espressioni modulo n

Certo, posso facilmente implementare le mie funzioni, ma poi devo dire esplicitamente "mod n" per ogni operazione. Invece si potrebbe costruire un albero di espressioni numeriche e rimandare i calcoli reali, e nello stato di fine modulo n solo una volta. (vedi il mio codice qui sotto)

Ho iniziato su questo per mostrare chiaramente cosa intendo, ma mi chiedo se esista già implementazioni di questo, sembra abbastanza utile quindi qualcuno dovrebbe averlo implementato.

module Modulo where 

data Expr = 
    V Integer 
    | Plus Expr Expr 
    | Mult Expr Expr 
    deriving (Eq, Show) 

instance Num Expr where 
    (+) = Plus 
    (*) = Mult 
    fromInteger = V 

eval :: Integer -> Expr -> Integer 
eval m (V i) = i `mod` m 
eval m (Plus e1 e2) = (eval m e1 + eval m e2) `mod` m 
eval m (Mult e1 e2) = (eval m e1 * eval m e2) `mod` m 

fifteen :: Expr 
fifteen = 10 + 5 

test = eval 13 fifteen 
+2

Avete bisogno che il 'm' in' mod m 'sia modificabile in fase di runtime, o è sufficiente averlo risolto in fase di compilazione? Se il tempo di compilazione è un caso sufficiente, si potrebbe semplicemente definire un'istanza 'Num' modulo-aritmetica per qualche newtype'd' Integer' ... – hvr

+0

Voglio che sia modificabile in fase di runtime. Scusa, avrei dovuto dirlo. – Tarrasch

risposta

3

Oleg fatto qualcosa di questo genere, in cui si effettua un'istanza per l'aritmetica modulo, ma per un modulo arbitrario. Implicit configurations.

+0

Non capisco. Stai collegando a un documento scientifico o a un'implementazione reale? Se si tratta di un'implementazione, puoi fornire un esempio di codice? – Tarrasch

+1

Ti sei preoccupato di controllare il link? Ha la carta e anche un'implementazione. C'è anche un file README che descrive cosa contengono i file. – augustss

+0

Ho sfogliato l'abstract sulla pagina web e non ho trovato nulla riguardo al modulo, apparentemente la teoria era più profonda di quella che aveva incontrato per la prima volta l'occhio. Ora ho trovato l'implementazione e la carta. Hai assolutamente ragione, era quello che stavo cercando. Scusa per il mio accigliamento iniziale, ho pensato che qualcuno avrebbe collegato un repository github, non un documento. – Tarrasch