<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=Multiply-with-carry</id>
	<title>Multiply-with-carry - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=Multiply-with-carry"/>
	<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Multiply-with-carry&amp;action=history"/>
	<updated>2026-06-02T20:29:16Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in Wikipedia (Deutsch) – Lokale Kopie</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://wiki-de.moshellshocker.dns64.de/index.php?title=Multiply-with-carry&amp;diff=2526544&amp;oldid=prev</id>
		<title>imported&gt;Bithisarea: /* growthexperiments-addlink-summary-summary:2|1|0 */</title>
		<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Multiply-with-carry&amp;diff=2526544&amp;oldid=prev"/>
		<updated>2025-01-12T20:20:20Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;growthexperiments-addlink-summary-summary:2|1|0&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{Überarbeiten}}&lt;br /&gt;
&lt;br /&gt;
Der &amp;#039;&amp;#039;&amp;#039;Multiply-with-Carry&amp;#039;&amp;#039;&amp;#039; (kurz: &amp;#039;&amp;#039;&amp;#039;MWC&amp;#039;&amp;#039;&amp;#039;) und dessen modifizierte Variante &amp;#039;&amp;#039;&amp;#039;Complimentary-Multiply-with-Carry&amp;#039;&amp;#039;&amp;#039; (kurz: &amp;#039;&amp;#039;&amp;#039;CMWC&amp;#039;&amp;#039;&amp;#039;) sind [[Pseudozufallszahlengenerator]]en, die 2003 von [[George Marsaglia]] vorgestellt wurden.&lt;br /&gt;
&lt;br /&gt;
== Eigenschaften ==&lt;br /&gt;
&lt;br /&gt;
# Extrem lange Periode (2&amp;lt;sup&amp;gt;131086&amp;lt;/sup&amp;gt; für den CMWC mit 16 kB Zustandsregister).&lt;br /&gt;
# Liefert gleich verteilte Bit-Sequenz.&lt;br /&gt;
&lt;br /&gt;
=== Algorithmus ===&lt;br /&gt;
&lt;br /&gt;
Der [[Algorithmus]] für den MWC kann durch zwei Rekurrenzgleichungen beschrieben werden:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;x_n = ( a x_{n-1} + c_{n-1} ) \mod b&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;c_n = \lfloor ( a x_{n-1} + c_{n-1} ) / b \rfloor &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Ergebnis der Multiplikation ist aufgeteilt in &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; (die unteren 32 Bits) und den Übertrag &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt; (die oberen 31 Bits).&lt;br /&gt;
&lt;br /&gt;
Hier steht &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt; für die &amp;#039;&amp;#039;i&amp;#039;&amp;#039;-te generierte Zahl, &amp;#039;&amp;#039;a&amp;#039;&amp;#039; für einen konstanten Faktor und &amp;#039;&amp;#039;b&amp;#039;&amp;#039; für die Zahlenbasis.&lt;br /&gt;
&lt;br /&gt;
Die Konstanten &amp;#039;&amp;#039;a&amp;#039;&amp;#039; und &amp;#039;&amp;#039;b&amp;#039;&amp;#039; sollten so gewählt werden, dass &amp;lt;math&amp;gt;m = ab-1&amp;lt;/math&amp;gt; eine [[Primzahl]] ist. Dann gibt der Generator für alle nicht-trivialen Startwerte &amp;lt;math&amp;gt;x_1&amp;lt;/math&amp;gt; und &amp;lt;math&amp;gt;c_1&amp;lt;/math&amp;gt; eine Sequenz mit der Periodenlänge &amp;lt;math&amp;gt;l = m-1&amp;lt;/math&amp;gt; aus.&lt;br /&gt;
&lt;br /&gt;
=== Beispiel ===&lt;br /&gt;
&lt;br /&gt;
Sei &amp;lt;math&amp;gt;a = 6&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;b = 10&amp;lt;/math&amp;gt; und als Startwerte &amp;lt;math&amp;gt;c_1 = 3&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;x_1 = 5&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
Sequenzlänge: &amp;lt;math&amp;gt;l = m-1 = ab-2 = 6 \cdot 10 - 2 = 58&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;x_n = ( 6 x_{n-1} + c_{n-1} ) \mod 10&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;c_n = \lfloor ( 6 x_{n-1} + c_{n-1} ) / 10 \rfloor&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| n || &amp;lt;math&amp;gt;( 6 x_{n-1} + c_{n-1} )&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;c_n&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;x_n&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 1 || – || 3 || 5&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 33 || 3 || &amp;#039;&amp;#039;&amp;#039;3&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 21 || 2 || &amp;#039;&amp;#039;&amp;#039;1&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
| 4 ||  8 || 0 || &amp;#039;&amp;#039;&amp;#039;8&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
| 5 || 48 || 4 || &amp;#039;&amp;#039;&amp;#039;8&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
| 6 || 52 || 5 || &amp;#039;&amp;#039;&amp;#039;2&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Der MWC gibt in umgekehrter Reihenfolge die Dezimalbruchentwicklung von &amp;lt;math&amp;gt;33 \over 59&amp;lt;/math&amp;gt; aus.&lt;br /&gt;
&lt;br /&gt;
== Complimentary Multiply-with-carry ==&lt;br /&gt;
&lt;br /&gt;
Für die Erzielung einer maximalen Periodenlänge wird beispielsweise bei Verwendung von 32-Bit-Integern für &amp;lt;math&amp;gt;b = 2^{32}&amp;lt;/math&amp;gt; gewählt. Dies ermöglicht die optimale Nutzung des Wertebereichs und eine gleichzeitig schnelle Berechnung.&lt;br /&gt;
Bei MWC-Generatoren verkürzt sich hier aber die Periode um die Hälfte und es wird schwieriger, passende Primzahlen zu finden.&lt;br /&gt;
&lt;br /&gt;
Diese Probleme können durch eine kleine Modifikation des ursprünglichen Algorithmus behoben werden, indem man als Rekurrenzgleichung&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;x_n = (b-1) - [( a x_{n-1} + c_{n-1})\mod b ]&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
verwendet.&lt;br /&gt;
&lt;br /&gt;
== Initialisierung ==&lt;br /&gt;
&lt;br /&gt;
Die Initialisierung des Zustandsregisters sollte mit möglichst zufälligen und gleich verteilten Bits erfolgen, sprich etwa so viele 1- wie 0-Bits. Anderenfalls braucht der Generator eine „Warmlauf-Phase“, d.&amp;amp;nbsp;h. es muss eine gewisse Menge an Zufallszahlen generiert werden bis der Generator gleich verteilte Zufallszahlen liefert.&lt;br /&gt;
&lt;br /&gt;
== Implementierung ==&lt;br /&gt;
&lt;br /&gt;
=== MWC ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
static uint32_t Q[1038];&lt;br /&gt;
static uint32_t c = 123;&lt;br /&gt;
&lt;br /&gt;
uint32_t MWC1038() {&lt;br /&gt;
    static uint32_t i = 1037;&lt;br /&gt;
    uint64_t t;&lt;br /&gt;
&lt;br /&gt;
    t = (611376378ULL * Q[i]) + c;&lt;br /&gt;
    c = t &amp;gt;&amp;gt; 32;&lt;br /&gt;
&lt;br /&gt;
    if (--i != 0)&lt;br /&gt;
        return (Q[i] = t);&lt;br /&gt;
&lt;br /&gt;
    i = 1037;&lt;br /&gt;
    return (Q[0] = t);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== CMWC ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
static uint32_t Q[4096];&lt;br /&gt;
static uint32_t c = 123;   /* 0 &amp;lt;= c &amp;lt; 18782 */&lt;br /&gt;
&lt;br /&gt;
uint32_t CMWC() {&lt;br /&gt;
  static uint32_t i = 4095;&lt;br /&gt;
  uint64_t t;&lt;br /&gt;
  uint32_t x;&lt;br /&gt;
&lt;br /&gt;
  i = (i + 1) &amp;amp; 4095;&lt;br /&gt;
  t = (18782ULL * Q[i]) + c;&lt;br /&gt;
  c = t &amp;gt;&amp;gt; 32;&lt;br /&gt;
  x = t + c;&lt;br /&gt;
&lt;br /&gt;
  if (x &amp;lt; c) { ++x; ++c; }&lt;br /&gt;
&lt;br /&gt;
  Q[i] = 0xfffffffe - x;&lt;br /&gt;
&lt;br /&gt;
  return Q[i];&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
* [[Liste von Zufallszahlengeneratoren]]&lt;br /&gt;
&lt;br /&gt;
== Literatur ==&lt;br /&gt;
* {{Literatur |Autor=George Marsaglia |Titel=Random number generators |Sammelwerk=Journal of Modern Applied Statistical Methods |Band=2 |Nummer=1 |Datum=2003-05 |Sprache=en |DOI=10.22237/jmasm/1051747320 |Seiten=2–13 |Online=https://web.archive.org/web/20131004223940/http://www.jmasm.com/journal/2003_vol2_no1.pdf |Format=PDF |Abruf=2022-10-29}}&lt;br /&gt;
* {{Literatur |Autor=George Marsaglia |Titel=On the Randomness of Pi and Other Decimal Expansions |Datum=2005-10 |Online=http://www.yaroslavvb.com/papers/marsaglia-on.pdf |Format=PDF |Abruf=2022-11-25}}&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
&lt;br /&gt;
* Bibliothek mit statistischen Tests: [http://www.iro.umontreal.ca/~simardr/testu01/tu01.html TestU01]&lt;br /&gt;
* F. Panneton, P. L’Ecuyer: [http://www.iro.umontreal.ca/~lecuyer/myftp/papers/lfsr04.pdf &amp;#039;&amp;#039;Improved Long-Period Generators Base on Linear Recurrences Modulo 2&amp;#039;&amp;#039;.] (PDF; 301&amp;amp;nbsp;kB).&lt;br /&gt;
* [http://groups.google.com/group/comp.lang.c/msg/e3c4ea1169e463ae groups.google.com]&lt;br /&gt;
* [http://groups.google.com/group/sci.crypt/browse_thread/thread/305c507efbe85be4?pli=1 groups.google.com]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Pseudozufallszahlengenerator]]&lt;/div&gt;</summary>
		<author><name>imported&gt;Bithisarea</name></author>
	</entry>
</feed>