You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

121 lines
5.8 KiB
HTML

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<!-- This manual describes how to install and use the GNU multiple precision
arithmetic library, version 6.1.0.
Copyright 1991, 1993-2015 Free Software Foundation, Inc.
Permission is granted to copy, distribute and/or modify this document under
the terms of the GNU Free Documentation License, Version 1.3 or any later
version published by the Free Software Foundation; with no Invariant Sections,
with the Front-Cover Texts being "A GNU Manual", and with the Back-Cover
Texts being "You have freedom to copy and modify this GNU Manual, like GNU
software". A copy of the license is included in
GNU Free Documentation License. -->
<!-- Created by GNU Texinfo 6.4, http://www.gnu.org/software/texinfo/ -->
<head>
<title>Random Number Algorithms (GNU MP 6.1.0)</title>
<meta name="description" content="How to install and use the GNU multiple precision arithmetic library, version 6.1.0.">
<meta name="keywords" content="Random Number Algorithms (GNU MP 6.1.0)">
<meta name="resource-type" content="document">
<meta name="distribution" content="global">
<meta name="Generator" content="makeinfo">
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<link href="index.html#Top" rel="start" title="Top">
<link href="Concept-Index.html#Concept-Index" rel="index" title="Concept Index">
<link href="Other-Algorithms.html#Other-Algorithms" rel="up" title="Other Algorithms">
<link href="Assembly-Coding.html#Assembly-Coding" rel="next" title="Assembly Coding">
<link href="Lucas-Numbers-Algorithm.html#Lucas-Numbers-Algorithm" rel="prev" title="Lucas Numbers Algorithm">
<style type="text/css">
<!--
a.summary-letter {text-decoration: none}
blockquote.indentedblock {margin-right: 0em}
blockquote.smallindentedblock {margin-right: 0em; font-size: smaller}
blockquote.smallquotation {font-size: smaller}
div.display {margin-left: 3.2em}
div.example {margin-left: 3.2em}
div.lisp {margin-left: 3.2em}
div.smalldisplay {margin-left: 3.2em}
div.smallexample {margin-left: 3.2em}
div.smalllisp {margin-left: 3.2em}
kbd {font-style: oblique}
pre.display {font-family: inherit}
pre.format {font-family: inherit}
pre.menu-comment {font-family: serif}
pre.menu-preformatted {font-family: serif}
pre.smalldisplay {font-family: inherit; font-size: smaller}
pre.smallexample {font-size: smaller}
pre.smallformat {font-family: inherit; font-size: smaller}
pre.smalllisp {font-size: smaller}
span.nolinebreak {white-space: nowrap}
span.roman {font-family: initial; font-weight: normal}
span.sansserif {font-family: sans-serif; font-weight: normal}
ul.no-bullet {list-style: none}
-->
</style>
</head>
<body lang="en">
<a name="Random-Number-Algorithms"></a>
<div class="header">
<p>
Previous: <a href="Lucas-Numbers-Algorithm.html#Lucas-Numbers-Algorithm" accesskey="p" rel="prev">Lucas Numbers Algorithm</a>, Up: <a href="Other-Algorithms.html#Other-Algorithms" accesskey="u" rel="up">Other Algorithms</a> &nbsp; [<a href="Concept-Index.html#Concept-Index" title="Index" rel="index">Index</a>]</p>
</div>
<hr>
<a name="Random-Numbers"></a>
<h4 class="subsection">15.7.6 Random Numbers</h4>
<a name="index-Random-number-algorithms"></a>
<p>For the <code>urandomb</code> functions, random numbers are generated simply by
concatenating bits produced by the generator. As long as the generator has
good randomness properties this will produce well-distributed <em>N</em> bit
numbers.
</p>
<p>For the <code>urandomm</code> functions, random numbers in a range <em>0&lt;=R&lt;N</em>
are generated by taking values <em>R</em> of <em>ceil(log2(N))</em> bits each until one satisfies <em>R&lt;N</em>. This will normally
require only one or two attempts, but the attempts are limited in case the
generator is somehow degenerate and produces only 1 bits or similar.
</p>
<a name="index-Mersenne-twister-algorithm"></a>
<p>The Mersenne Twister generator is by Matsumoto and Nishimura
(see <a href="References.html#References">References</a>). It has a non-repeating period of <em>2^19937<!-- /@w -->-1</em>,
which is a Mersenne prime, hence the name of the generator. The state is 624
words of 32-bits each, which is iterated with one XOR and shift for each
32-bit word generated, making the algorithm very fast. Randomness properties
are also very good and this is the default algorithm used by GMP.
</p>
<a name="index-Linear-congruential-algorithm"></a>
<p>Linear congruential generators are described in many text books, for instance
Knuth volume 2 (see <a href="References.html#References">References</a>). With a modulus <em>M</em> and parameters
<em>A</em> and <em>C</em>, an integer state <em>S</em> is iterated by the formula
<em>S &lt;- A*S+C mod M</em>. At each step the new
state is a linear function of the previous, mod <em>M</em>, hence the name of
the generator.
</p>
<p>In GMP only moduli of the form <em>2^N</em> are supported, and the current
implementation is not as well optimized as it could be. Overheads are
significant when <em>N</em> is small, and when <em>N</em> is large clearly the
multiply at each step will become slow. This is not a big concern, since the
Mersenne Twister generator is better in every respect and is therefore
recommended for all normal applications.
</p>
<p>For both generators the current state can be deduced by observing enough
output and applying some linear algebra (over GF(2) in the case of the
Mersenne Twister). This generally means raw output is unsuitable for
cryptographic applications without further hashing or the like.
</p>
<hr>
<div class="header">
<p>
Previous: <a href="Lucas-Numbers-Algorithm.html#Lucas-Numbers-Algorithm" accesskey="p" rel="prev">Lucas Numbers Algorithm</a>, Up: <a href="Other-Algorithms.html#Other-Algorithms" accesskey="u" rel="up">Other Algorithms</a> &nbsp; [<a href="Concept-Index.html#Concept-Index" title="Index" rel="index">Index</a>]</p>
</div>
</body>
</html>