Eigenschaften der Modulo-Operation

7

Ich berechne die Summe S = (a * x + b * y + c)% N. Ja, es sieht wie eine quadratische Gleichung aus, aber nicht weil x und y einige Eigenschaften haben und mit berechnet werden müssen einige wiederkehrende Beziehungen. Da die Summe sogar die Grenzen von unsigned long lang überschreitet, möchte ich wissen, wie ich diese Summe mit den Eigenschaften der Modulo-Operation berechnen könnte, Eigenschaften, die das Schreiben der Summe so erlauben (ich sage etwas, weil ich mich nicht genau erinnere) wie sind diese Eigenschaften): (a * x)% N + (b * y)% N + c% N, wodurch die Überschreitung der Grenzen von unsigned long long vermieden wird.

Vielen Dank im Voraus für Ihr Anliegen! :)

    
ZLMN 08.04.2011, 13:09
quelle

6 Antworten

15

a % N = x bedeutet, dass für einige Ganzzahlen 0 <= x < N und m : m * N + x = a .

Sie können einfach folgern, dass wenn a % N = x und b % N = y dann

%Vor%

Wir wissen, dass 0 < x + y < 2N , deshalb müssen Sie die Restberechnung beibehalten. Dies zeigt, dass es in Ordnung ist, die Summierung zu teilen und die Reste separat zu berechnen und sie dann hinzuzufügen, aber vergiss nicht, den Rest für die Summe zu erhalten.

Für die Multiplikation:

%Vor%

So können Sie das auch mit Produkten machen.

Diese Eigenschaften können einfach in einer allgemeineren Einstellung unter Verwendung einiger abstrakter Algebra abgeleitet werden (die Reste bilden einen Faktor ring Z/nZ ).

    
bandi 08.04.2011, 13:21
quelle
7

Sie können die Idee bei Bedarf weiterführen:

%Vor%     
Martijn 08.04.2011 13:21
quelle
6

Sie können das Modul für jeden Ausdruck der Summe anwenden, wie Sie es vorgeschlagen haben. Aber auch nach dem Summieren müssen Sie den Modulus erneut anwenden, um Ihr Endergebnis zu erhalten.

    
Dave Costa 08.04.2011 13:16
quelle
4

Wie wäre es damit:

%Vor%     
Steve Wellens 08.04.2011 13:19
quelle
1
___ qstnhdr ___ Eigenschaften der Modulo-Operation ___ answer5595641 ___

Sie können die Idee bei Bedarf weiterführen:

%Vor%     
___ qstntxt ___

Ich berechne die Summe S = (a * x + b * y + c)% N. Ja, es sieht wie eine quadratische Gleichung aus, aber nicht weil x und y einige Eigenschaften haben und mit berechnet werden müssen einige wiederkehrende Beziehungen. Da die Summe sogar die Grenzen von unsigned long lang überschreitet, möchte ich wissen, wie ich diese Summe mit den Eigenschaften der Modulo-Operation berechnen könnte, Eigenschaften, die das Schreiben der Summe so erlauben (ich sage etwas, weil ich mich nicht genau erinnere) wie sind diese Eigenschaften): (a * x)% N + (b * y)% N + c% N, wodurch die Überschreitung der Grenzen von unsigned long long vermieden wird.

Vielen Dank im Voraus für Ihr Anliegen! :)

    
___ answer5595625 ___

Wie wäre es damit:

%Vor%     
___ tag123c ___ C ++ ist eine universelle Programmiersprache. Es wurde ursprünglich als Erweiterung von C entworfen und behält eine ähnliche Syntax, ist aber jetzt eine komplett andere Sprache. Verwenden Sie dieses Tag für Fragen zu Code, der mit einem C ++ - Compiler kompiliert werden soll. ___ tag123c ___ C ist eine universelle Computerprogrammiersprache, die für Betriebssysteme, Bibliotheken, Spiele und andere Hochleistungsanwendungen verwendet wird. Dieses Tag sollte bei allgemeinen Fragen zur C-Sprache verwendet werden, wie in der Norm ISO 9899: 2011 definiert. Fügen Sie ggf. ein versionsspezifisches Tag wie c99 oder c90 für Fragen zu älteren Sprachstandards hinzu. C unterscheidet sich von C ++ und es sollte nicht mit dem C ++ - Tag kombiniert werden, wenn ein rationaler Grund fehlt. ___ answer5595592 ___

