2010-05-03 12 views
11

Diese dumme Skriptsprache hat kein% oder Mod(). Ich habe eine Fix(), die den Dezimalteil einer Zahl abhebt. Ich brauche nur positive Ergebnisse, also werde nicht zu robust.Wie kann ich Mod ohne einen Mod-Operator tun?

+2

Könnten Sie erwähnen und vielleicht markieren, welche "alberne" Skriptsprache du sprichst? –

+0

Ich denke, es ist eine dumme Sprache namens "Hausaufgaben" – Gareth

+1

Heh.Es ist eine eingebettete Sprache auf diesem Roku Digital Signage Video Player. Es hat wahrscheinlich einen Mod irgendwo, aber ich kann es nicht finden und es hat wie Arctan() und NaturalLog(), also bin ich wirklich verwirrt, wie sie Mod übersprungen haben. – tladuke

Antwort

19

Wird

// mod = a % b 

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

tun? Ich gehe davon aus, dass Sie sich hier zumindest teilen können. Alle Wetten sind auf negative Zahlen aus.

+0

je nachdem, was Sie für negative Zahlen möchten, kann es eingestellt werden. Es gibt 'fix()', das immer abschneidet und es gibt 'int()', das immer nach unten rotiert ('int (-2.5) = - 3') –

0

Dies kann nicht für Sie leistungsmäßig arbeiten, aber:

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

@tloflin, ich hoffe, es stört dich nicht, aber es hätte sein sollen" > = "statt"> ". – paxdiablo

+0

@paxdiablo, stimmt, danke. – tloflin

+3

funktioniert nicht leistungsmäßig, meinst du wie wenn num ist um 2 ** 63 und mod_limit ist 3? –

6

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

1

Welche Sprache ist das?

könnte ein Basis-Algorithmus sein:

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

Ich denke, es gibt einen Fehler für den Fall, wo "target == modulo". Endlosschleife. –

4

Für die Nachwelt BrightScript nun eine Modulo-Operator hat, sieht es wie folgt aus:

c = a mod b 
+0

Dies bietet keine Antwort auf die Frage. –

+0

@MDXF - es bietet keine Antwort auf den * Titel * der Frage, aber materiell Antworten ist: Wenn Sie den Körper lesen, heißt es "Diese alberne Skriptsprache hat kein% oder Mod()" - das war die Fall um 2010, aber nicht mehr. –

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

Während dieses Code-Snippet die Frage lösen kann, hilft [einschließlich einer Erklärung] (// meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers) wirklich, die Qualität Ihres Posts zu verbessern. Denken Sie daran, dass Sie die Frage für Leser in der Zukunft beantworten, und diese Leute könnten die Gründe für Ihren Codevorschlag nicht kennen. Bitte versuchen Sie auch nicht, Ihren Code mit erklärenden Kommentaren zu füllen, dies reduziert die Lesbarkeit sowohl des Codes als auch der Erklärungen! – kayess

1

Wenn jemand kommt später an, hier sind ein paar aktuelle Algorithmen (mit Fehlern ... lesen Sie sorgfältig)

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

Es gibt zwei Haupt Art von Reduktion Formeln: Barett und Montgomery. Das Papier von eprint Wiederholung sowohl in verschiedenen Versionen (Algorithmen 1-3) und geben eine „verbesserte“ Version in Algorithmus 4.

Übersicht

Ich gebe jetzt einen Überblick über den 4. Algorithmus:

1.) Berechne "A * B" und speichere das gesamte Produkt in "C", dass C und der Modulus $ p $ die Eingabe für diesen Algorithmus ist.

2.) Berechnen Sie die Bitlänge von $ p $, sagen wir: die Funktion "Width (p)" gibt genau diesen Wert zurück.

3.) Teilen Sie die Eingabe $ C $ in N "Blöcke" der Größe "Breite (p)" und speichern Sie sie jeweils in G. Beginnen Sie in G [0] = lsb (p) und enden Sie in G [N- 1] = Msb (p). (Die Beschreibung ist wirklich fehlerhaft des Papiers)

4.) Starten Sie die while-Schleife: Sets N = N-1 (das letzte Element zu erreichen) Precompute $ b: = 2^{Breite (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 

Das ist viel. Nicht wir müssen nur rekursiven G reduzieren [0]:

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

Die anderen drei Algorithmen sind gut definiert, aber das fehlt einige Informationen oder präsentieren es wirklich falsch. Aber es funktioniert für jede Größe;)

+0

Hi @shalec - wir empfehlen keine Antworten, die nur Links zu externen Ressourcen enthalten. Diese [Link-only-Antworten werden nicht empfohlen] (https://meta.stackexchange.com/questions/8231/are-answers-that-just-contain-links-elsewhere-really- good-answers). – Lix

+0

Können Sie die relevanten Teile der verknüpften PDF-Datei kopieren und in Ihre Antwort einfügen? Das würde die Qualität dieses Posts erheblich verbessern. –

+0

Aus gutem Grund. Es gibt 4 Algorithmen erwähnt. Ich werde diese bearbeiten. – Shalec

Verwandte Themen