2010-05-03 13 views
11

Este lenguaje de scripting tonto no tiene un% o Mod(). Tengo un Fix() que corta la parte decimal de un número. Solo necesito resultados positivos, así que no seas demasiado fuerte.¿Cómo puedo hacer mod sin un operador de mod?

+2

¿Podría mencionar y quizás etiquetar de qué lenguaje de guión "tonto" está hablando? –

+0

Creo que es un lenguaje tonto llamado "tarea" – Gareth

+1

Heh.Es un lenguaje incrustado en este reproductor de video de señalización digital Roku. Es probable que tenga un Mod en alguna parte, pero estoy seguro de que no puedo encontrarlo y tiene Arctan() y NaturalLog(), así que estoy realmente confundido de cómo se saltaron Mod. – tladuke

Respuesta

19

va a hacer

// mod = a % b 

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

? Supongo que al menos puedes dividir aquí. Todas las apuestas están apagadas en números negativos.

+0

dependiendo de lo que quiere para números negativos, se puede ajustar. hay 'fix()' que siempre trunca y hay 'int()' que siempre redondea hacia abajo ('int (-2.5) = - 3') –

0

Esto puede no funcionar para usted en cuanto al rendimiento, pero:

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

@tloflin, espero que no te importe, pero debería haber sido" > = "en vez de"> ". – paxdiablo

+0

@paxdiablo, cierto, gracias. – tloflin

+3

al no funcionar en cuanto al rendimiento, ¿quisiste decir cuando num está alrededor de 2 ** 63 y mod_limit es 3? –

6

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

1

Qué idioma es?

Un algoritmo básico podría ser:

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

Creo que hay un error en el caso donde 'target == modulo'. Bucle infinito. –

4

Para la posteridad, BrightScript tiene ahora un operador de módulo, que se parece a esto:

c = a mod b 
+0

Esto no proporciona una respuesta a la pregunta. –

+0

@MDXF - no proporciona la respuesta al * título * de la pregunta, pero las respuestas importantes son: si lees el cuerpo, dice "Este lenguaje de guiones tonto no tiene un% o Mod()" - ese fue el caso en 2010, pero no más. –

0

En 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

Si bien este fragmento de código puede resolver la pregunta, [incluyendo una explicación] (// meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers) realmente ayuda a mejorar la calidad de su publicación. Recuerde que usted está respondiendo la pregunta a los lectores en el futuro, y es posible que esas personas no sepan los motivos de su sugerencia de código. Por favor, intente no saturar su código con comentarios explicativos, ¡esto reduce la legibilidad tanto del código como de las explicaciones! – kayess

1

Si alguien llega más tarde, aquí hay algunos algoritmos más reales (con errores ... lea con atención)

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

En realidad, hay dos tipos principales de las fórmulas de reducción: Barett y Montgomery. El papel de repetición ePrint tanto en diferentes versiones (algoritmos 1-3) y dar una versión "mejorada" en el algoritmo 4.

general

Doy ahora una visión general de la 4. algoritmo:

1.) Calcule "A * B" y Almacene el producto completo en "C" que C y el módulo $ p $ es la entrada para ese algoritmo.

2.) Calcule la longitud de bit de $ p $, por ejemplo: la función "Ancho (p)" devuelve exactamente ese valor.

3.) Dividir la entrada $ C $ en N "bloques" de tamaño "Ancho (p)" y almacenar cada uno en G. Comience en G [0] = lsb (p) y termine en G [N- 1] = msb (p). (La descripción es muy defectuosa del papel)

4.) Iniciar el bucle while: conjunto N = N-1 (para llegar al último elemento) precomputamos $ b: = 2^{Ancho (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 

Eso hace mucho. No sólo tenemos que reducir recursivamente G [0]:

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

Los otros tres algoritmos están bien definidos, pero esto carece de algunas informaciones o presentamos lo que realmente mal. Pero funciona para cualquier tamaño;)

+0

Hola @shalec: no fomentamos las respuestas que solo contienen enlaces a recursos externos. Se desalientan estas [respuestas de solo enlace] (https://meta.stackexchange.com/questions/8231/are-answers-that-just-contain-links-elsewhere-really-good-answers). – Lix

+0

¿Puede copiar y pegar las partes relevantes del PDF vinculado en su respuesta? Eso mejoraría en gran medida la calidad de esta publicación. –

+0

De causa. Hay 4 algoritmos mencionados. Voy a editar esos. – Shalec