Import gcc-4.7.2 to new vendor branch
[dragonfly.git] / contrib / gcc-4.7 / libstdc++-v3 / include / bits / random.tcc
1 // random number generation (out of line) -*- C++ -*-
2
3 // Copyright (C) 2009, 2010, 2011, 2012 Free Software Foundation, Inc.
4 //
5 // This file is part of the GNU ISO C++ Library.  This library is free
6 // software; you can redistribute it and/or modify it under the
7 // terms of the GNU General Public License as published by the
8 // Free Software Foundation; either version 3, or (at your option)
9 // any later version.
10
11 // This library is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 // GNU General Public License for more details.
15
16 // Under Section 7 of GPL version 3, you are granted additional
17 // permissions described in the GCC Runtime Library Exception, version
18 // 3.1, as published by the Free Software Foundation.
19
20 // You should have received a copy of the GNU General Public License and
21 // a copy of the GCC Runtime Library Exception along with this program;
22 // see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
23 // <http://www.gnu.org/licenses/>.
24
25 /** @file bits/random.tcc
26  *  This is an internal header file, included by other library headers.
27  *  Do not attempt to use it directly. @headername{random}
28  */
29
30 #ifndef _RANDOM_TCC
31 #define _RANDOM_TCC 1
32
33 #include <numeric> // std::accumulate and std::partial_sum
34
35 namespace std _GLIBCXX_VISIBILITY(default)
36 {
37   /*
38    * (Further) implementation-space details.
39    */
40   namespace __detail
41   {
42   _GLIBCXX_BEGIN_NAMESPACE_VERSION
43
44     // General case for x = (ax + c) mod m -- use Schrage's algorithm to
45     // avoid integer overflow.
46     //
47     // Because a and c are compile-time integral constants the compiler
48     // kindly elides any unreachable paths.
49     //
50     // Preconditions:  a > 0, m > 0.
51     //
52     // XXX FIXME: as-is, only works correctly for __m % __a < __m / __a. 
53     //
54     template<typename _Tp, _Tp __m, _Tp __a, _Tp __c, bool>
55       struct _Mod
56       {
57         static _Tp
58         __calc(_Tp __x)
59         {
60           if (__a == 1)
61             __x %= __m;
62           else
63             {
64               static const _Tp __q = __m / __a;
65               static const _Tp __r = __m % __a;
66
67               _Tp __t1 = __a * (__x % __q);
68               _Tp __t2 = __r * (__x / __q);
69               if (__t1 >= __t2)
70                 __x = __t1 - __t2;
71               else
72                 __x = __m - __t2 + __t1;
73             }
74
75           if (__c != 0)
76             {
77               const _Tp __d = __m - __x;
78               if (__d > __c)
79                 __x += __c;
80               else
81                 __x = __c - __d;
82             }
83           return __x;
84         }
85       };
86
87     // Special case for m == 0 -- use unsigned integer overflow as modulo
88     // operator.
89     template<typename _Tp, _Tp __m, _Tp __a, _Tp __c>
90       struct _Mod<_Tp, __m, __a, __c, true>
91       {
92         static _Tp
93         __calc(_Tp __x)
94         { return __a * __x + __c; }
95       };
96
97     template<typename _InputIterator, typename _OutputIterator,
98              typename _UnaryOperation>
99       _OutputIterator
100       __transform(_InputIterator __first, _InputIterator __last,
101                   _OutputIterator __result, _UnaryOperation __unary_op)
102       {
103         for (; __first != __last; ++__first, ++__result)
104           *__result = __unary_op(*__first);
105         return __result;
106       }
107
108   _GLIBCXX_END_NAMESPACE_VERSION
109   } // namespace __detail
110
111 _GLIBCXX_BEGIN_NAMESPACE_VERSION
112
113   template<typename _UIntType, _UIntType __a, _UIntType __c, _UIntType __m>
114     constexpr _UIntType
115     linear_congruential_engine<_UIntType, __a, __c, __m>::multiplier;
116
117   template<typename _UIntType, _UIntType __a, _UIntType __c, _UIntType __m>
118     constexpr _UIntType
119     linear_congruential_engine<_UIntType, __a, __c, __m>::increment;
120
121   template<typename _UIntType, _UIntType __a, _UIntType __c, _UIntType __m>
122     constexpr _UIntType
123     linear_congruential_engine<_UIntType, __a, __c, __m>::modulus;
124
125   template<typename _UIntType, _UIntType __a, _UIntType __c, _UIntType __m>
126     constexpr _UIntType
127     linear_congruential_engine<_UIntType, __a, __c, __m>::default_seed;
128
129   /**
130    * Seeds the LCR with integral value @p __s, adjusted so that the
131    * ring identity is never a member of the convergence set.
132    */
133   template<typename _UIntType, _UIntType __a, _UIntType __c, _UIntType __m>
134     void
135     linear_congruential_engine<_UIntType, __a, __c, __m>::
136     seed(result_type __s)
137     {
138       if ((__detail::__mod<_UIntType, __m>(__c) == 0)
139           && (__detail::__mod<_UIntType, __m>(__s) == 0))
140         _M_x = 1;
141       else
142         _M_x = __detail::__mod<_UIntType, __m>(__s);
143     }
144
145   /**
146    * Seeds the LCR engine with a value generated by @p __q.
147    */
148   template<typename _UIntType, _UIntType __a, _UIntType __c, _UIntType __m>
149     template<typename _Sseq>
150       typename std::enable_if<std::is_class<_Sseq>::value>::type
151       linear_congruential_engine<_UIntType, __a, __c, __m>::
152       seed(_Sseq& __q)
153       {
154         const _UIntType __k0 = __m == 0 ? std::numeric_limits<_UIntType>::digits
155                                         : std::__lg(__m);
156         const _UIntType __k = (__k0 + 31) / 32;
157         uint_least32_t __arr[__k + 3];
158         __q.generate(__arr + 0, __arr + __k + 3);
159         _UIntType __factor = 1u;
160         _UIntType __sum = 0u;
161         for (size_t __j = 0; __j < __k; ++__j)
162           {
163             __sum += __arr[__j + 3] * __factor;
164             __factor *= __detail::_Shift<_UIntType, 32>::__value;
165           }
166         seed(__sum);
167       }
168
169   template<typename _UIntType, _UIntType __a, _UIntType __c, _UIntType __m,
170            typename _CharT, typename _Traits>
171     std::basic_ostream<_CharT, _Traits>&
172     operator<<(std::basic_ostream<_CharT, _Traits>& __os,
173                const linear_congruential_engine<_UIntType,
174                                                 __a, __c, __m>& __lcr)
175     {
176       typedef std::basic_ostream<_CharT, _Traits>  __ostream_type;
177       typedef typename __ostream_type::ios_base    __ios_base;
178
179       const typename __ios_base::fmtflags __flags = __os.flags();
180       const _CharT __fill = __os.fill();
181       __os.flags(__ios_base::dec | __ios_base::fixed | __ios_base::left);
182       __os.fill(__os.widen(' '));
183
184       __os << __lcr._M_x;
185
186       __os.flags(__flags);
187       __os.fill(__fill);
188       return __os;
189     }
190
191   template<typename _UIntType, _UIntType __a, _UIntType __c, _UIntType __m,
192            typename _CharT, typename _Traits>
193     std::basic_istream<_CharT, _Traits>&
194     operator>>(std::basic_istream<_CharT, _Traits>& __is,
195                linear_congruential_engine<_UIntType, __a, __c, __m>& __lcr)
196     {
197       typedef std::basic_istream<_CharT, _Traits>  __istream_type;
198       typedef typename __istream_type::ios_base    __ios_base;
199
200       const typename __ios_base::fmtflags __flags = __is.flags();
201       __is.flags(__ios_base::dec);
202
203       __is >> __lcr._M_x;
204
205       __is.flags(__flags);
206       return __is;
207     }
208
209
210   template<typename _UIntType,
211            size_t __w, size_t __n, size_t __m, size_t __r,
212            _UIntType __a, size_t __u, _UIntType __d, size_t __s,
213            _UIntType __b, size_t __t, _UIntType __c, size_t __l,
214            _UIntType __f>
215     constexpr size_t
216     mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d,
217                             __s, __b, __t, __c, __l, __f>::word_size;
218
219   template<typename _UIntType,
220            size_t __w, size_t __n, size_t __m, size_t __r,
221            _UIntType __a, size_t __u, _UIntType __d, size_t __s,
222            _UIntType __b, size_t __t, _UIntType __c, size_t __l,
223            _UIntType __f>
224     constexpr size_t
225     mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d,
226                             __s, __b, __t, __c, __l, __f>::state_size;
227
228   template<typename _UIntType,
229            size_t __w, size_t __n, size_t __m, size_t __r,
230            _UIntType __a, size_t __u, _UIntType __d, size_t __s,
231            _UIntType __b, size_t __t, _UIntType __c, size_t __l,
232            _UIntType __f>
233     constexpr size_t
234     mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d,
235                             __s, __b, __t, __c, __l, __f>::shift_size;
236
237   template<typename _UIntType,
238            size_t __w, size_t __n, size_t __m, size_t __r,
239            _UIntType __a, size_t __u, _UIntType __d, size_t __s,
240            _UIntType __b, size_t __t, _UIntType __c, size_t __l,
241            _UIntType __f>
242     constexpr size_t
243     mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d,
244                             __s, __b, __t, __c, __l, __f>::mask_bits;
245
246   template<typename _UIntType,
247            size_t __w, size_t __n, size_t __m, size_t __r,
248            _UIntType __a, size_t __u, _UIntType __d, size_t __s,
249            _UIntType __b, size_t __t, _UIntType __c, size_t __l,
250            _UIntType __f>
251     constexpr _UIntType
252     mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d,
253                             __s, __b, __t, __c, __l, __f>::xor_mask;
254
255   template<typename _UIntType,
256            size_t __w, size_t __n, size_t __m, size_t __r,
257            _UIntType __a, size_t __u, _UIntType __d, size_t __s,
258            _UIntType __b, size_t __t, _UIntType __c, size_t __l,
259            _UIntType __f>
260     constexpr size_t
261     mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d,
262                             __s, __b, __t, __c, __l, __f>::tempering_u;
263    
264   template<typename _UIntType,
265            size_t __w, size_t __n, size_t __m, size_t __r,
266            _UIntType __a, size_t __u, _UIntType __d, size_t __s,
267            _UIntType __b, size_t __t, _UIntType __c, size_t __l,
268            _UIntType __f>
269     constexpr _UIntType
270     mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d,
271                             __s, __b, __t, __c, __l, __f>::tempering_d;
272
273   template<typename _UIntType,
274            size_t __w, size_t __n, size_t __m, size_t __r,
275            _UIntType __a, size_t __u, _UIntType __d, size_t __s,
276            _UIntType __b, size_t __t, _UIntType __c, size_t __l,
277            _UIntType __f>
278     constexpr size_t
279     mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d,
280                             __s, __b, __t, __c, __l, __f>::tempering_s;
281
282   template<typename _UIntType,
283            size_t __w, size_t __n, size_t __m, size_t __r,
284            _UIntType __a, size_t __u, _UIntType __d, size_t __s,
285            _UIntType __b, size_t __t, _UIntType __c, size_t __l,
286            _UIntType __f>
287     constexpr _UIntType
288     mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d,
289                             __s, __b, __t, __c, __l, __f>::tempering_b;
290
291   template<typename _UIntType,
292            size_t __w, size_t __n, size_t __m, size_t __r,
293            _UIntType __a, size_t __u, _UIntType __d, size_t __s,
294            _UIntType __b, size_t __t, _UIntType __c, size_t __l,
295            _UIntType __f>
296     constexpr size_t
297     mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d,
298                             __s, __b, __t, __c, __l, __f>::tempering_t;
299
300   template<typename _UIntType,
301            size_t __w, size_t __n, size_t __m, size_t __r,
302            _UIntType __a, size_t __u, _UIntType __d, size_t __s,
303            _UIntType __b, size_t __t, _UIntType __c, size_t __l,
304            _UIntType __f>
305     constexpr _UIntType
306     mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d,
307                             __s, __b, __t, __c, __l, __f>::tempering_c;
308
309   template<typename _UIntType,
310            size_t __w, size_t __n, size_t __m, size_t __r,
311            _UIntType __a, size_t __u, _UIntType __d, size_t __s,
312            _UIntType __b, size_t __t, _UIntType __c, size_t __l,
313            _UIntType __f>
314     constexpr size_t
315     mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d,
316                             __s, __b, __t, __c, __l, __f>::tempering_l;
317
318   template<typename _UIntType,
319            size_t __w, size_t __n, size_t __m, size_t __r,
320            _UIntType __a, size_t __u, _UIntType __d, size_t __s,
321            _UIntType __b, size_t __t, _UIntType __c, size_t __l,
322            _UIntType __f>
323     constexpr _UIntType
324     mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d,
325                             __s, __b, __t, __c, __l, __f>::
326                                               initialization_multiplier;
327
328   template<typename _UIntType,
329            size_t __w, size_t __n, size_t __m, size_t __r,
330            _UIntType __a, size_t __u, _UIntType __d, size_t __s,
331            _UIntType __b, size_t __t, _UIntType __c, size_t __l,
332            _UIntType __f>
333     constexpr _UIntType
334     mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d,
335                             __s, __b, __t, __c, __l, __f>::default_seed;
336
337   template<typename _UIntType,
338            size_t __w, size_t __n, size_t __m, size_t __r,
339            _UIntType __a, size_t __u, _UIntType __d, size_t __s,
340            _UIntType __b, size_t __t, _UIntType __c, size_t __l,
341            _UIntType __f>
342     void
343     mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d,
344                             __s, __b, __t, __c, __l, __f>::
345     seed(result_type __sd)
346     {
347       _M_x[0] = __detail::__mod<_UIntType,
348         __detail::_Shift<_UIntType, __w>::__value>(__sd);
349
350       for (size_t __i = 1; __i < state_size; ++__i)
351         {
352           _UIntType __x = _M_x[__i - 1];
353           __x ^= __x >> (__w - 2);
354           __x *= __f;
355           __x += __detail::__mod<_UIntType, __n>(__i);
356           _M_x[__i] = __detail::__mod<_UIntType,
357             __detail::_Shift<_UIntType, __w>::__value>(__x);
358         }
359       _M_p = state_size;
360     }
361
362   template<typename _UIntType,
363            size_t __w, size_t __n, size_t __m, size_t __r,
364            _UIntType __a, size_t __u, _UIntType __d, size_t __s,
365            _UIntType __b, size_t __t, _UIntType __c, size_t __l,
366            _UIntType __f>
367     template<typename _Sseq>
368       typename std::enable_if<std::is_class<_Sseq>::value>::type
369       mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d,
370                               __s, __b, __t, __c, __l, __f>::
371       seed(_Sseq& __q)
372       {
373         const _UIntType __upper_mask = (~_UIntType()) << __r;
374         const size_t __k = (__w + 31) / 32;
375         uint_least32_t __arr[__n * __k];
376         __q.generate(__arr + 0, __arr + __n * __k);
377
378         bool __zero = true;
379         for (size_t __i = 0; __i < state_size; ++__i)
380           {
381             _UIntType __factor = 1u;
382             _UIntType __sum = 0u;
383             for (size_t __j = 0; __j < __k; ++__j)
384               {
385                 __sum += __arr[__k * __i + __j] * __factor;
386                 __factor *= __detail::_Shift<_UIntType, 32>::__value;
387               }
388             _M_x[__i] = __detail::__mod<_UIntType,
389               __detail::_Shift<_UIntType, __w>::__value>(__sum);
390
391             if (__zero)
392               {
393                 if (__i == 0)
394                   {
395                     if ((_M_x[0] & __upper_mask) != 0u)
396                       __zero = false;
397                   }
398                 else if (_M_x[__i] != 0u)
399                   __zero = false;
400               }
401           }
402         if (__zero)
403           _M_x[0] = __detail::_Shift<_UIntType, __w - 1>::__value;
404       }
405
406   template<typename _UIntType, size_t __w,
407            size_t __n, size_t __m, size_t __r,
408            _UIntType __a, size_t __u, _UIntType __d, size_t __s,
409            _UIntType __b, size_t __t, _UIntType __c, size_t __l,
410            _UIntType __f>
411     typename
412     mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d,
413                             __s, __b, __t, __c, __l, __f>::result_type
414     mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d,
415                             __s, __b, __t, __c, __l, __f>::
416     operator()()
417     {
418       // Reload the vector - cost is O(n) amortized over n calls.
419       if (_M_p >= state_size)
420         {
421           const _UIntType __upper_mask = (~_UIntType()) << __r;
422           const _UIntType __lower_mask = ~__upper_mask;
423
424           for (size_t __k = 0; __k < (__n - __m); ++__k)
425             {
426               _UIntType __y = ((_M_x[__k] & __upper_mask)
427                                | (_M_x[__k + 1] & __lower_mask));
428               _M_x[__k] = (_M_x[__k + __m] ^ (__y >> 1)
429                            ^ ((__y & 0x01) ? __a : 0));
430             }
431
432           for (size_t __k = (__n - __m); __k < (__n - 1); ++__k)
433             {
434               _UIntType __y = ((_M_x[__k] & __upper_mask)
435                                | (_M_x[__k + 1] & __lower_mask));
436               _M_x[__k] = (_M_x[__k + (__m - __n)] ^ (__y >> 1)
437                            ^ ((__y & 0x01) ? __a : 0));
438             }
439
440           _UIntType __y = ((_M_x[__n - 1] & __upper_mask)
441                            | (_M_x[0] & __lower_mask));
442           _M_x[__n - 1] = (_M_x[__m - 1] ^ (__y >> 1)
443                            ^ ((__y & 0x01) ? __a : 0));
444           _M_p = 0;
445         }
446
447       // Calculate o(x(i)).
448       result_type __z = _M_x[_M_p++];
449       __z ^= (__z >> __u) & __d;
450       __z ^= (__z << __s) & __b;
451       __z ^= (__z << __t) & __c;
452       __z ^= (__z >> __l);
453
454       return __z;
455     }
456
457   template<typename _UIntType, size_t __w,
458            size_t __n, size_t __m, size_t __r,
459            _UIntType __a, size_t __u, _UIntType __d, size_t __s,
460            _UIntType __b, size_t __t, _UIntType __c, size_t __l,
461            _UIntType __f, typename _CharT, typename _Traits>
462     std::basic_ostream<_CharT, _Traits>&
463     operator<<(std::basic_ostream<_CharT, _Traits>& __os,
464                const mersenne_twister_engine<_UIntType, __w, __n, __m,
465                __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>& __x)
466     {
467       typedef std::basic_ostream<_CharT, _Traits>  __ostream_type;
468       typedef typename __ostream_type::ios_base    __ios_base;
469
470       const typename __ios_base::fmtflags __flags = __os.flags();
471       const _CharT __fill = __os.fill();
472       const _CharT __space = __os.widen(' ');
473       __os.flags(__ios_base::dec | __ios_base::fixed | __ios_base::left);
474       __os.fill(__space);
475
476       for (size_t __i = 0; __i < __n; ++__i)
477         __os << __x._M_x[__i] << __space;
478       __os << __x._M_p;
479
480       __os.flags(__flags);
481       __os.fill(__fill);
482       return __os;
483     }
484
485   template<typename _UIntType, size_t __w,
486            size_t __n, size_t __m, size_t __r,
487            _UIntType __a, size_t __u, _UIntType __d, size_t __s,
488            _UIntType __b, size_t __t, _UIntType __c, size_t __l,
489            _UIntType __f, typename _CharT, typename _Traits>
490     std::basic_istream<_CharT, _Traits>&
491     operator>>(std::basic_istream<_CharT, _Traits>& __is,
492                mersenne_twister_engine<_UIntType, __w, __n, __m,
493                __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>& __x)
494     {
495       typedef std::basic_istream<_CharT, _Traits>  __istream_type;
496       typedef typename __istream_type::ios_base    __ios_base;
497
498       const typename __ios_base::fmtflags __flags = __is.flags();
499       __is.flags(__ios_base::dec | __ios_base::skipws);
500
501       for (size_t __i = 0; __i < __n; ++__i)
502         __is >> __x._M_x[__i];
503       __is >> __x._M_p;
504
505       __is.flags(__flags);
506       return __is;
507     }
508
509
510   template<typename _UIntType, size_t __w, size_t __s, size_t __r>
511     constexpr size_t
512     subtract_with_carry_engine<_UIntType, __w, __s, __r>::word_size;
513
514   template<typename _UIntType, size_t __w, size_t __s, size_t __r>
515     constexpr size_t
516     subtract_with_carry_engine<_UIntType, __w, __s, __r>::short_lag;
517
518   template<typename _UIntType, size_t __w, size_t __s, size_t __r>
519     constexpr size_t
520     subtract_with_carry_engine<_UIntType, __w, __s, __r>::long_lag;
521
522   template<typename _UIntType, size_t __w, size_t __s, size_t __r>
523     constexpr _UIntType
524     subtract_with_carry_engine<_UIntType, __w, __s, __r>::default_seed;
525
526   template<typename _UIntType, size_t __w, size_t __s, size_t __r>
527     void
528     subtract_with_carry_engine<_UIntType, __w, __s, __r>::
529     seed(result_type __value)
530     {
531       std::linear_congruential_engine<result_type, 40014u, 0u, 2147483563u>
532         __lcg(__value == 0u ? default_seed : __value);
533
534       const size_t __n = (__w + 31) / 32;
535
536       for (size_t __i = 0; __i < long_lag; ++__i)
537         {
538           _UIntType __sum = 0u;
539           _UIntType __factor = 1u;
540           for (size_t __j = 0; __j < __n; ++__j)
541             {
542               __sum += __detail::__mod<uint_least32_t,
543                        __detail::_Shift<uint_least32_t, 32>::__value>
544                          (__lcg()) * __factor;
545               __factor *= __detail::_Shift<_UIntType, 32>::__value;
546             }
547           _M_x[__i] = __detail::__mod<_UIntType,
548             __detail::_Shift<_UIntType, __w>::__value>(__sum);
549         }
550       _M_carry = (_M_x[long_lag - 1] == 0) ? 1 : 0;
551       _M_p = 0;
552     }
553
554   template<typename _UIntType, size_t __w, size_t __s, size_t __r>
555     template<typename _Sseq>
556       typename std::enable_if<std::is_class<_Sseq>::value>::type
557       subtract_with_carry_engine<_UIntType, __w, __s, __r>::
558       seed(_Sseq& __q)
559       {
560         const size_t __k = (__w + 31) / 32;
561         uint_least32_t __arr[__r * __k];
562         __q.generate(__arr + 0, __arr + __r * __k);
563
564         for (size_t __i = 0; __i < long_lag; ++__i)
565           {
566             _UIntType __sum = 0u;
567             _UIntType __factor = 1u;
568             for (size_t __j = 0; __j < __k; ++__j)
569               {
570                 __sum += __arr[__k * __i + __j] * __factor;
571                 __factor *= __detail::_Shift<_UIntType, 32>::__value;
572               }
573             _M_x[__i] = __detail::__mod<_UIntType,
574               __detail::_Shift<_UIntType, __w>::__value>(__sum);
575           }
576         _M_carry = (_M_x[long_lag - 1] == 0) ? 1 : 0;
577         _M_p = 0;
578       }
579
580   template<typename _UIntType, size_t __w, size_t __s, size_t __r>
581     typename subtract_with_carry_engine<_UIntType, __w, __s, __r>::
582              result_type
583     subtract_with_carry_engine<_UIntType, __w, __s, __r>::
584     operator()()
585     {
586       // Derive short lag index from current index.
587       long __ps = _M_p - short_lag;
588       if (__ps < 0)
589         __ps += long_lag;
590
591       // Calculate new x(i) without overflow or division.
592       // NB: Thanks to the requirements for _UIntType, _M_x[_M_p] + _M_carry
593       // cannot overflow.
594       _UIntType __xi;
595       if (_M_x[__ps] >= _M_x[_M_p] + _M_carry)
596         {
597           __xi = _M_x[__ps] - _M_x[_M_p] - _M_carry;
598           _M_carry = 0;
599         }
600       else
601         {
602           __xi = (__detail::_Shift<_UIntType, __w>::__value
603                   - _M_x[_M_p] - _M_carry + _M_x[__ps]);
604           _M_carry = 1;
605         }
606       _M_x[_M_p] = __xi;
607
608       // Adjust current index to loop around in ring buffer.
609       if (++_M_p >= long_lag)
610         _M_p = 0;
611
612       return __xi;
613     }
614
615   template<typename _UIntType, size_t __w, size_t __s, size_t __r,
616            typename _CharT, typename _Traits>
617     std::basic_ostream<_CharT, _Traits>&
618     operator<<(std::basic_ostream<_CharT, _Traits>& __os,
619                const subtract_with_carry_engine<_UIntType,
620                                                 __w, __s, __r>& __x)
621     {
622       typedef std::basic_ostream<_CharT, _Traits>  __ostream_type;
623       typedef typename __ostream_type::ios_base    __ios_base;
624
625       const typename __ios_base::fmtflags __flags = __os.flags();
626       const _CharT __fill = __os.fill();
627       const _CharT __space = __os.widen(' ');
628       __os.flags(__ios_base::dec | __ios_base::fixed | __ios_base::left);
629       __os.fill(__space);
630
631       for (size_t __i = 0; __i < __r; ++__i)
632         __os << __x._M_x[__i] << __space;
633       __os << __x._M_carry << __space << __x._M_p;
634
635       __os.flags(__flags);
636       __os.fill(__fill);
637       return __os;
638     }
639
640   template<typename _UIntType, size_t __w, size_t __s, size_t __r,
641            typename _CharT, typename _Traits>
642     std::basic_istream<_CharT, _Traits>&
643     operator>>(std::basic_istream<_CharT, _Traits>& __is,
644                subtract_with_carry_engine<_UIntType, __w, __s, __r>& __x)
645     {
646       typedef std::basic_ostream<_CharT, _Traits>  __istream_type;
647       typedef typename __istream_type::ios_base    __ios_base;
648
649       const typename __ios_base::fmtflags __flags = __is.flags();
650       __is.flags(__ios_base::dec | __ios_base::skipws);
651
652       for (size_t __i = 0; __i < __r; ++__i)
653         __is >> __x._M_x[__i];
654       __is >> __x._M_carry;
655       __is >> __x._M_p;
656
657       __is.flags(__flags);
658       return __is;
659     }
660
661
662   template<typename _RandomNumberEngine, size_t __p, size_t __r>
663     constexpr size_t
664     discard_block_engine<_RandomNumberEngine, __p, __r>::block_size;
665
666   template<typename _RandomNumberEngine, size_t __p, size_t __r>
667     constexpr size_t
668     discard_block_engine<_RandomNumberEngine, __p, __r>::used_block;
669
670   template<typename _RandomNumberEngine, size_t __p, size_t __r>
671     typename discard_block_engine<_RandomNumberEngine,
672                            __p, __r>::result_type
673     discard_block_engine<_RandomNumberEngine, __p, __r>::
674     operator()()
675     {
676       if (_M_n >= used_block)
677         {
678           _M_b.discard(block_size - _M_n);
679           _M_n = 0;
680         }
681       ++_M_n;
682       return _M_b();
683     }
684
685   template<typename _RandomNumberEngine, size_t __p, size_t __r,
686            typename _CharT, typename _Traits>
687     std::basic_ostream<_CharT, _Traits>&
688     operator<<(std::basic_ostream<_CharT, _Traits>& __os,
689                const discard_block_engine<_RandomNumberEngine,
690                __p, __r>& __x)
691     {
692       typedef std::basic_ostream<_CharT, _Traits>  __ostream_type;
693       typedef typename __ostream_type::ios_base    __ios_base;
694
695       const typename __ios_base::fmtflags __flags = __os.flags();
696       const _CharT __fill = __os.fill();
697       const _CharT __space = __os.widen(' ');
698       __os.flags(__ios_base::dec | __ios_base::fixed | __ios_base::left);
699       __os.fill(__space);
700
701       __os << __x.base() << __space << __x._M_n;
702
703       __os.flags(__flags);
704       __os.fill(__fill);
705       return __os;
706     }
707
708   template<typename _RandomNumberEngine, size_t __p, size_t __r,
709            typename _CharT, typename _Traits>
710     std::basic_istream<_CharT, _Traits>&
711     operator>>(std::basic_istream<_CharT, _Traits>& __is,
712                discard_block_engine<_RandomNumberEngine, __p, __r>& __x)
713     {
714       typedef std::basic_istream<_CharT, _Traits>  __istream_type;
715       typedef typename __istream_type::ios_base    __ios_base;
716
717       const typename __ios_base::fmtflags __flags = __is.flags();
718       __is.flags(__ios_base::dec | __ios_base::skipws);
719
720       __is >> __x._M_b >> __x._M_n;
721
722       __is.flags(__flags);
723       return __is;
724     }
725
726
727   template<typename _RandomNumberEngine, size_t __w, typename _UIntType>
728     typename independent_bits_engine<_RandomNumberEngine, __w, _UIntType>::
729       result_type
730     independent_bits_engine<_RandomNumberEngine, __w, _UIntType>::
731     operator()()
732     {
733       typedef typename _RandomNumberEngine::result_type _Eresult_type;
734       const _Eresult_type __r
735         = (_M_b.max() - _M_b.min() < std::numeric_limits<_Eresult_type>::max()
736            ? _M_b.max() - _M_b.min() + 1 : 0);
737       const unsigned __edig = std::numeric_limits<_Eresult_type>::digits;
738       const unsigned __m = __r ? std::__lg(__r) : __edig;
739
740       typedef typename std::common_type<_Eresult_type, result_type>::type
741         __ctype;
742       const unsigned __cdig = std::numeric_limits<__ctype>::digits;
743
744       unsigned __n, __n0;
745       __ctype __s0, __s1, __y0, __y1;
746
747       for (size_t __i = 0; __i < 2; ++__i)
748         {
749           __n = (__w + __m - 1) / __m + __i;
750           __n0 = __n - __w % __n;
751           const unsigned __w0 = __w / __n;  // __w0 <= __m
752
753           __s0 = 0;
754           __s1 = 0;
755           if (__w0 < __cdig)
756             {
757               __s0 = __ctype(1) << __w0;
758               __s1 = __s0 << 1;
759             }
760
761           __y0 = 0;
762           __y1 = 0;
763           if (__r)
764             {
765               __y0 = __s0 * (__r / __s0);
766               if (__s1)
767                 __y1 = __s1 * (__r / __s1);
768
769               if (__r - __y0 <= __y0 / __n)
770                 break;
771             }
772           else
773             break;
774         }
775
776       result_type __sum = 0;
777       for (size_t __k = 0; __k < __n0; ++__k)
778         {
779           __ctype __u;
780           do
781             __u = _M_b() - _M_b.min();
782           while (__y0 && __u >= __y0);
783           __sum = __s0 * __sum + (__s0 ? __u % __s0 : __u);
784         }
785       for (size_t __k = __n0; __k < __n; ++__k)
786         {
787           __ctype __u;
788           do
789             __u = _M_b() - _M_b.min();
790           while (__y1 && __u >= __y1);
791           __sum = __s1 * __sum + (__s1 ? __u % __s1 : __u);
792         }
793       return __sum;
794     }
795
796
797   template<typename _RandomNumberEngine, size_t __k>
798     constexpr size_t
799     shuffle_order_engine<_RandomNumberEngine, __k>::table_size;
800
801   template<typename _RandomNumberEngine, size_t __k>
802     typename shuffle_order_engine<_RandomNumberEngine, __k>::result_type
803     shuffle_order_engine<_RandomNumberEngine, __k>::
804     operator()()
805     {
806       size_t __j = __k * ((_M_y - _M_b.min())
807                           / (_M_b.max() - _M_b.min() + 1.0L));
808       _M_y = _M_v[__j];
809       _M_v[__j] = _M_b();
810
811       return _M_y;
812     }
813
814   template<typename _RandomNumberEngine, size_t __k,
815            typename _CharT, typename _Traits>
816     std::basic_ostream<_CharT, _Traits>&
817     operator<<(std::basic_ostream<_CharT, _Traits>& __os,
818                const shuffle_order_engine<_RandomNumberEngine, __k>& __x)
819     {
820       typedef std::basic_ostream<_CharT, _Traits>  __ostream_type;
821       typedef typename __ostream_type::ios_base    __ios_base;
822
823       const typename __ios_base::fmtflags __flags = __os.flags();
824       const _CharT __fill = __os.fill();
825       const _CharT __space = __os.widen(' ');
826       __os.flags(__ios_base::dec | __ios_base::fixed | __ios_base::left);
827       __os.fill(__space);
828
829       __os << __x.base();
830       for (size_t __i = 0; __i < __k; ++__i)
831         __os << __space << __x._M_v[__i];
832       __os << __space << __x._M_y;
833
834       __os.flags(__flags);
835       __os.fill(__fill);
836       return __os;
837     }
838
839   template<typename _RandomNumberEngine, size_t __k,
840            typename _CharT, typename _Traits>
841     std::basic_istream<_CharT, _Traits>&
842     operator>>(std::basic_istream<_CharT, _Traits>& __is,
843                shuffle_order_engine<_RandomNumberEngine, __k>& __x)
844     {
845       typedef std::basic_istream<_CharT, _Traits>  __istream_type;
846       typedef typename __istream_type::ios_base    __ios_base;
847
848       const typename __ios_base::fmtflags __flags = __is.flags();
849       __is.flags(__ios_base::dec | __ios_base::skipws);
850
851       __is >> __x._M_b;
852       for (size_t __i = 0; __i < __k; ++__i)
853         __is >> __x._M_v[__i];
854       __is >> __x._M_y;
855
856       __is.flags(__flags);
857       return __is;
858     }
859
860
861   template<typename _IntType>
862     template<typename _UniformRandomNumberGenerator>
863       typename uniform_int_distribution<_IntType>::result_type
864       uniform_int_distribution<_IntType>::
865       operator()(_UniformRandomNumberGenerator& __urng,
866                  const param_type& __param)
867       {
868         typedef typename _UniformRandomNumberGenerator::result_type
869           _Gresult_type;
870         typedef typename std::make_unsigned<result_type>::type __utype;
871         typedef typename std::common_type<_Gresult_type, __utype>::type
872           __uctype;
873
874         const __uctype __urngmin = __urng.min();
875         const __uctype __urngmax = __urng.max();
876         const __uctype __urngrange = __urngmax - __urngmin;
877         const __uctype __urange
878           = __uctype(__param.b()) - __uctype(__param.a());
879
880         __uctype __ret;
881
882         if (__urngrange > __urange)
883           {
884             // downscaling
885             const __uctype __uerange = __urange + 1; // __urange can be zero
886             const __uctype __scaling = __urngrange / __uerange;
887             const __uctype __past = __uerange * __scaling;
888             do
889               __ret = __uctype(__urng()) - __urngmin;
890             while (__ret >= __past);
891             __ret /= __scaling;
892           }
893         else if (__urngrange < __urange)
894           {
895             // upscaling
896             /*
897               Note that every value in [0, urange]
898               can be written uniquely as
899
900               (urngrange + 1) * high + low
901
902               where
903
904               high in [0, urange / (urngrange + 1)]
905
906               and
907         
908               low in [0, urngrange].
909             */
910             __uctype __tmp; // wraparound control
911             do
912               {
913                 const __uctype __uerngrange = __urngrange + 1;
914                 __tmp = (__uerngrange * operator()
915                          (__urng, param_type(0, __urange / __uerngrange)));
916                 __ret = __tmp + (__uctype(__urng()) - __urngmin);
917               }
918             while (__ret > __urange || __ret < __tmp);
919           }
920         else
921           __ret = __uctype(__urng()) - __urngmin;
922
923         return __ret + __param.a();
924       }
925
926   template<typename _IntType, typename _CharT, typename _Traits>
927     std::basic_ostream<_CharT, _Traits>&
928     operator<<(std::basic_ostream<_CharT, _Traits>& __os,
929                const uniform_int_distribution<_IntType>& __x)
930     {
931       typedef std::basic_ostream<_CharT, _Traits>  __ostream_type;
932       typedef typename __ostream_type::ios_base    __ios_base;
933
934       const typename __ios_base::fmtflags __flags = __os.flags();
935       const _CharT __fill = __os.fill();
936       const _CharT __space = __os.widen(' ');
937       __os.flags(__ios_base::scientific | __ios_base::left);
938       __os.fill(__space);
939
940       __os << __x.a() << __space << __x.b();
941
942       __os.flags(__flags);
943       __os.fill(__fill);
944       return __os;
945     }
946
947   template<typename _IntType, typename _CharT, typename _Traits>
948     std::basic_istream<_CharT, _Traits>&
949     operator>>(std::basic_istream<_CharT, _Traits>& __is,
950                uniform_int_distribution<_IntType>& __x)
951     {
952       typedef std::basic_istream<_CharT, _Traits>  __istream_type;
953       typedef typename __istream_type::ios_base    __ios_base;
954
955       const typename __ios_base::fmtflags __flags = __is.flags();
956       __is.flags(__ios_base::dec | __ios_base::skipws);
957
958       _IntType __a, __b;
959       __is >> __a >> __b;
960       __x.param(typename uniform_int_distribution<_IntType>::
961                 param_type(__a, __b));
962
963       __is.flags(__flags);
964       return __is;
965     }
966
967
968   template<typename _RealType, typename _CharT, typename _Traits>
969     std::basic_ostream<_CharT, _Traits>&
970     operator<<(std::basic_ostream<_CharT, _Traits>& __os,
971                const uniform_real_distribution<_RealType>& __x)
972     {
973       typedef std::basic_ostream<_CharT, _Traits>  __ostream_type;
974       typedef typename __ostream_type::ios_base    __ios_base;
975
976       const typename __ios_base::fmtflags __flags = __os.flags();
977       const _CharT __fill = __os.fill();
978       const std::streamsize __precision = __os.precision();
979       const _CharT __space = __os.widen(' ');
980       __os.flags(__ios_base::scientific | __ios_base::left);
981       __os.fill(__space);
982       __os.precision(std::numeric_limits<_RealType>::max_digits10);
983
984       __os << __x.a() << __space << __x.b();
985
986       __os.flags(__flags);
987       __os.fill(__fill);
988       __os.precision(__precision);
989       return __os;
990     }
991
992   template<typename _RealType, typename _CharT, typename _Traits>
993     std::basic_istream<_CharT, _Traits>&
994     operator>>(std::basic_istream<_CharT, _Traits>& __is,
995                uniform_real_distribution<_RealType>& __x)
996     {
997       typedef std::basic_istream<_CharT, _Traits>  __istream_type;
998       typedef typename __istream_type::ios_base    __ios_base;
999
1000       const typename __ios_base::fmtflags __flags = __is.flags();
1001       __is.flags(__ios_base::skipws);
1002
1003       _RealType __a, __b;
1004       __is >> __a >> __b;
1005       __x.param(typename uniform_real_distribution<_RealType>::
1006                 param_type(__a, __b));
1007
1008       __is.flags(__flags);
1009       return __is;
1010     }
1011
1012
1013   template<typename _CharT, typename _Traits>
1014     std::basic_ostream<_CharT, _Traits>&
1015     operator<<(std::basic_ostream<_CharT, _Traits>& __os,
1016                const bernoulli_distribution& __x)
1017     {
1018       typedef std::basic_ostream<_CharT, _Traits>  __ostream_type;
1019       typedef typename __ostream_type::ios_base    __ios_base;
1020
1021       const typename __ios_base::fmtflags __flags = __os.flags();
1022       const _CharT __fill = __os.fill();
1023       const std::streamsize __precision = __os.precision();
1024       __os.flags(__ios_base::scientific | __ios_base::left);
1025       __os.fill(__os.widen(' '));
1026       __os.precision(std::numeric_limits<double>::max_digits10);
1027
1028       __os << __x.p();
1029
1030       __os.flags(__flags);
1031       __os.fill(__fill);
1032       __os.precision(__precision);
1033       return __os;
1034     }
1035
1036
1037   template<typename _IntType>
1038     template<typename _UniformRandomNumberGenerator>
1039       typename geometric_distribution<_IntType>::result_type
1040       geometric_distribution<_IntType>::
1041       operator()(_UniformRandomNumberGenerator& __urng,
1042                  const param_type& __param)
1043       {
1044         // About the epsilon thing see this thread:
1045         // http://gcc.gnu.org/ml/gcc-patches/2006-10/msg00971.html
1046         const double __naf =
1047           (1 - std::numeric_limits<double>::epsilon()) / 2;
1048         // The largest _RealType convertible to _IntType.
1049         const double __thr =
1050           std::numeric_limits<_IntType>::max() + __naf;
1051         __detail::_Adaptor<_UniformRandomNumberGenerator, double>
1052           __aurng(__urng);
1053
1054         double __cand;
1055         do
1056           __cand = std::floor(std::log(__aurng()) / __param._M_log_1_p);
1057         while (__cand >= __thr);
1058
1059         return result_type(__cand + __naf);
1060       }
1061
1062   template<typename _IntType,
1063            typename _CharT, typename _Traits>
1064     std::basic_ostream<_CharT, _Traits>&
1065     operator<<(std::basic_ostream<_CharT, _Traits>& __os,
1066                const geometric_distribution<_IntType>& __x)
1067     {
1068       typedef std::basic_ostream<_CharT, _Traits>  __ostream_type;
1069       typedef typename __ostream_type::ios_base    __ios_base;
1070
1071       const typename __ios_base::fmtflags __flags = __os.flags();
1072       const _CharT __fill = __os.fill();
1073       const std::streamsize __precision = __os.precision();
1074       __os.flags(__ios_base::scientific | __ios_base::left);
1075       __os.fill(__os.widen(' '));
1076       __os.precision(std::numeric_limits<double>::max_digits10);
1077
1078       __os << __x.p();
1079
1080       __os.flags(__flags);
1081       __os.fill(__fill);
1082       __os.precision(__precision);
1083       return __os;
1084     }
1085
1086   template<typename _IntType,
1087            typename _CharT, typename _Traits>
1088     std::basic_istream<_CharT, _Traits>&
1089     operator>>(std::basic_istream<_CharT, _Traits>& __is,
1090                geometric_distribution<_IntType>& __x)
1091     {
1092       typedef std::basic_istream<_CharT, _Traits>  __istream_type;
1093       typedef typename __istream_type::ios_base    __ios_base;
1094
1095       const typename __ios_base::fmtflags __flags = __is.flags();
1096       __is.flags(__ios_base::skipws);
1097
1098       double __p;
1099       __is >> __p;
1100       __x.param(typename geometric_distribution<_IntType>::param_type(__p));
1101
1102       __is.flags(__flags);
1103       return __is;
1104     }
1105
1106   // This is Leger's algorithm, also in Devroye, Ch. X, Example 1.5.
1107   template<typename _IntType>
1108     template<typename _UniformRandomNumberGenerator>
1109       typename negative_binomial_distribution<_IntType>::result_type
1110       negative_binomial_distribution<_IntType>::
1111       operator()(_UniformRandomNumberGenerator& __urng)
1112       {
1113         const double __y = _M_gd(__urng);
1114
1115         // XXX Is the constructor too slow?
1116         std::poisson_distribution<result_type> __poisson(__y);
1117         return __poisson(__urng);
1118       }
1119
1120   template<typename _IntType>
1121     template<typename _UniformRandomNumberGenerator>
1122       typename negative_binomial_distribution<_IntType>::result_type
1123       negative_binomial_distribution<_IntType>::
1124       operator()(_UniformRandomNumberGenerator& __urng,
1125                  const param_type& __p)
1126       {
1127         typedef typename std::gamma_distribution<result_type>::param_type
1128           param_type;
1129         
1130         const double __y =
1131           _M_gd(__urng, param_type(__p.k(), (1.0 - __p.p()) / __p.p()));
1132
1133         std::poisson_distribution<result_type> __poisson(__y);
1134         return __poisson(__urng);
1135       }
1136
1137   template<typename _IntType, typename _CharT, typename _Traits>
1138     std::basic_ostream<_CharT, _Traits>&
1139     operator<<(std::basic_ostream<_CharT, _Traits>& __os,
1140                const negative_binomial_distribution<_IntType>& __x)
1141     {
1142       typedef std::basic_ostream<_CharT, _Traits>  __ostream_type;
1143       typedef typename __ostream_type::ios_base    __ios_base;
1144
1145       const typename __ios_base::fmtflags __flags = __os.flags();
1146       const _CharT __fill = __os.fill();
1147       const std::streamsize __precision = __os.precision();
1148       const _CharT __space = __os.widen(' ');
1149       __os.flags(__ios_base::scientific | __ios_base::left);
1150       __os.fill(__os.widen(' '));
1151       __os.precision(std::numeric_limits<double>::max_digits10);
1152
1153       __os << __x.k() << __space << __x.p()
1154            << __space << __x._M_gd;
1155
1156       __os.flags(__flags);
1157       __os.fill(__fill);
1158       __os.precision(__precision);
1159       return __os;
1160     }
1161
1162   template<typename _IntType, typename _CharT, typename _Traits>
1163     std::basic_istream<_CharT, _Traits>&
1164     operator>>(std::basic_istream<_CharT, _Traits>& __is,
1165                negative_binomial_distribution<_IntType>& __x)
1166     {
1167       typedef std::basic_istream<_CharT, _Traits>  __istream_type;
1168       typedef typename __istream_type::ios_base    __ios_base;
1169
1170       const typename __ios_base::fmtflags __flags = __is.flags();
1171       __is.flags(__ios_base::skipws);
1172
1173       _IntType __k;
1174       double __p;
1175       __is >> __k >> __p >> __x._M_gd;
1176       __x.param(typename negative_binomial_distribution<_IntType>::
1177                 param_type(__k, __p));
1178
1179       __is.flags(__flags);
1180       return __is;
1181     }
1182
1183
1184   template<typename _IntType>
1185     void
1186     poisson_distribution<_IntType>::param_type::
1187     _M_initialize()
1188     {
1189 #if _GLIBCXX_USE_C99_MATH_TR1
1190       if (_M_mean >= 12)
1191         {
1192           const double __m = std::floor(_M_mean);
1193           _M_lm_thr = std::log(_M_mean);
1194           _M_lfm = std::lgamma(__m + 1);
1195           _M_sm = std::sqrt(__m);
1196
1197           const double __pi_4 = 0.7853981633974483096156608458198757L;
1198           const double __dx = std::sqrt(2 * __m * std::log(32 * __m
1199                                                               / __pi_4));
1200           _M_d = std::round(std::max(6.0, std::min(__m, __dx)));
1201           const double __cx = 2 * __m + _M_d;
1202           _M_scx = std::sqrt(__cx / 2);
1203           _M_1cx = 1 / __cx;
1204
1205           _M_c2b = std::sqrt(__pi_4 * __cx) * std::exp(_M_1cx);
1206           _M_cb = 2 * __cx * std::exp(-_M_d * _M_1cx * (1 + _M_d / 2))
1207                 / _M_d;
1208         }
1209       else
1210 #endif
1211         _M_lm_thr = std::exp(-_M_mean);
1212       }
1213
1214   /**
1215    * A rejection algorithm when mean >= 12 and a simple method based
1216    * upon the multiplication of uniform random variates otherwise.
1217    * NB: The former is available only if _GLIBCXX_USE_C99_MATH_TR1
1218    * is defined.
1219    *
1220    * Reference:
1221    * Devroye, L. Non-Uniform Random Variates Generation. Springer-Verlag,
1222    * New York, 1986, Ch. X, Sects. 3.3 & 3.4 (+ Errata!).
1223    */
1224   template<typename _IntType>
1225     template<typename _UniformRandomNumberGenerator>
1226       typename poisson_distribution<_IntType>::result_type
1227       poisson_distribution<_IntType>::
1228       operator()(_UniformRandomNumberGenerator& __urng,
1229                  const param_type& __param)
1230       {
1231         __detail::_Adaptor<_UniformRandomNumberGenerator, double>
1232           __aurng(__urng);
1233 #if _GLIBCXX_USE_C99_MATH_TR1
1234         if (__param.mean() >= 12)
1235           {
1236             double __x;
1237
1238             // See comments above...
1239             const double __naf =
1240               (1 - std::numeric_limits<double>::epsilon()) / 2;
1241             const double __thr =
1242               std::numeric_limits<_IntType>::max() + __naf;
1243
1244             const double __m = std::floor(__param.mean());
1245             // sqrt(pi / 2)
1246             const double __spi_2 = 1.2533141373155002512078826424055226L;
1247             const double __c1 = __param._M_sm * __spi_2;
1248             const double __c2 = __param._M_c2b + __c1;
1249             const double __c3 = __c2 + 1;
1250             const double __c4 = __c3 + 1;
1251             // e^(1 / 78)
1252             const double __e178 = 1.0129030479320018583185514777512983L;
1253             const double __c5 = __c4 + __e178;
1254             const double __c = __param._M_cb + __c5;
1255             const double __2cx = 2 * (2 * __m + __param._M_d);
1256
1257             bool __reject = true;
1258             do
1259               {
1260                 const double __u = __c * __aurng();
1261                 const double __e = -std::log(__aurng());
1262
1263                 double __w = 0.0;
1264
1265                 if (__u <= __c1)
1266                   {
1267                     const double __n = _M_nd(__urng);
1268                     const double __y = -std::abs(__n) * __param._M_sm - 1;
1269                     __x = std::floor(__y);
1270                     __w = -__n * __n / 2;
1271                     if (__x < -__m)
1272                       continue;
1273                   }
1274                 else if (__u <= __c2)
1275                   {
1276                     const double __n = _M_nd(__urng);
1277                     const double __y = 1 + std::abs(__n) * __param._M_scx;
1278                     __x = std::ceil(__y);
1279                     __w = __y * (2 - __y) * __param._M_1cx;
1280                     if (__x > __param._M_d)
1281                       continue;
1282                   }
1283                 else if (__u <= __c3)
1284                   // NB: This case not in the book, nor in the Errata,
1285                   // but should be ok...
1286                   __x = -1;
1287                 else if (__u <= __c4)
1288                   __x = 0;
1289                 else if (__u <= __c5)
1290                   __x = 1;
1291                 else
1292                   {
1293                     const double __v = -std::log(__aurng());
1294                     const double __y = __param._M_d
1295                                      + __v * __2cx / __param._M_d;
1296                     __x = std::ceil(__y);
1297                     __w = -__param._M_d * __param._M_1cx * (1 + __y / 2);
1298                   }
1299
1300                 __reject = (__w - __e - __x * __param._M_lm_thr
1301                             > __param._M_lfm - std::lgamma(__x + __m + 1));
1302
1303                 __reject |= __x + __m >= __thr;
1304
1305               } while (__reject);
1306
1307             return result_type(__x + __m + __naf);
1308           }
1309         else
1310 #endif
1311           {
1312             _IntType     __x = 0;
1313             double __prod = 1.0;
1314
1315             do
1316               {
1317                 __prod *= __aurng();
1318                 __x += 1;
1319               }
1320             while (__prod > __param._M_lm_thr);
1321
1322             return __x - 1;
1323           }
1324       }
1325
1326   template<typename _IntType,
1327            typename _CharT, typename _Traits>
1328     std::basic_ostream<_CharT, _Traits>&
1329     operator<<(std::basic_ostream<_CharT, _Traits>& __os,
1330                const poisson_distribution<_IntType>& __x)
1331     {
1332       typedef std::basic_ostream<_CharT, _Traits>  __ostream_type;
1333       typedef typename __ostream_type::ios_base    __ios_base;
1334
1335       const typename __ios_base::fmtflags __flags = __os.flags();
1336       const _CharT __fill = __os.fill();
1337       const std::streamsize __precision = __os.precision();
1338       const _CharT __space = __os.widen(' ');
1339       __os.flags(__ios_base::scientific | __ios_base::left);
1340       __os.fill(__space);
1341       __os.precision(std::numeric_limits<double>::max_digits10);
1342
1343       __os << __x.mean() << __space << __x._M_nd;
1344
1345       __os.flags(__flags);
1346       __os.fill(__fill);
1347       __os.precision(__precision);
1348       return __os;
1349     }
1350
1351   template<typename _IntType,
1352            typename _CharT, typename _Traits>
1353     std::basic_istream<_CharT, _Traits>&
1354     operator>>(std::basic_istream<_CharT, _Traits>& __is,
1355                poisson_distribution<_IntType>& __x)
1356     {
1357       typedef std::basic_istream<_CharT, _Traits>  __istream_type;
1358       typedef typename __istream_type::ios_base    __ios_base;
1359
1360       const typename __ios_base::fmtflags __flags = __is.flags();
1361       __is.flags(__ios_base::skipws);
1362
1363       double __mean;
1364       __is >> __mean >> __x._M_nd;
1365       __x.param(typename poisson_distribution<_IntType>::param_type(__mean));
1366
1367       __is.flags(__flags);
1368       return __is;
1369     }
1370
1371
1372   template<typename _IntType>
1373     void
1374     binomial_distribution<_IntType>::param_type::
1375     _M_initialize()
1376     {
1377       const double __p12 = _M_p <= 0.5 ? _M_p : 1.0 - _M_p;
1378
1379       _M_easy = true;
1380
1381 #if _GLIBCXX_USE_C99_MATH_TR1
1382       if (_M_t * __p12 >= 8)
1383         {
1384           _M_easy = false;
1385           const double __np = std::floor(_M_t * __p12);
1386           const double __pa = __np / _M_t;
1387           const double __1p = 1 - __pa;
1388
1389           const double __pi_4 = 0.7853981633974483096156608458198757L;
1390           const double __d1x =
1391             std::sqrt(__np * __1p * std::log(32 * __np
1392                                              / (81 * __pi_4 * __1p)));
1393           _M_d1 = std::round(std::max(1.0, __d1x));
1394           const double __d2x =
1395             std::sqrt(__np * __1p * std::log(32 * _M_t * __1p
1396                                              / (__pi_4 * __pa)));
1397           _M_d2 = std::round(std::max(1.0, __d2x));
1398
1399           // sqrt(pi / 2)
1400           const double __spi_2 = 1.2533141373155002512078826424055226L;
1401           _M_s1 = std::sqrt(__np * __1p) * (1 + _M_d1 / (4 * __np));
1402           _M_s2 = std::sqrt(__np * __1p) * (1 + _M_d2 / (4 * _M_t * __1p));
1403           _M_c = 2 * _M_d1 / __np;
1404           _M_a1 = std::exp(_M_c) * _M_s1 * __spi_2;
1405           const double __a12 = _M_a1 + _M_s2 * __spi_2;
1406           const double __s1s = _M_s1 * _M_s1;
1407           _M_a123 = __a12 + (std::exp(_M_d1 / (_M_t * __1p))
1408                              * 2 * __s1s / _M_d1
1409                              * std::exp(-_M_d1 * _M_d1 / (2 * __s1s)));
1410           const double __s2s = _M_s2 * _M_s2;
1411           _M_s = (_M_a123 + 2 * __s2s / _M_d2
1412                   * std::exp(-_M_d2 * _M_d2 / (2 * __s2s)));
1413           _M_lf = (std::lgamma(__np + 1)
1414                    + std::lgamma(_M_t - __np + 1));
1415           _M_lp1p = std::log(__pa / __1p);
1416
1417           _M_q = -std::log(1 - (__p12 - __pa) / __1p);
1418         }
1419       else
1420 #endif
1421         _M_q = -std::log(1 - __p12);
1422     }
1423
1424   template<typename _IntType>
1425     template<typename _UniformRandomNumberGenerator>
1426       typename binomial_distribution<_IntType>::result_type
1427       binomial_distribution<_IntType>::
1428       _M_waiting(_UniformRandomNumberGenerator& __urng, _IntType __t)
1429       {
1430         _IntType __x = 0;
1431         double __sum = 0.0;
1432         __detail::_Adaptor<_UniformRandomNumberGenerator, double>
1433           __aurng(__urng);
1434
1435         do
1436           {
1437             const double __e = -std::log(__aurng());
1438             __sum += __e / (__t - __x);
1439             __x += 1;
1440           }
1441         while (__sum <= _M_param._M_q);
1442
1443         return __x - 1;
1444       }
1445
1446   /**
1447    * A rejection algorithm when t * p >= 8 and a simple waiting time
1448    * method - the second in the referenced book - otherwise.
1449    * NB: The former is available only if _GLIBCXX_USE_C99_MATH_TR1
1450    * is defined.
1451    *
1452    * Reference:
1453    * Devroye, L. Non-Uniform Random Variates Generation. Springer-Verlag,
1454    * New York, 1986, Ch. X, Sect. 4 (+ Errata!).
1455    */
1456   template<typename _IntType>
1457     template<typename _UniformRandomNumberGenerator>
1458       typename binomial_distribution<_IntType>::result_type
1459       binomial_distribution<_IntType>::
1460       operator()(_UniformRandomNumberGenerator& __urng,
1461                  const param_type& __param)
1462       {
1463         result_type __ret;
1464         const _IntType __t = __param.t();
1465         const double __p = __param.p();
1466         const double __p12 = __p <= 0.5 ? __p : 1.0 - __p;
1467         __detail::_Adaptor<_UniformRandomNumberGenerator, double>
1468           __aurng(__urng);
1469
1470 #if _GLIBCXX_USE_C99_MATH_TR1
1471         if (!__param._M_easy)
1472           {
1473             double __x;
1474
1475             // See comments above...
1476             const double __naf =
1477               (1 - std::numeric_limits<double>::epsilon()) / 2;
1478             const double __thr =
1479               std::numeric_limits<_IntType>::max() + __naf;
1480
1481             const double __np = std::floor(__t * __p12);
1482
1483             // sqrt(pi / 2)
1484             const double __spi_2 = 1.2533141373155002512078826424055226L;
1485             const double __a1 = __param._M_a1;
1486             const double __a12 = __a1 + __param._M_s2 * __spi_2;
1487             const double __a123 = __param._M_a123;
1488             const double __s1s = __param._M_s1 * __param._M_s1;
1489             const double __s2s = __param._M_s2 * __param._M_s2;
1490
1491             bool __reject;
1492             do
1493               {
1494                 const double __u = __param._M_s * __aurng();
1495
1496                 double __v;
1497
1498                 if (__u <= __a1)
1499                   {
1500                     const double __n = _M_nd(__urng);
1501                     const double __y = __param._M_s1 * std::abs(__n);
1502                     __reject = __y >= __param._M_d1;
1503                     if (!__reject)
1504                       {
1505                         const double __e = -std::log(__aurng());
1506                         __x = std::floor(__y);
1507                         __v = -__e - __n * __n / 2 + __param._M_c;
1508                       }
1509                   }
1510                 else if (__u <= __a12)
1511                   {
1512                     const double __n = _M_nd(__urng);
1513                     const double __y = __param._M_s2 * std::abs(__n);
1514                     __reject = __y >= __param._M_d2;
1515                     if (!__reject)
1516                       {
1517                         const double __e = -std::log(__aurng());
1518                         __x = std::floor(-__y);
1519                         __v = -__e - __n * __n / 2;
1520                       }
1521                   }
1522                 else if (__u <= __a123)
1523                   {
1524                     const double __e1 = -std::log(__aurng());
1525                     const double __e2 = -std::log(__aurng());
1526
1527                     const double __y = __param._M_d1
1528                                      + 2 * __s1s * __e1 / __param._M_d1;
1529                     __x = std::floor(__y);
1530                     __v = (-__e2 + __param._M_d1 * (1 / (__t - __np)
1531                                                     -__y / (2 * __s1s)));
1532                     __reject = false;
1533                   }
1534                 else
1535                   {
1536                     const double __e1 = -std::log(__aurng());
1537                     const double __e2 = -std::log(__aurng());
1538
1539                     const double __y = __param._M_d2
1540                                      + 2 * __s2s * __e1 / __param._M_d2;
1541                     __x = std::floor(-__y);
1542                     __v = -__e2 - __param._M_d2 * __y / (2 * __s2s);
1543                     __reject = false;
1544                   }
1545
1546                 __reject = __reject || __x < -__np || __x > __t - __np;
1547                 if (!__reject)
1548                   {
1549                     const double __lfx =
1550                       std::lgamma(__np + __x + 1)
1551                       + std::lgamma(__t - (__np + __x) + 1);
1552                     __reject = __v > __param._M_lf - __lfx
1553                              + __x * __param._M_lp1p;
1554                   }
1555
1556                 __reject |= __x + __np >= __thr;
1557               }
1558             while (__reject);
1559
1560             __x += __np + __naf;
1561
1562             const _IntType __z = _M_waiting(__urng, __t - _IntType(__x));
1563             __ret = _IntType(__x) + __z;
1564           }
1565         else
1566 #endif
1567           __ret = _M_waiting(__urng, __t);
1568
1569         if (__p12 != __p)
1570           __ret = __t - __ret;
1571         return __ret;
1572       }
1573
1574   template<typename _IntType,
1575            typename _CharT, typename _Traits>
1576     std::basic_ostream<_CharT, _Traits>&
1577     operator<<(std::basic_ostream<_CharT, _Traits>& __os,
1578                const binomial_distribution<_IntType>& __x)
1579     {
1580       typedef std::basic_ostream<_CharT, _Traits>  __ostream_type;
1581       typedef typename __ostream_type::ios_base    __ios_base;
1582
1583       const typename __ios_base::fmtflags __flags = __os.flags();
1584       const _CharT __fill = __os.fill();
1585       const std::streamsize __precision = __os.precision();
1586       const _CharT __space = __os.widen(' ');
1587       __os.flags(__ios_base::scientific | __ios_base::left);
1588       __os.fill(__space);
1589       __os.precision(std::numeric_limits<double>::max_digits10);
1590
1591       __os << __x.t() << __space << __x.p()
1592            << __space << __x._M_nd;
1593
1594       __os.flags(__flags);
1595       __os.fill(__fill);
1596       __os.precision(__precision);
1597       return __os;
1598     }
1599
1600   template<typename _IntType,
1601            typename _CharT, typename _Traits>
1602     std::basic_istream<_CharT, _Traits>&
1603     operator>>(std::basic_istream<_CharT, _Traits>& __is,
1604                binomial_distribution<_IntType>& __x)
1605     {
1606       typedef std::basic_istream<_CharT, _Traits>  __istream_type;
1607       typedef typename __istream_type::ios_base    __ios_base;
1608
1609       const typename __ios_base::fmtflags __flags = __is.flags();
1610       __is.flags(__ios_base::dec | __ios_base::skipws);
1611
1612       _IntType __t;
1613       double __p;
1614       __is >> __t >> __p >> __x._M_nd;
1615       __x.param(typename binomial_distribution<_IntType>::
1616                 param_type(__t, __p));
1617
1618       __is.flags(__flags);
1619       return __is;
1620     }
1621
1622
1623   template<typename _RealType, typename _CharT, typename _Traits>
1624     std::basic_ostream<_CharT, _Traits>&
1625     operator<<(std::basic_ostream<_CharT, _Traits>& __os,
1626                const exponential_distribution<_RealType>& __x)
1627     {
1628       typedef std::basic_ostream<_CharT, _Traits>  __ostream_type;
1629       typedef typename __ostream_type::ios_base    __ios_base;
1630
1631       const typename __ios_base::fmtflags __flags = __os.flags();
1632       const _CharT __fill = __os.fill();
1633       const std::streamsize __precision = __os.precision();
1634       __os.flags(__ios_base::scientific | __ios_base::left);
1635       __os.fill(__os.widen(' '));
1636       __os.precision(std::numeric_limits<_RealType>::max_digits10);
1637
1638       __os << __x.lambda();
1639
1640       __os.flags(__flags);
1641       __os.fill(__fill);
1642       __os.precision(__precision);
1643       return __os;
1644     }
1645
1646   template<typename _RealType, typename _CharT, typename _Traits>
1647     std::basic_istream<_CharT, _Traits>&
1648     operator>>(std::basic_istream<_CharT, _Traits>& __is,
1649                exponential_distribution<_RealType>& __x)
1650     {
1651       typedef std::basic_istream<_CharT, _Traits>  __istream_type;
1652       typedef typename __istream_type::ios_base    __ios_base;
1653
1654       const typename __ios_base::fmtflags __flags = __is.flags();
1655       __is.flags(__ios_base::dec | __ios_base::skipws);
1656
1657       _RealType __lambda;
1658       __is >> __lambda;
1659       __x.param(typename exponential_distribution<_RealType>::
1660                 param_type(__lambda));
1661
1662       __is.flags(__flags);
1663       return __is;
1664     }
1665
1666
1667   /**
1668    * Polar method due to Marsaglia.
1669    *
1670    * Devroye, L. Non-Uniform Random Variates Generation. Springer-Verlag,
1671    * New York, 1986, Ch. V, Sect. 4.4.
1672    */
1673   template<typename _RealType>
1674     template<typename _UniformRandomNumberGenerator>
1675       typename normal_distribution<_RealType>::result_type
1676       normal_distribution<_RealType>::
1677       operator()(_UniformRandomNumberGenerator& __urng,
1678                  const param_type& __param)
1679       {
1680         result_type __ret;
1681         __detail::_Adaptor<_UniformRandomNumberGenerator, result_type>
1682           __aurng(__urng);
1683
1684         if (_M_saved_available)
1685           {
1686             _M_saved_available = false;
1687             __ret = _M_saved;
1688           }
1689         else
1690           {
1691             result_type __x, __y, __r2;
1692             do
1693               {
1694                 __x = result_type(2.0) * __aurng() - 1.0;
1695                 __y = result_type(2.0) * __aurng() - 1.0;
1696                 __r2 = __x * __x + __y * __y;
1697               }
1698             while (__r2 > 1.0 || __r2 == 0.0);
1699
1700             const result_type __mult = std::sqrt(-2 * std::log(__r2) / __r2);
1701             _M_saved = __x * __mult;
1702             _M_saved_available = true;
1703             __ret = __y * __mult;
1704           }
1705
1706         __ret = __ret * __param.stddev() + __param.mean();
1707         return __ret;
1708       }
1709
1710   template<typename _RealType>
1711     bool
1712     operator==(const std::normal_distribution<_RealType>& __d1,
1713                const std::normal_distribution<_RealType>& __d2)
1714     {
1715       if (__d1._M_param == __d2._M_param
1716           && __d1._M_saved_available == __d2._M_saved_available)
1717         {
1718           if (__d1._M_saved_available
1719               && __d1._M_saved == __d2._M_saved)
1720             return true;
1721           else if(!__d1._M_saved_available)
1722             return true;
1723           else
1724             return false;
1725         }
1726       else
1727         return false;
1728     }
1729
1730   template<typename _RealType, typename _CharT, typename _Traits>
1731     std::basic_ostream<_CharT, _Traits>&
1732     operator<<(std::basic_ostream<_CharT, _Traits>& __os,
1733                const normal_distribution<_RealType>& __x)
1734     {
1735       typedef std::basic_ostream<_CharT, _Traits>  __ostream_type;
1736       typedef typename __ostream_type::ios_base    __ios_base;
1737
1738       const typename __ios_base::fmtflags __flags = __os.flags();
1739       const _CharT __fill = __os.fill();
1740       const std::streamsize __precision = __os.precision();
1741       const _CharT __space = __os.widen(' ');
1742       __os.flags(__ios_base::scientific | __ios_base::left);
1743       __os.fill(__space);
1744       __os.precision(std::numeric_limits<_RealType>::max_digits10);
1745
1746       __os << __x.mean() << __space << __x.stddev()
1747            << __space << __x._M_saved_available;
1748       if (__x._M_saved_available)
1749         __os << __space << __x._M_saved;
1750
1751       __os.flags(__flags);
1752       __os.fill(__fill);
1753       __os.precision(__precision);
1754       return __os;
1755     }
1756
1757   template<typename _RealType, typename _CharT, typename _Traits>
1758     std::basic_istream<_CharT, _Traits>&
1759     operator>>(std::basic_istream<_CharT, _Traits>& __is,
1760                normal_distribution<_RealType>& __x)
1761     {
1762       typedef std::basic_istream<_CharT, _Traits>  __istream_type;
1763       typedef typename __istream_type::ios_base    __ios_base;
1764
1765       const typename __ios_base::fmtflags __flags = __is.flags();
1766       __is.flags(__ios_base::dec | __ios_base::skipws);
1767
1768       double __mean, __stddev;
1769       __is >> __mean >> __stddev
1770            >> __x._M_saved_available;
1771       if (__x._M_saved_available)
1772         __is >> __x._M_saved;
1773       __x.param(typename normal_distribution<_RealType>::
1774                 param_type(__mean, __stddev));
1775
1776       __is.flags(__flags);
1777       return __is;
1778     }
1779
1780
1781   template<typename _RealType, typename _CharT, typename _Traits>
1782     std::basic_ostream<_CharT, _Traits>&
1783     operator<<(std::basic_ostream<_CharT, _Traits>& __os,
1784                const lognormal_distribution<_RealType>& __x)
1785     {
1786       typedef std::basic_ostream<_CharT, _Traits>  __ostream_type;
1787       typedef typename __ostream_type::ios_base    __ios_base;
1788
1789       const typename __ios_base::fmtflags __flags = __os.flags();
1790       const _CharT __fill = __os.fill();
1791       const std::streamsize __precision = __os.precision();
1792       const _CharT __space = __os.widen(' ');
1793       __os.flags(__ios_base::scientific | __ios_base::left);
1794       __os.fill(__space);
1795       __os.precision(std::numeric_limits<_RealType>::max_digits10);
1796
1797       __os << __x.m() << __space << __x.s()
1798            << __space << __x._M_nd;
1799
1800       __os.flags(__flags);
1801       __os.fill(__fill);
1802       __os.precision(__precision);
1803       return __os;
1804     }
1805
1806   template<typename _RealType, typename _CharT, typename _Traits>
1807     std::basic_istream<_CharT, _Traits>&
1808     operator>>(std::basic_istream<_CharT, _Traits>& __is,
1809                lognormal_distribution<_RealType>& __x)
1810     {
1811       typedef std::basic_istream<_CharT, _Traits>  __istream_type;
1812       typedef typename __istream_type::ios_base    __ios_base;
1813
1814       const typename __ios_base::fmtflags __flags = __is.flags();
1815       __is.flags(__ios_base::dec | __ios_base::skipws);
1816
1817       _RealType __m, __s;
1818       __is >> __m >> __s >> __x._M_nd;
1819       __x.param(typename lognormal_distribution<_RealType>::
1820                 param_type(__m, __s));
1821
1822       __is.flags(__flags);
1823       return __is;
1824     }
1825
1826
1827   template<typename _RealType, typename _CharT, typename _Traits>
1828     std::basic_ostream<_CharT, _Traits>&
1829     operator<<(std::basic_ostream<_CharT, _Traits>& __os,
1830                const chi_squared_distribution<_RealType>& __x)
1831     {
1832       typedef std::basic_ostream<_CharT, _Traits>  __ostream_type;
1833       typedef typename __ostream_type::ios_base    __ios_base;
1834
1835       const typename __ios_base::fmtflags __flags = __os.flags();
1836       const _CharT __fill = __os.fill();
1837       const std::streamsize __precision = __os.precision();
1838       const _CharT __space = __os.widen(' ');
1839       __os.flags(__ios_base::scientific | __ios_base::left);
1840       __os.fill(__space);
1841       __os.precision(std::numeric_limits<_RealType>::max_digits10);
1842
1843       __os << __x.n() << __space << __x._M_gd;
1844
1845       __os.flags(__flags);
1846       __os.fill(__fill);
1847       __os.precision(__precision);
1848       return __os;
1849     }
1850
1851   template<typename _RealType, typename _CharT, typename _Traits>
1852     std::basic_istream<_CharT, _Traits>&
1853     operator>>(std::basic_istream<_CharT, _Traits>& __is,
1854                chi_squared_distribution<_RealType>& __x)
1855     {
1856       typedef std::basic_istream<_CharT, _Traits>  __istream_type;
1857       typedef typename __istream_type::ios_base    __ios_base;
1858
1859       const typename __ios_base::fmtflags __flags = __is.flags();
1860       __is.flags(__ios_base::dec | __ios_base::skipws);
1861
1862       _RealType __n;
1863       __is >> __n >> __x._M_gd;
1864       __x.param(typename chi_squared_distribution<_RealType>::
1865                 param_type(__n));
1866
1867       __is.flags(__flags);
1868       return __is;
1869     }
1870
1871
1872   template<typename _RealType>
1873     template<typename _UniformRandomNumberGenerator>
1874       typename cauchy_distribution<_RealType>::result_type
1875       cauchy_distribution<_RealType>::
1876       operator()(_UniformRandomNumberGenerator& __urng,
1877                  const param_type& __p)
1878       {
1879         __detail::_Adaptor<_UniformRandomNumberGenerator, result_type>
1880           __aurng(__urng);
1881         _RealType __u;
1882         do
1883           __u = __aurng();
1884         while (__u == 0.5);
1885
1886         const _RealType __pi = 3.1415926535897932384626433832795029L;
1887         return __p.a() + __p.b() * std::tan(__pi * __u);
1888       }
1889
1890   template<typename _RealType, typename _CharT, typename _Traits>
1891     std::basic_ostream<_CharT, _Traits>&
1892     operator<<(std::basic_ostream<_CharT, _Traits>& __os,
1893                const cauchy_distribution<_RealType>& __x)
1894     {
1895       typedef std::basic_ostream<_CharT, _Traits>  __ostream_type;
1896       typedef typename __ostream_type::ios_base    __ios_base;
1897
1898       const typename __ios_base::fmtflags __flags = __os.flags();
1899       const _CharT __fill = __os.fill();
1900       const std::streamsize __precision = __os.precision();
1901       const _CharT __space = __os.widen(' ');
1902       __os.flags(__ios_base::scientific | __ios_base::left);
1903       __os.fill(__space);
1904       __os.precision(std::numeric_limits<_RealType>::max_digits10);
1905
1906       __os << __x.a() << __space << __x.b();
1907
1908       __os.flags(__flags);
1909       __os.fill(__fill);
1910       __os.precision(__precision);
1911       return __os;
1912     }
1913
1914   template<typename _RealType, typename _CharT, typename _Traits>
1915     std::basic_istream<_CharT, _Traits>&
1916     operator>>(std::basic_istream<_CharT, _Traits>& __is,
1917                cauchy_distribution<_RealType>& __x)
1918     {
1919       typedef std::basic_istream<_CharT, _Traits>  __istream_type;
1920       typedef typename __istream_type::ios_base    __ios_base;
1921
1922       const typename __ios_base::fmtflags __flags = __is.flags();
1923       __is.flags(__ios_base::dec | __ios_base::skipws);
1924
1925       _RealType __a, __b;
1926       __is >> __a >> __b;
1927       __x.param(typename cauchy_distribution<_RealType>::
1928                 param_type(__a, __b));
1929
1930       __is.flags(__flags);
1931       return __is;
1932     }
1933
1934
1935   template<typename _RealType, typename _CharT, typename _Traits>
1936     std::basic_ostream<_CharT, _Traits>&
1937     operator<<(std::basic_ostream<_CharT, _Traits>& __os,
1938                const fisher_f_distribution<_RealType>& __x)
1939     {
1940       typedef std::basic_ostream<_CharT, _Traits>  __ostream_type;
1941       typedef typename __ostream_type::ios_base    __ios_base;
1942
1943       const typename __ios_base::fmtflags __flags = __os.flags();
1944       const _CharT __fill = __os.fill();
1945       const std::streamsize __precision = __os.precision();
1946       const _CharT __space = __os.widen(' ');
1947       __os.flags(__ios_base::scientific | __ios_base::left);
1948       __os.fill(__space);
1949       __os.precision(std::numeric_limits<_RealType>::max_digits10);
1950
1951       __os << __x.m() << __space << __x.n()
1952            << __space << __x._M_gd_x << __space << __x._M_gd_y;
1953
1954       __os.flags(__flags);
1955       __os.fill(__fill);
1956       __os.precision(__precision);
1957       return __os;
1958     }
1959
1960   template<typename _RealType, typename _CharT, typename _Traits>
1961     std::basic_istream<_CharT, _Traits>&
1962     operator>>(std::basic_istream<_CharT, _Traits>& __is,
1963                fisher_f_distribution<_RealType>& __x)
1964     {
1965       typedef std::basic_istream<_CharT, _Traits>  __istream_type;
1966       typedef typename __istream_type::ios_base    __ios_base;
1967
1968       const typename __ios_base::fmtflags __flags = __is.flags();
1969       __is.flags(__ios_base::dec | __ios_base::skipws);
1970
1971       _RealType __m, __n;
1972       __is >> __m >> __n >> __x._M_gd_x >> __x._M_gd_y;
1973       __x.param(typename fisher_f_distribution<_RealType>::
1974                 param_type(__m, __n));
1975
1976       __is.flags(__flags);
1977       return __is;
1978     }
1979
1980
1981   template<typename _RealType, typename _CharT, typename _Traits>
1982     std::basic_ostream<_CharT, _Traits>&
1983     operator<<(std::basic_ostream<_CharT, _Traits>& __os,
1984                const student_t_distribution<_RealType>& __x)
1985     {
1986       typedef std::basic_ostream<_CharT, _Traits>  __ostream_type;
1987       typedef typename __ostream_type::ios_base    __ios_base;
1988
1989       const typename __ios_base::fmtflags __flags = __os.flags();
1990       const _CharT __fill = __os.fill();
1991       const std::streamsize __precision = __os.precision();
1992       const _CharT __space = __os.widen(' ');
1993       __os.flags(__ios_base::scientific | __ios_base::left);
1994       __os.fill(__space);
1995       __os.precision(std::numeric_limits<_RealType>::max_digits10);
1996
1997       __os << __x.n() << __space << __x._M_nd << __space << __x._M_gd;
1998
1999       __os.flags(__flags);
2000       __os.fill(__fill);
2001       __os.precision(__precision);
2002       return __os;
2003     }
2004
2005   template<typename _RealType, typename _CharT, typename _Traits>
2006     std::basic_istream<_CharT, _Traits>&
2007     operator>>(std::basic_istream<_CharT, _Traits>& __is,
2008                student_t_distribution<_RealType>& __x)
2009     {
2010       typedef std::basic_istream<_CharT, _Traits>  __istream_type;
2011       typedef typename __istream_type::ios_base    __ios_base;
2012
2013       const typename __ios_base::fmtflags __flags = __is.flags();
2014       __is.flags(__ios_base::dec | __ios_base::skipws);
2015
2016       _RealType __n;
2017       __is >> __n >> __x._M_nd >> __x._M_gd;
2018       __x.param(typename student_t_distribution<_RealType>::param_type(__n));
2019
2020       __is.flags(__flags);
2021       return __is;
2022     }
2023
2024
2025   template<typename _RealType>
2026     void
2027     gamma_distribution<_RealType>::param_type::
2028     _M_initialize()
2029     {
2030       _M_malpha = _M_alpha < 1.0 ? _M_alpha + _RealType(1.0) : _M_alpha;
2031
2032       const _RealType __a1 = _M_malpha - _RealType(1.0) / _RealType(3.0);
2033       _M_a2 = _RealType(1.0) / std::sqrt(_RealType(9.0) * __a1);
2034     }
2035
2036   /**
2037    * Marsaglia, G. and Tsang, W. W.
2038    * "A Simple Method for Generating Gamma Variables"
2039    * ACM Transactions on Mathematical Software, 26, 3, 363-372, 2000.
2040    */
2041   template<typename _RealType>
2042     template<typename _UniformRandomNumberGenerator>
2043       typename gamma_distribution<_RealType>::result_type
2044       gamma_distribution<_RealType>::
2045       operator()(_UniformRandomNumberGenerator& __urng,
2046                  const param_type& __param)
2047       {
2048         __detail::_Adaptor<_UniformRandomNumberGenerator, result_type>
2049           __aurng(__urng);
2050
2051         result_type __u, __v, __n;
2052         const result_type __a1 = (__param._M_malpha
2053                                   - _RealType(1.0) / _RealType(3.0));
2054
2055         do
2056           {
2057             do
2058               {
2059                 __n = _M_nd(__urng);
2060                 __v = result_type(1.0) + __param._M_a2 * __n; 
2061               }
2062             while (__v <= 0.0);
2063
2064             __v = __v * __v * __v;
2065             __u = __aurng();
2066           }
2067         while (__u > result_type(1.0) - 0.331 * __n * __n * __n * __n
2068                && (std::log(__u) > (0.5 * __n * __n + __a1
2069                                     * (1.0 - __v + std::log(__v)))));
2070
2071         if (__param.alpha() == __param._M_malpha)
2072           return __a1 * __v * __param.beta();
2073         else
2074           {
2075             do
2076               __u = __aurng();
2077             while (__u == 0.0);
2078             
2079             return (std::pow(__u, result_type(1.0) / __param.alpha())
2080                     * __a1 * __v * __param.beta());
2081           }
2082       }
2083
2084   template<typename _RealType, typename _CharT, typename _Traits>
2085     std::basic_ostream<_CharT, _Traits>&
2086     operator<<(std::basic_ostream<_CharT, _Traits>& __os,
2087                const gamma_distribution<_RealType>& __x)
2088     {
2089       typedef std::basic_ostream<_CharT, _Traits>  __ostream_type;
2090       typedef typename __ostream_type::ios_base    __ios_base;
2091
2092       const typename __ios_base::fmtflags __flags = __os.flags();
2093       const _CharT __fill = __os.fill();
2094       const std::streamsize __precision = __os.precision();
2095       const _CharT __space = __os.widen(' ');
2096       __os.flags(__ios_base::scientific | __ios_base::left);
2097       __os.fill(__space);
2098       __os.precision(std::numeric_limits<_RealType>::max_digits10);
2099
2100       __os << __x.alpha() << __space << __x.beta()
2101            << __space << __x._M_nd;
2102
2103       __os.flags(__flags);
2104       __os.fill(__fill);
2105       __os.precision(__precision);
2106       return __os;
2107     }
2108
2109   template<typename _RealType, typename _CharT, typename _Traits>
2110     std::basic_istream<_CharT, _Traits>&
2111     operator>>(std::basic_istream<_CharT, _Traits>& __is,
2112                gamma_distribution<_RealType>& __x)
2113     {
2114       typedef std::basic_istream<_CharT, _Traits>  __istream_type;
2115       typedef typename __istream_type::ios_base    __ios_base;
2116
2117       const typename __ios_base::fmtflags __flags = __is.flags();
2118       __is.flags(__ios_base::dec | __ios_base::skipws);
2119
2120       _RealType __alpha_val, __beta_val;
2121       __is >> __alpha_val >> __beta_val >> __x._M_nd;
2122       __x.param(typename gamma_distribution<_RealType>::
2123                 param_type(__alpha_val, __beta_val));
2124
2125       __is.flags(__flags);
2126       return __is;
2127     }
2128
2129
2130   template<typename _RealType>
2131     template<typename _UniformRandomNumberGenerator>
2132       typename weibull_distribution<_RealType>::result_type
2133       weibull_distribution<_RealType>::
2134       operator()(_UniformRandomNumberGenerator& __urng,
2135                  const param_type& __p)
2136       {
2137         __detail::_Adaptor<_UniformRandomNumberGenerator, result_type>
2138           __aurng(__urng);
2139         return __p.b() * std::pow(-std::log(__aurng()),
2140                                   result_type(1) / __p.a());
2141       }
2142
2143   template<typename _RealType, typename _CharT, typename _Traits>
2144     std::basic_ostream<_CharT, _Traits>&
2145     operator<<(std::basic_ostream<_CharT, _Traits>& __os,
2146                const weibull_distribution<_RealType>& __x)
2147     {
2148       typedef std::basic_ostream<_CharT, _Traits>  __ostream_type;
2149       typedef typename __ostream_type::ios_base    __ios_base;
2150
2151       const typename __ios_base::fmtflags __flags = __os.flags();
2152       const _CharT __fill = __os.fill();
2153       const std::streamsize __precision = __os.precision();
2154       const _CharT __space = __os.widen(' ');
2155       __os.flags(__ios_base::scientific | __ios_base::left);
2156       __os.fill(__space);
2157       __os.precision(std::numeric_limits<_RealType>::max_digits10);
2158
2159       __os << __x.a() << __space << __x.b();
2160
2161       __os.flags(__flags);
2162       __os.fill(__fill);
2163       __os.precision(__precision);
2164       return __os;
2165     }
2166
2167   template<typename _RealType, typename _CharT, typename _Traits>
2168     std::basic_istream<_CharT, _Traits>&
2169     operator>>(std::basic_istream<_CharT, _Traits>& __is,
2170                weibull_distribution<_RealType>& __x)
2171     {
2172       typedef std::basic_istream<_CharT, _Traits>  __istream_type;
2173       typedef typename __istream_type::ios_base    __ios_base;
2174
2175       const typename __ios_base::fmtflags __flags = __is.flags();
2176       __is.flags(__ios_base::dec | __ios_base::skipws);
2177
2178       _RealType __a, __b;
2179       __is >> __a >> __b;
2180       __x.param(typename weibull_distribution<_RealType>::
2181                 param_type(__a, __b));
2182
2183       __is.flags(__flags);
2184       return __is;
2185     }
2186
2187
2188   template<typename _RealType>
2189     template<typename _UniformRandomNumberGenerator>
2190       typename extreme_value_distribution<_RealType>::result_type
2191       extreme_value_distribution<_RealType>::
2192       operator()(_UniformRandomNumberGenerator& __urng,
2193                  const param_type& __p)
2194       {
2195         __detail::_Adaptor<_UniformRandomNumberGenerator, result_type>
2196           __aurng(__urng);
2197         return __p.a() - __p.b() * std::log(-std::log(__aurng()));
2198       }
2199
2200   template<typename _RealType, typename _CharT, typename _Traits>
2201     std::basic_ostream<_CharT, _Traits>&
2202     operator<<(std::basic_ostream<_CharT, _Traits>& __os,
2203                const extreme_value_distribution<_RealType>& __x)
2204     {
2205       typedef std::basic_ostream<_CharT, _Traits>  __ostream_type;
2206       typedef typename __ostream_type::ios_base    __ios_base;
2207
2208       const typename __ios_base::fmtflags __flags = __os.flags();
2209       const _CharT __fill = __os.fill();
2210       const std::streamsize __precision = __os.precision();
2211       const _CharT __space = __os.widen(' ');
2212       __os.flags(__ios_base::scientific | __ios_base::left);
2213       __os.fill(__space);
2214       __os.precision(std::numeric_limits<_RealType>::max_digits10);
2215
2216       __os << __x.a() << __space << __x.b();
2217
2218       __os.flags(__flags);
2219       __os.fill(__fill);
2220       __os.precision(__precision);
2221       return __os;
2222     }
2223
2224   template<typename _RealType, typename _CharT, typename _Traits>
2225     std::basic_istream<_CharT, _Traits>&
2226     operator>>(std::basic_istream<_CharT, _Traits>& __is,
2227                extreme_value_distribution<_RealType>& __x)
2228     {
2229       typedef std::basic_istream<_CharT, _Traits>  __istream_type;
2230       typedef typename __istream_type::ios_base    __ios_base;
2231
2232       const typename __ios_base::fmtflags __flags = __is.flags();
2233       __is.flags(__ios_base::dec | __ios_base::skipws);
2234
2235       _RealType __a, __b;
2236       __is >> __a >> __b;
2237       __x.param(typename extreme_value_distribution<_RealType>::
2238                 param_type(__a, __b));
2239
2240       __is.flags(__flags);
2241       return __is;
2242     }
2243
2244
2245   template<typename _IntType>
2246     void
2247     discrete_distribution<_IntType>::param_type::
2248     _M_initialize()
2249     {
2250       if (_M_prob.size() < 2)
2251         {
2252           _M_prob.clear();
2253           return;
2254         }
2255
2256       const double __sum = std::accumulate(_M_prob.begin(),
2257                                            _M_prob.end(), 0.0);
2258       // Now normalize the probabilites.
2259       __detail::__transform(_M_prob.begin(), _M_prob.end(), _M_prob.begin(),
2260                           std::bind2nd(std::divides<double>(), __sum));
2261       // Accumulate partial sums.
2262       _M_cp.reserve(_M_prob.size());
2263       std::partial_sum(_M_prob.begin(), _M_prob.end(),
2264                        std::back_inserter(_M_cp));
2265       // Make sure the last cumulative probability is one.
2266       _M_cp[_M_cp.size() - 1] = 1.0;
2267     }
2268
2269   template<typename _IntType>
2270     template<typename _Func>
2271       discrete_distribution<_IntType>::param_type::
2272       param_type(size_t __nw, double __xmin, double __xmax, _Func __fw)
2273       : _M_prob(), _M_cp()
2274       {
2275         const size_t __n = __nw == 0 ? 1 : __nw;
2276         const double __delta = (__xmax - __xmin) / __n;
2277
2278         _M_prob.reserve(__n);
2279         for (size_t __k = 0; __k < __nw; ++__k)
2280           _M_prob.push_back(__fw(__xmin + __k * __delta + 0.5 * __delta));
2281
2282         _M_initialize();
2283       }
2284
2285   template<typename _IntType>
2286     template<typename _UniformRandomNumberGenerator>
2287       typename discrete_distribution<_IntType>::result_type
2288       discrete_distribution<_IntType>::
2289       operator()(_UniformRandomNumberGenerator& __urng,
2290                  const param_type& __param)
2291       {
2292         if (__param._M_cp.empty())
2293           return result_type(0);
2294
2295         __detail::_Adaptor<_UniformRandomNumberGenerator, double>
2296           __aurng(__urng);
2297
2298         const double __p = __aurng();
2299         auto __pos = std::lower_bound(__param._M_cp.begin(),
2300                                       __param._M_cp.end(), __p);
2301
2302         return __pos - __param._M_cp.begin();
2303       }
2304
2305   template<typename _IntType, typename _CharT, typename _Traits>
2306     std::basic_ostream<_CharT, _Traits>&
2307     operator<<(std::basic_ostream<_CharT, _Traits>& __os,
2308                const discrete_distribution<_IntType>& __x)
2309     {
2310       typedef std::basic_ostream<_CharT, _Traits>  __ostream_type;
2311       typedef typename __ostream_type::ios_base    __ios_base;
2312
2313       const typename __ios_base::fmtflags __flags = __os.flags();
2314       const _CharT __fill = __os.fill();
2315       const std::streamsize __precision = __os.precision();
2316       const _CharT __space = __os.widen(' ');
2317       __os.flags(__ios_base::scientific | __ios_base::left);
2318       __os.fill(__space);
2319       __os.precision(std::numeric_limits<double>::max_digits10);
2320
2321       std::vector<double> __prob = __x.probabilities();
2322       __os << __prob.size();
2323       for (auto __dit = __prob.begin(); __dit != __prob.end(); ++__dit)
2324         __os << __space << *__dit;
2325
2326       __os.flags(__flags);
2327       __os.fill(__fill);
2328       __os.precision(__precision);
2329       return __os;
2330     }
2331
2332   template<typename _IntType, typename _CharT, typename _Traits>
2333     std::basic_istream<_CharT, _Traits>&
2334     operator>>(std::basic_istream<_CharT, _Traits>& __is,
2335                discrete_distribution<_IntType>& __x)
2336     {
2337       typedef std::basic_istream<_CharT, _Traits>  __istream_type;
2338       typedef typename __istream_type::ios_base    __ios_base;
2339
2340       const typename __ios_base::fmtflags __flags = __is.flags();
2341       __is.flags(__ios_base::dec | __ios_base::skipws);
2342
2343       size_t __n;
2344       __is >> __n;
2345
2346       std::vector<double> __prob_vec;
2347       __prob_vec.reserve(__n);
2348       for (; __n != 0; --__n)
2349         {
2350           double __prob;
2351           __is >> __prob;
2352           __prob_vec.push_back(__prob);
2353         }
2354
2355       __x.param(typename discrete_distribution<_IntType>::
2356                 param_type(__prob_vec.begin(), __prob_vec.end()));
2357
2358       __is.flags(__flags);
2359       return __is;
2360     }
2361
2362
2363   template<typename _RealType>
2364     void
2365     piecewise_constant_distribution<_RealType>::param_type::
2366     _M_initialize()
2367     {
2368       if (_M_int.size() < 2
2369           || (_M_int.size() == 2
2370               && _M_int[0] == _RealType(0)
2371               && _M_int[1] == _RealType(1)))
2372         {
2373           _M_int.clear();
2374           _M_den.clear();
2375           return;
2376         }
2377
2378       const double __sum = std::accumulate(_M_den.begin(),
2379                                            _M_den.end(), 0.0);
2380
2381       __detail::__transform(_M_den.begin(), _M_den.end(), _M_den.begin(),
2382                             std::bind2nd(std::divides<double>(), __sum));
2383
2384       _M_cp.reserve(_M_den.size());
2385       std::partial_sum(_M_den.begin(), _M_den.end(),
2386                        std::back_inserter(_M_cp));
2387
2388       // Make sure the last cumulative probability is one.
2389       _M_cp[_M_cp.size() - 1] = 1.0;
2390
2391       for (size_t __k = 0; __k < _M_den.size(); ++__k)
2392         _M_den[__k] /= _M_int[__k + 1] - _M_int[__k];
2393     }
2394
2395   template<typename _RealType>
2396     template<typename _InputIteratorB, typename _InputIteratorW>
2397       piecewise_constant_distribution<_RealType>::param_type::
2398       param_type(_InputIteratorB __bbegin,
2399                  _InputIteratorB __bend,
2400                  _InputIteratorW __wbegin)
2401       : _M_int(), _M_den(), _M_cp()
2402       {
2403         if (__bbegin != __bend)
2404           {
2405             for (;;)
2406               {
2407                 _M_int.push_back(*__bbegin);
2408                 ++__bbegin;
2409                 if (__bbegin == __bend)
2410                   break;
2411
2412                 _M_den.push_back(*__wbegin);
2413                 ++__wbegin;
2414               }
2415           }
2416
2417         _M_initialize();
2418       }
2419
2420   template<typename _RealType>
2421     template<typename _Func>
2422       piecewise_constant_distribution<_RealType>::param_type::
2423       param_type(initializer_list<_RealType> __bl, _Func __fw)
2424       : _M_int(), _M_den(), _M_cp()
2425       {
2426         _M_int.reserve(__bl.size());
2427         for (auto __biter = __bl.begin(); __biter != __bl.end(); ++__biter)
2428           _M_int.push_back(*__biter);
2429
2430         _M_den.reserve(_M_int.size() - 1);
2431         for (size_t __k = 0; __k < _M_int.size() - 1; ++__k)
2432           _M_den.push_back(__fw(0.5 * (_M_int[__k + 1] + _M_int[__k])));
2433
2434         _M_initialize();
2435       }
2436
2437   template<typename _RealType>
2438     template<typename _Func>
2439       piecewise_constant_distribution<_RealType>::param_type::
2440       param_type(size_t __nw, _RealType __xmin, _RealType __xmax, _Func __fw)
2441       : _M_int(), _M_den(), _M_cp()
2442       {
2443         const size_t __n = __nw == 0 ? 1 : __nw;
2444         const _RealType __delta = (__xmax - __xmin) / __n;
2445
2446         _M_int.reserve(__n + 1);
2447         for (size_t __k = 0; __k <= __nw; ++__k)
2448           _M_int.push_back(__xmin + __k * __delta);
2449
2450         _M_den.reserve(__n);
2451         for (size_t __k = 0; __k < __nw; ++__k)
2452           _M_den.push_back(__fw(_M_int[__k] + 0.5 * __delta));
2453
2454         _M_initialize();
2455       }
2456
2457   template<typename _RealType>
2458     template<typename _UniformRandomNumberGenerator>
2459       typename piecewise_constant_distribution<_RealType>::result_type
2460       piecewise_constant_distribution<_RealType>::
2461       operator()(_UniformRandomNumberGenerator& __urng,
2462                  const param_type& __param)
2463       {
2464         __detail::_Adaptor<_UniformRandomNumberGenerator, double>
2465           __aurng(__urng);
2466
2467         const double __p = __aurng();
2468         if (__param._M_cp.empty())
2469           return __p;
2470
2471         auto __pos = std::lower_bound(__param._M_cp.begin(),
2472                                       __param._M_cp.end(), __p);
2473         const size_t __i = __pos - __param._M_cp.begin();
2474
2475         const double __pref = __i > 0 ? __param._M_cp[__i - 1] : 0.0;
2476
2477         return __param._M_int[__i] + (__p - __pref) / __param._M_den[__i];
2478       }
2479
2480   template<typename _RealType, typename _CharT, typename _Traits>
2481     std::basic_ostream<_CharT, _Traits>&
2482     operator<<(std::basic_ostream<_CharT, _Traits>& __os,
2483                const piecewise_constant_distribution<_RealType>& __x)
2484     {
2485       typedef std::basic_ostream<_CharT, _Traits>  __ostream_type;
2486       typedef typename __ostream_type::ios_base    __ios_base;
2487
2488       const typename __ios_base::fmtflags __flags = __os.flags();
2489       const _CharT __fill = __os.fill();
2490       const std::streamsize __precision = __os.precision();
2491       const _CharT __space = __os.widen(' ');
2492       __os.flags(__ios_base::scientific | __ios_base::left);
2493       __os.fill(__space);
2494       __os.precision(std::numeric_limits<_RealType>::max_digits10);
2495
2496       std::vector<_RealType> __int = __x.intervals();
2497       __os << __int.size() - 1;
2498
2499       for (auto __xit = __int.begin(); __xit != __int.end(); ++__xit)
2500         __os << __space << *__xit;
2501
2502       std::vector<double> __den = __x.densities();
2503       for (auto __dit = __den.begin(); __dit != __den.end(); ++__dit)
2504         __os << __space << *__dit;
2505
2506       __os.flags(__flags);
2507       __os.fill(__fill);
2508       __os.precision(__precision);
2509       return __os;
2510     }
2511
2512   template<typename _RealType, typename _CharT, typename _Traits>
2513     std::basic_istream<_CharT, _Traits>&
2514     operator>>(std::basic_istream<_CharT, _Traits>& __is,
2515                piecewise_constant_distribution<_RealType>& __x)
2516     {
2517       typedef std::basic_istream<_CharT, _Traits>  __istream_type;
2518       typedef typename __istream_type::ios_base    __ios_base;
2519
2520       const typename __ios_base::fmtflags __flags = __is.flags();
2521       __is.flags(__ios_base::dec | __ios_base::skipws);
2522
2523       size_t __n;
2524       __is >> __n;
2525
2526       std::vector<_RealType> __int_vec;
2527       __int_vec.reserve(__n + 1);
2528       for (size_t __i = 0; __i <= __n; ++__i)
2529         {
2530           _RealType __int;
2531           __is >> __int;
2532           __int_vec.push_back(__int);
2533         }
2534
2535       std::vector<double> __den_vec;
2536       __den_vec.reserve(__n);
2537       for (size_t __i = 0; __i < __n; ++__i)
2538         {
2539           double __den;
2540           __is >> __den;
2541           __den_vec.push_back(__den);
2542         }
2543
2544       __x.param(typename piecewise_constant_distribution<_RealType>::
2545           param_type(__int_vec.begin(), __int_vec.end(), __den_vec.begin()));
2546
2547       __is.flags(__flags);
2548       return __is;
2549     }
2550
2551
2552   template<typename _RealType>
2553     void
2554     piecewise_linear_distribution<_RealType>::param_type::
2555     _M_initialize()
2556     {
2557       if (_M_int.size() < 2
2558           || (_M_int.size() == 2
2559               && _M_int[0] == _RealType(0)
2560               && _M_int[1] == _RealType(1)
2561               && _M_den[0] == _M_den[1]))
2562         {
2563           _M_int.clear();
2564           _M_den.clear();
2565           return;
2566         }
2567
2568       double __sum = 0.0;
2569       _M_cp.reserve(_M_int.size() - 1);
2570       _M_m.reserve(_M_int.size() - 1);
2571       for (size_t __k = 0; __k < _M_int.size() - 1; ++__k)
2572         {
2573           const _RealType __delta = _M_int[__k + 1] - _M_int[__k];
2574           __sum += 0.5 * (_M_den[__k + 1] + _M_den[__k]) * __delta;
2575           _M_cp.push_back(__sum);
2576           _M_m.push_back((_M_den[__k + 1] - _M_den[__k]) / __delta);
2577         }
2578
2579       //  Now normalize the densities...
2580       __detail::__transform(_M_den.begin(), _M_den.end(), _M_den.begin(),
2581                           std::bind2nd(std::divides<double>(), __sum));
2582       //  ... and partial sums... 
2583       __detail::__transform(_M_cp.begin(), _M_cp.end(), _M_cp.begin(),
2584                             std::bind2nd(std::divides<double>(), __sum));
2585       //  ... and slopes.
2586       __detail::__transform(_M_m.begin(), _M_m.end(), _M_m.begin(),
2587                             std::bind2nd(std::divides<double>(), __sum));
2588       //  Make sure the last cumulative probablility is one.
2589       _M_cp[_M_cp.size() - 1] = 1.0;
2590      }
2591
2592   template<typename _RealType>
2593     template<typename _InputIteratorB, typename _InputIteratorW>
2594       piecewise_linear_distribution<_RealType>::param_type::
2595       param_type(_InputIteratorB __bbegin,
2596                  _InputIteratorB __bend,
2597                  _InputIteratorW __wbegin)
2598       : _M_int(), _M_den(), _M_cp(), _M_m()
2599       {
2600         for (; __bbegin != __bend; ++__bbegin, ++__wbegin)
2601           {
2602             _M_int.push_back(*__bbegin);
2603             _M_den.push_back(*__wbegin);
2604           }
2605
2606         _M_initialize();
2607       }
2608
2609   template<typename _RealType>
2610     template<typename _Func>
2611       piecewise_linear_distribution<_RealType>::param_type::
2612       param_type(initializer_list<_RealType> __bl, _Func __fw)
2613       : _M_int(), _M_den(), _M_cp(), _M_m()
2614       {
2615         _M_int.reserve(__bl.size());
2616         _M_den.reserve(__bl.size());
2617         for (auto __biter = __bl.begin(); __biter != __bl.end(); ++__biter)
2618           {
2619             _M_int.push_back(*__biter);
2620             _M_den.push_back(__fw(*__biter));
2621           }
2622
2623         _M_initialize();
2624       }
2625
2626   template<typename _RealType>
2627     template<typename _Func>
2628       piecewise_linear_distribution<_RealType>::param_type::
2629       param_type(size_t __nw, _RealType __xmin, _RealType __xmax, _Func __fw)
2630       : _M_int(), _M_den(), _M_cp(), _M_m()
2631       {
2632         const size_t __n = __nw == 0 ? 1 : __nw;
2633         const _RealType __delta = (__xmax - __xmin) / __n;
2634
2635         _M_int.reserve(__n + 1);
2636         _M_den.reserve(__n + 1);
2637         for (size_t __k = 0; __k <= __nw; ++__k)
2638           {
2639             _M_int.push_back(__xmin + __k * __delta);
2640             _M_den.push_back(__fw(_M_int[__k] + __delta));
2641           }
2642
2643         _M_initialize();
2644       }
2645
2646   template<typename _RealType>
2647     template<typename _UniformRandomNumberGenerator>
2648       typename piecewise_linear_distribution<_RealType>::result_type
2649       piecewise_linear_distribution<_RealType>::
2650       operator()(_UniformRandomNumberGenerator& __urng,
2651                  const param_type& __param)
2652       {
2653         __detail::_Adaptor<_UniformRandomNumberGenerator, double>
2654           __aurng(__urng);
2655
2656         const double __p = __aurng();
2657         if (__param._M_cp.empty())
2658           return __p;
2659
2660         auto __pos = std::lower_bound(__param._M_cp.begin(),
2661                                       __param._M_cp.end(), __p);
2662         const size_t __i = __pos - __param._M_cp.begin();
2663
2664         const double __pref = __i > 0 ? __param._M_cp[__i - 1] : 0.0;
2665
2666         const double __a = 0.5 * __param._M_m[__i];
2667         const double __b = __param._M_den[__i];
2668         const double __cm = __p - __pref;
2669
2670         _RealType __x = __param._M_int[__i];
2671         if (__a == 0)
2672           __x += __cm / __b;
2673         else
2674           {
2675             const double __d = __b * __b + 4.0 * __a * __cm;
2676             __x += 0.5 * (std::sqrt(__d) - __b) / __a;
2677           }
2678
2679         return __x;
2680       }
2681
2682   template<typename _RealType, typename _CharT, typename _Traits>
2683     std::basic_ostream<_CharT, _Traits>&
2684     operator<<(std::basic_ostream<_CharT, _Traits>& __os,
2685                const piecewise_linear_distribution<_RealType>& __x)
2686     {
2687       typedef std::basic_ostream<_CharT, _Traits>  __ostream_type;
2688       typedef typename __ostream_type::ios_base    __ios_base;
2689
2690       const typename __ios_base::fmtflags __flags = __os.flags();
2691       const _CharT __fill = __os.fill();
2692       const std::streamsize __precision = __os.precision();
2693       const _CharT __space = __os.widen(' ');
2694       __os.flags(__ios_base::scientific | __ios_base::left);
2695       __os.fill(__space);
2696       __os.precision(std::numeric_limits<_RealType>::max_digits10);
2697
2698       std::vector<_RealType> __int = __x.intervals();
2699       __os << __int.size() - 1;
2700
2701       for (auto __xit = __int.begin(); __xit != __int.end(); ++__xit)
2702         __os << __space << *__xit;
2703
2704       std::vector<double> __den = __x.densities();
2705       for (auto __dit = __den.begin(); __dit != __den.end(); ++__dit)
2706         __os << __space << *__dit;
2707
2708       __os.flags(__flags);
2709       __os.fill(__fill);
2710       __os.precision(__precision);
2711       return __os;
2712     }
2713
2714   template<typename _RealType, typename _CharT, typename _Traits>
2715     std::basic_istream<_CharT, _Traits>&
2716     operator>>(std::basic_istream<_CharT, _Traits>& __is,
2717                piecewise_linear_distribution<_RealType>& __x)
2718     {
2719       typedef std::basic_istream<_CharT, _Traits>  __istream_type;
2720       typedef typename __istream_type::ios_base    __ios_base;
2721
2722       const typename __ios_base::fmtflags __flags = __is.flags();
2723       __is.flags(__ios_base::dec | __ios_base::skipws);
2724
2725       size_t __n;
2726       __is >> __n;
2727
2728       std::vector<_RealType> __int_vec;
2729       __int_vec.reserve(__n + 1);
2730       for (size_t __i = 0; __i <= __n; ++__i)
2731         {
2732           _RealType __int;
2733           __is >> __int;
2734           __int_vec.push_back(__int);
2735         }
2736
2737       std::vector<double> __den_vec;
2738       __den_vec.reserve(__n + 1);
2739       for (size_t __i = 0; __i <= __n; ++__i)
2740         {
2741           double __den;
2742           __is >> __den;
2743           __den_vec.push_back(__den);
2744         }
2745
2746       __x.param(typename piecewise_linear_distribution<_RealType>::
2747           param_type(__int_vec.begin(), __int_vec.end(), __den_vec.begin()));
2748
2749       __is.flags(__flags);
2750       return __is;
2751     }
2752
2753
2754   template<typename _IntType>
2755     seed_seq::seed_seq(std::initializer_list<_IntType> __il)
2756     {
2757       for (auto __iter = __il.begin(); __iter != __il.end(); ++__iter)
2758         _M_v.push_back(__detail::__mod<result_type,
2759                        __detail::_Shift<result_type, 32>::__value>(*__iter));
2760     }
2761
2762   template<typename _InputIterator>
2763     seed_seq::seed_seq(_InputIterator __begin, _InputIterator __end)
2764     {
2765       for (_InputIterator __iter = __begin; __iter != __end; ++__iter)
2766         _M_v.push_back(__detail::__mod<result_type,
2767                        __detail::_Shift<result_type, 32>::__value>(*__iter));
2768     }
2769
2770   template<typename _RandomAccessIterator>
2771     void
2772     seed_seq::generate(_RandomAccessIterator __begin,
2773                        _RandomAccessIterator __end)
2774     {
2775       typedef typename iterator_traits<_RandomAccessIterator>::value_type
2776         _Type;
2777
2778       if (__begin == __end)
2779         return;
2780
2781       std::fill(__begin, __end, _Type(0x8b8b8b8bu));
2782
2783       const size_t __n = __end - __begin;
2784       const size_t __s = _M_v.size();
2785       const size_t __t = (__n >= 623) ? 11
2786                        : (__n >=  68) ? 7
2787                        : (__n >=  39) ? 5
2788                        : (__n >=   7) ? 3
2789                        : (__n - 1) / 2;
2790       const size_t __p = (__n - __t) / 2;
2791       const size_t __q = __p + __t;
2792       const size_t __m = std::max(size_t(__s + 1), __n);
2793
2794       for (size_t __k = 0; __k < __m; ++__k)
2795         {
2796           _Type __arg = (__begin[__k % __n]
2797                          ^ __begin[(__k + __p) % __n]
2798                          ^ __begin[(__k - 1) % __n]);
2799           _Type __r1 = __arg ^ (__arg >> 27);
2800           __r1 = __detail::__mod<_Type,
2801                     __detail::_Shift<_Type, 32>::__value>(1664525u * __r1);
2802           _Type __r2 = __r1;
2803           if (__k == 0)
2804             __r2 += __s;
2805           else if (__k <= __s)
2806             __r2 += __k % __n + _M_v[__k - 1];
2807           else
2808             __r2 += __k % __n;
2809           __r2 = __detail::__mod<_Type,
2810                    __detail::_Shift<_Type, 32>::__value>(__r2);
2811           __begin[(__k + __p) % __n] += __r1;
2812           __begin[(__k + __q) % __n] += __r2;
2813           __begin[__k % __n] = __r2;
2814         }
2815
2816       for (size_t __k = __m; __k < __m + __n; ++__k)
2817         {
2818           _Type __arg = (__begin[__k % __n]
2819                          + __begin[(__k + __p) % __n]
2820                          + __begin[(__k - 1) % __n]);
2821           _Type __r3 = __arg ^ (__arg >> 27);
2822           __r3 = __detail::__mod<_Type,
2823                    __detail::_Shift<_Type, 32>::__value>(1566083941u * __r3);
2824           _Type __r4 = __r3 - __k % __n;
2825           __r4 = __detail::__mod<_Type,
2826                    __detail::_Shift<_Type, 32>::__value>(__r4);
2827           __begin[(__k + __p) % __n] ^= __r3;
2828           __begin[(__k + __q) % __n] ^= __r4;
2829           __begin[__k % __n] = __r4;
2830         }
2831     }
2832
2833   template<typename _RealType, size_t __bits,
2834            typename _UniformRandomNumberGenerator>
2835     _RealType
2836     generate_canonical(_UniformRandomNumberGenerator& __urng)
2837     {
2838       const size_t __b
2839         = std::min(static_cast<size_t>(std::numeric_limits<_RealType>::digits),
2840                    __bits);
2841       const long double __r = static_cast<long double>(__urng.max())
2842                             - static_cast<long double>(__urng.min()) + 1.0L;
2843       const size_t __log2r = std::log(__r) / std::log(2.0L);
2844       size_t __k = std::max<size_t>(1UL, (__b + __log2r - 1UL) / __log2r);
2845       _RealType __sum = _RealType(0);
2846       _RealType __tmp = _RealType(1);
2847       for (; __k != 0; --__k)
2848         {
2849           __sum += _RealType(__urng() - __urng.min()) * __tmp;
2850           __tmp *= __r;
2851         }
2852       return __sum / __tmp;
2853     }
2854
2855 _GLIBCXX_END_NAMESPACE_VERSION
2856 } // namespace
2857
2858 #endif