2010-05-03 17 views
11

Questo linguaggio di script sciocco non ha un% o Mod(). Ho una correzione() che taglia fuori la parte decimale di un numero. Ho solo bisogno di risultati positivi, quindi non diventare troppo robusto.Come posso fare mod senza un operatore mod?

+2

Potresti menzionare e forse taggare quale linguaggio di script "sciocco" stai parlando? –

+0

Penso che sia un linguaggio sciocco chiamato "compiti" – Gareth

+1

Heh.È un linguaggio incorporato in questo lettore video con segnaletica digitale Roku. Probabilmente ha un Mod da qualche parte ma di certo non riesco a trovarlo e ha come Arctan() e NaturalLog() quindi sono davvero confuso su come hanno saltato Mod. – tladuke

risposta

19

Will

// mod = a % b 

c = Fix(a/b) 
mod = a - b * c 

fare? Suppongo che tu possa almeno dividere qui. Tutte le scommesse sono disattivate su numeri negativi.

+0

a seconda di ciò che si desidera per i numeri negativi, può essere regolato. c'è 'fix()' che tronca sempre e c'è 'int()' che va sempre verso il basso ('int (-2.5) = - 3') –

0

Questo non può funzionare per voi prestazioni-saggio, ma:

while (num >= mod_limit) 
    num = num - mod_limit 
+0

@tloflin, spero non ti dispiaccia, ma avrebbe dovuto essere" > = "anziché"> ". – paxdiablo

+0

@paxdiablo, vero, grazie. – tloflin

+3

non funzionando in termini di prestazioni, vuoi dire quando num è intorno a 2 ** 63 e mod_limit è 3? –

6

a mod n = a - (n * Fix(a/n))

1

Che lingua è?

Un algoritmo di base potrebbe essere:

hold the modulo in a variable (modulo); 
hold the target number in a variable (target); 
initialize modulus variable; 

while (target > 0) { 
    if (target > modulo) { 
    target -= modulo; 
    } 
    else if(target < modulo) { 
    modulus = target; 
    break; 
    } 
} 
+0

Penso che ci sia un errore nel caso in cui 'target == modulo'. Ciclo infinito. –

4

Ai posteri, BrightScript ha ora un operatore modulo, sembra che questo:

c = a mod b 
+0

Questo non fornisce una risposta alla domanda. –

+0

@MDXF - non fornisce risposta al * titolo * della domanda, ma le risposte materialmente sono: se leggi il corpo, dice "Questo linguaggio di script sciocco non ha una% o Mod()" - quello era il caso al 2010 ma non di più. –

0

in JavaScript:

function modulo(num1, num2) {  
    if (num2 === 0 || isNaN(num1) || isNaN(num2)) { 
    return NaN; 
    } 

    if (num1 === 0) { 
    return 0; 
    } 

    var remainderIsPositive = num1 >= 0; 

    num1 = Math.abs(num1); 
    num2 = Math.abs(num2); 

    while (num1 >= num2) { 
    num1 -= num2 
    } 

    return remainderIsPositive ? num1 : 0 - num1; 
} 
+4

Anche se questo snippet di codice può risolvere la domanda, [compresa una spiegazione] (// meta.stackexchange.com/questions/114762/explaining-entually-code-based-answers) aiuta davvero a migliorare la qualità del tuo post. Ricorda che stai rispondendo alla domanda per i lettori in futuro, e queste persone potrebbero non conoscere le ragioni del tuo suggerimento sul codice. Cerca anche di non affollare il tuo codice con commenti esplicativi, questo riduce la leggibilità sia del codice che delle spiegazioni! – kayess

1

Se qualcuno arriva più tardi, ecco alcuni algoritmi più effettivi (con errori ... leggi attentamente)

https://eprint.iacr.org/2014/755.pdf

realtà ci sono due tipi principali di formule di riduzione: Barett e Montgomery. La carta da ripetere ePrint sia in diverse versioni (algoritmi 1-3) e dare una versione "migliorata" in algoritmo 4.

Panoramica

do ora una panoramica del 4. dell'algoritmo:

1.) Calcola "A * B" e memorizza l'intero prodotto in "C" che C e il modulo $ p $ è l'input per quell'algoritmo.

2.) Calcola la lunghezza di bit di $ p $, ad esempio: la funzione "Larghezza (p)" restituisce esattamente quel valore.

3.) Dividere l'ingresso $ C $ in N "blocchi" di dimensione "Larghezza (p)" e memorizzarli in G. Inizio in G [0] = lsb (p) e finire in G [N- 1] = msb (p). (La descrizione è molto difettosa della carta)

4.) Avviare il ciclo while: Set N = N-1 (per raggiungere l'ultimo elemento) Precompute $ b: = 2^{width (p)} \ BMOD p $

while N>0 do: 
    T = G[N] 
    for(i=0; i<Width(p); i++) do: //Note: that counter doesn't matter, it limits the loop) 
     T = T << 1 //leftshift by 1 bit 
     while is_set(bit(T, Width(p))) do // (N+1)-th bit of T is 1 
      unset(bit(T, Width(p))) // unset the (N+1)-th bit of T (==0) 
      T += b 
     endwhile 
    endfor 
    G[N-1] += T 
    while is_set(bit(G[N-1], Width(p))) do 
     unset(bit(G[N-1], Width(p))) 
     G[N-1] += b 
    endwhile 
    N -= 1 
endwhile 

che fa molto. Non abbiamo solo bisogno di ridurre i recursivly G [0]:

while G[0] > p do 
    G[0] -= p 
endwhile 
return G[0]// = C mod p 

Gli altri tre algoritmi sono ben definiti, ma questo manca di alcune informazioni o presentiamo veramente sbagliato. Ma funziona per qualsiasi dimensione;)

+0

Ciao @shalec: non incoraggiamo le risposte che contengono solo collegamenti a risorse esterne. Queste [solo risposte-link sono scoraggiate] (https://meta.stackexchange.com/questions/8231/are-answers-that-just-contain-links-elsewhere-really-good-answers). – Lix

+0

Puoi copiare e incollare le parti rilevanti del PDF collegato nella tua risposta? Ciò migliorerebbe notevolmente la qualità di questo post. –

+0

Di causa. Ci sono 4 algoritmi menzionati. Modificherò quelli. – Shalec