Sie können das Modul für jeden Ausdruck der Summe anwenden, wie Sie es vorgeschlagen haben. Aber auch nach dem Summieren müssen Sie den Modulus erneut anwenden, um Ihr Endergebnis zu erhalten.

    
___ tag123math ___ Mathematik ist das Studium von Quantität, Struktur, Raum und Veränderung. Alle mathematischen Fragen auf dieser Website sollten programmbezogen sein. ___ tag123properties ___ Eine Eigenschaft in einigen objektorientierten Programmiersprachen ist eine spezielle Art von Klassenmember, die zwischen einem Feld (oder Datenelement) und einer Methode liegt. Eigenschaften werden wie Felder gelesen und geschrieben, aber Lese- und Schreibvorgänge für Eigenschaften werden (normalerweise) übersetzt, um Methodenaufrufe zu erhalten und festzulegen. ___ answer5595640 ___

%code% bedeutet, dass für einige Ganzzahlen %code% und %code% : %code% .

Sie können einfach folgern, dass wenn %code% und %code% dann

%Vor%

Wir wissen, dass %code% , deshalb müssen Sie die Restberechnung beibehalten. Dies zeigt, dass es in Ordnung ist, die Summierung zu teilen und die Reste separat zu berechnen und sie dann hinzuzufügen, aber vergiss nicht, den Rest für die Summe zu erhalten.

Für die Multiplikation:

%Vor%

So können Sie das auch mit Produkten machen.

Diese Eigenschaften können einfach in einer allgemeineren Einstellung unter Verwendung einiger abstrakter Algebra abgeleitet werden (die Reste bilden einen Faktor ring %code% ).

    
___ tag123modulo ___ Die Operation modulo (manchmal Modulus genannt) findet den Rest der Division einer Zahl durch eine andere. Es wird normalerweise durch das Prozentzeichen ('%') in Programmiersprachen dargestellt. ___ answer5623433 ___

Sie können nicht nur alle Variablen mod n vor Beginn der Berechnung reduzieren, sondern auch ein eigenes mod-mul schreiben, um ein * x mod n mit einer Shift-and-Add-Methode zu berechnen und das Ergebnis mod n bei jedem Schritt zu reduzieren . Auf diese Weise benötigen Ihre Zwischenberechnungen nur ein Bit mehr als n. Sobald diese Produkte berechnet sind, können Sie sie paarweise hinzufügen und mod n nach jeder Addition reduzieren, die nicht mehr als 1 Bit über den Bereich von n hinaus benötigt.

In meiner Antwort zu diese Frage. Die Konvertierung in C sollte trivial sein.

    
___ antwort5595620 ___

Sie erinnern sich richtig. Die Gleichung, die du gabst, wo du% N jeder der Summanden richtig ist. Und genau das würde ich verwenden. Sie sollten auch% N für jede Partialsumme (und die Summe) erneut eingeben, da die Additionsergebnisse immer noch größer als N sein können. Aber Vorsicht, das funktioniert nur, wenn Ihre Größenbeschränkung mindestens doppelt so groß ist wie Ihr N. Wenn dies der Fall ist nicht der Fall, es kann wirklich böse werden.

Btw für die folgenden% N-Operationen der Partialsummen, Sie müssen keine vollständige Division durchführen, ein Check & gt; N und wenn größer nur Subtraktion von N ist genug.

    
___
flolo 08.04.2011 13:19
quelle
1

Sie können nicht nur alle Variablen mod n vor Beginn der Berechnung reduzieren, sondern auch ein eigenes mod-mul schreiben, um ein * x mod n mit einer Shift-and-Add-Methode zu berechnen und das Ergebnis mod n bei jedem Schritt zu reduzieren . Auf diese Weise benötigen Ihre Zwischenberechnungen nur ein Bit mehr als n. Sobald diese Produkte berechnet sind, können Sie sie paarweise hinzufügen und mod n nach jeder Addition reduzieren, die nicht mehr als 1 Bit über den Bereich von n hinaus benötigt.

In meiner Antwort zu diese Frage. Die Konvertierung in C sollte trivial sein.

    
phkahler 11.04.2011 15:13
quelle

Tags und Links