Home | History | Annotate | Line # | Download | only in ext
      1       1.1  mrg // Random number extensions -*- C++ -*-
      2       1.1  mrg 
      3  1.1.1.11  mrg // Copyright (C) 2012-2024 Free Software Foundation, Inc.
      4       1.1  mrg //
      5       1.1  mrg // This file is part of the GNU ISO C++ Library.  This library is free
      6       1.1  mrg // software; you can redistribute it and/or modify it under the
      7       1.1  mrg // terms of the GNU General Public License as published by the
      8       1.1  mrg // Free Software Foundation; either version 3, or (at your option)
      9       1.1  mrg // any later version.
     10       1.1  mrg 
     11       1.1  mrg // This library is distributed in the hope that it will be useful,
     12       1.1  mrg // but WITHOUT ANY WARRANTY; without even the implied warranty of
     13       1.1  mrg // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     14       1.1  mrg // GNU General Public License for more details.
     15       1.1  mrg 
     16       1.1  mrg // Under Section 7 of GPL version 3, you are granted additional
     17       1.1  mrg // permissions described in the GCC Runtime Library Exception, version
     18       1.1  mrg // 3.1, as published by the Free Software Foundation.
     19       1.1  mrg 
     20       1.1  mrg // You should have received a copy of the GNU General Public License and
     21       1.1  mrg // a copy of the GCC Runtime Library Exception along with this program;
     22       1.1  mrg // see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
     23       1.1  mrg // <http://www.gnu.org/licenses/>.
     24       1.1  mrg 
     25       1.1  mrg /** @file ext/random.tcc
     26       1.1  mrg  *  This is an internal header file, included by other library headers.
     27       1.1  mrg  *  Do not attempt to use it directly. @headername{ext/random}
     28       1.1  mrg  */
     29       1.1  mrg 
     30       1.1  mrg #ifndef _EXT_RANDOM_TCC
     31       1.1  mrg #define _EXT_RANDOM_TCC 1
     32       1.1  mrg 
     33       1.1  mrg #pragma GCC system_header
     34       1.1  mrg 
     35  1.1.1.11  mrg #include <bits/requires_hosted.h> // GNU extensions are currently omitted
     36  1.1.1.11  mrg 
     37       1.1  mrg namespace __gnu_cxx _GLIBCXX_VISIBILITY(default)
     38       1.1  mrg {
     39       1.1  mrg _GLIBCXX_BEGIN_NAMESPACE_VERSION
     40       1.1  mrg 
     41       1.1  mrg #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
     42       1.1  mrg 
     43       1.1  mrg   template<typename _UIntType, size_t __m,
     44       1.1  mrg 	   size_t __pos1, size_t __sl1, size_t __sl2,
     45       1.1  mrg 	   size_t __sr1, size_t __sr2,
     46       1.1  mrg 	   uint32_t __msk1, uint32_t __msk2,
     47       1.1  mrg 	   uint32_t __msk3, uint32_t __msk4,
     48       1.1  mrg 	   uint32_t __parity1, uint32_t __parity2,
     49       1.1  mrg 	   uint32_t __parity3, uint32_t __parity4>
     50       1.1  mrg     void simd_fast_mersenne_twister_engine<_UIntType, __m,
     51       1.1  mrg 					   __pos1, __sl1, __sl2, __sr1, __sr2,
     52       1.1  mrg 					   __msk1, __msk2, __msk3, __msk4,
     53       1.1  mrg 					   __parity1, __parity2, __parity3,
     54       1.1  mrg 					   __parity4>::
     55       1.1  mrg     seed(_UIntType __seed)
     56       1.1  mrg     {
     57       1.1  mrg       _M_state32[0] = static_cast<uint32_t>(__seed);
     58       1.1  mrg       for (size_t __i = 1; __i < _M_nstate32; ++__i)
     59       1.1  mrg 	_M_state32[__i] = (1812433253UL
     60       1.1  mrg 			   * (_M_state32[__i - 1] ^ (_M_state32[__i - 1] >> 30))
     61       1.1  mrg 			   + __i);
     62       1.1  mrg       _M_pos = state_size;
     63       1.1  mrg       _M_period_certification();
     64       1.1  mrg     }
     65       1.1  mrg 
     66       1.1  mrg 
     67       1.1  mrg   namespace {
     68       1.1  mrg 
     69       1.1  mrg     inline uint32_t _Func1(uint32_t __x)
     70       1.1  mrg     {
     71       1.1  mrg       return (__x ^ (__x >> 27)) * UINT32_C(1664525);
     72       1.1  mrg     }
     73       1.1  mrg 
     74       1.1  mrg     inline uint32_t _Func2(uint32_t __x)
     75       1.1  mrg     {
     76       1.1  mrg       return (__x ^ (__x >> 27)) * UINT32_C(1566083941);
     77       1.1  mrg     }
     78       1.1  mrg 
     79       1.1  mrg   }
     80       1.1  mrg 
     81       1.1  mrg 
     82       1.1  mrg   template<typename _UIntType, size_t __m,
     83       1.1  mrg 	   size_t __pos1, size_t __sl1, size_t __sl2,
     84       1.1  mrg 	   size_t __sr1, size_t __sr2,
     85       1.1  mrg 	   uint32_t __msk1, uint32_t __msk2,
     86       1.1  mrg 	   uint32_t __msk3, uint32_t __msk4,
     87       1.1  mrg 	   uint32_t __parity1, uint32_t __parity2,
     88       1.1  mrg 	   uint32_t __parity3, uint32_t __parity4>
     89       1.1  mrg     template<typename _Sseq>
     90   1.1.1.8  mrg       auto
     91       1.1  mrg       simd_fast_mersenne_twister_engine<_UIntType, __m,
     92       1.1  mrg 					__pos1, __sl1, __sl2, __sr1, __sr2,
     93       1.1  mrg 					__msk1, __msk2, __msk3, __msk4,
     94       1.1  mrg 					__parity1, __parity2, __parity3,
     95       1.1  mrg 					__parity4>::
     96       1.1  mrg       seed(_Sseq& __q)
     97   1.1.1.8  mrg       -> _If_seed_seq<_Sseq>
     98       1.1  mrg       {
     99       1.1  mrg 	size_t __lag;
    100       1.1  mrg 
    101       1.1  mrg 	if (_M_nstate32 >= 623)
    102       1.1  mrg 	  __lag = 11;
    103       1.1  mrg 	else if (_M_nstate32 >= 68)
    104       1.1  mrg 	  __lag = 7;
    105       1.1  mrg 	else if (_M_nstate32 >= 39)
    106       1.1  mrg 	  __lag = 5;
    107       1.1  mrg 	else
    108       1.1  mrg 	  __lag = 3;
    109       1.1  mrg 	const size_t __mid = (_M_nstate32 - __lag) / 2;
    110       1.1  mrg 
    111       1.1  mrg 	std::fill(_M_state32, _M_state32 + _M_nstate32, UINT32_C(0x8b8b8b8b));
    112       1.1  mrg 	uint32_t __arr[_M_nstate32];
    113       1.1  mrg 	__q.generate(__arr + 0, __arr + _M_nstate32);
    114       1.1  mrg 
    115       1.1  mrg 	uint32_t __r = _Func1(_M_state32[0] ^ _M_state32[__mid]
    116       1.1  mrg 			      ^ _M_state32[_M_nstate32  - 1]);
    117       1.1  mrg 	_M_state32[__mid] += __r;
    118       1.1  mrg 	__r += _M_nstate32;
    119       1.1  mrg 	_M_state32[__mid + __lag] += __r;
    120       1.1  mrg 	_M_state32[0] = __r;
    121       1.1  mrg 
    122       1.1  mrg 	for (size_t __i = 1, __j = 0; __j < _M_nstate32; ++__j)
    123       1.1  mrg 	  {
    124       1.1  mrg 	    __r = _Func1(_M_state32[__i]
    125       1.1  mrg 			 ^ _M_state32[(__i + __mid) % _M_nstate32]
    126       1.1  mrg 			 ^ _M_state32[(__i + _M_nstate32 - 1) % _M_nstate32]);
    127       1.1  mrg 	    _M_state32[(__i + __mid) % _M_nstate32] += __r;
    128       1.1  mrg 	    __r += __arr[__j] + __i;
    129       1.1  mrg 	    _M_state32[(__i + __mid + __lag) % _M_nstate32] += __r;
    130       1.1  mrg 	    _M_state32[__i] = __r;
    131       1.1  mrg 	    __i = (__i + 1) % _M_nstate32;
    132       1.1  mrg 	  }
    133       1.1  mrg 	for (size_t __j = 0; __j < _M_nstate32; ++__j)
    134       1.1  mrg 	  {
    135       1.1  mrg 	    const size_t __i = (__j + 1) % _M_nstate32;
    136       1.1  mrg 	    __r = _Func2(_M_state32[__i]
    137       1.1  mrg 			 + _M_state32[(__i + __mid) % _M_nstate32]
    138       1.1  mrg 			 + _M_state32[(__i + _M_nstate32 - 1) % _M_nstate32]);
    139       1.1  mrg 	    _M_state32[(__i + __mid) % _M_nstate32] ^= __r;
    140       1.1  mrg 	    __r -= __i;
    141       1.1  mrg 	    _M_state32[(__i + __mid + __lag) % _M_nstate32] ^= __r;
    142       1.1  mrg 	    _M_state32[__i] = __r;
    143       1.1  mrg 	  }
    144       1.1  mrg 
    145       1.1  mrg 	_M_pos = state_size;
    146       1.1  mrg 	_M_period_certification();
    147       1.1  mrg       }
    148       1.1  mrg 
    149       1.1  mrg 
    150       1.1  mrg   template<typename _UIntType, size_t __m,
    151       1.1  mrg 	   size_t __pos1, size_t __sl1, size_t __sl2,
    152       1.1  mrg 	   size_t __sr1, size_t __sr2,
    153       1.1  mrg 	   uint32_t __msk1, uint32_t __msk2,
    154       1.1  mrg 	   uint32_t __msk3, uint32_t __msk4,
    155       1.1  mrg 	   uint32_t __parity1, uint32_t __parity2,
    156       1.1  mrg 	   uint32_t __parity3, uint32_t __parity4>
    157       1.1  mrg     void simd_fast_mersenne_twister_engine<_UIntType, __m,
    158       1.1  mrg 					   __pos1, __sl1, __sl2, __sr1, __sr2,
    159       1.1  mrg 					   __msk1, __msk2, __msk3, __msk4,
    160       1.1  mrg 					   __parity1, __parity2, __parity3,
    161       1.1  mrg 					   __parity4>::
    162       1.1  mrg     _M_period_certification(void)
    163       1.1  mrg     {
    164       1.1  mrg       static const uint32_t __parity[4] = { __parity1, __parity2,
    165       1.1  mrg 					    __parity3, __parity4 };
    166       1.1  mrg       uint32_t __inner = 0;
    167       1.1  mrg       for (size_t __i = 0; __i < 4; ++__i)
    168       1.1  mrg 	if (__parity[__i] != 0)
    169       1.1  mrg 	  __inner ^= _M_state32[__i] & __parity[__i];
    170       1.1  mrg 
    171       1.1  mrg       if (__builtin_parity(__inner) & 1)
    172       1.1  mrg 	return;
    173       1.1  mrg       for (size_t __i = 0; __i < 4; ++__i)
    174       1.1  mrg 	if (__parity[__i] != 0)
    175       1.1  mrg 	  {
    176       1.1  mrg 	    _M_state32[__i] ^= 1 << (__builtin_ffs(__parity[__i]) - 1);
    177       1.1  mrg 	    return;
    178       1.1  mrg 	  }
    179       1.1  mrg       __builtin_unreachable();
    180       1.1  mrg     }
    181       1.1  mrg 
    182       1.1  mrg 
    183       1.1  mrg   template<typename _UIntType, size_t __m,
    184       1.1  mrg 	   size_t __pos1, size_t __sl1, size_t __sl2,
    185       1.1  mrg 	   size_t __sr1, size_t __sr2,
    186       1.1  mrg 	   uint32_t __msk1, uint32_t __msk2,
    187       1.1  mrg 	   uint32_t __msk3, uint32_t __msk4,
    188       1.1  mrg 	   uint32_t __parity1, uint32_t __parity2,
    189       1.1  mrg 	   uint32_t __parity3, uint32_t __parity4>
    190       1.1  mrg     void simd_fast_mersenne_twister_engine<_UIntType, __m,
    191       1.1  mrg 					   __pos1, __sl1, __sl2, __sr1, __sr2,
    192       1.1  mrg 					   __msk1, __msk2, __msk3, __msk4,
    193       1.1  mrg 					   __parity1, __parity2, __parity3,
    194       1.1  mrg 					   __parity4>::
    195       1.1  mrg     discard(unsigned long long __z)
    196       1.1  mrg     {
    197       1.1  mrg       while (__z > state_size - _M_pos)
    198       1.1  mrg 	{
    199       1.1  mrg 	  __z -= state_size - _M_pos;
    200       1.1  mrg 
    201       1.1  mrg 	  _M_gen_rand();
    202       1.1  mrg 	}
    203       1.1  mrg 
    204       1.1  mrg       _M_pos += __z;
    205       1.1  mrg     }
    206       1.1  mrg 
    207       1.1  mrg 
    208       1.1  mrg #ifndef  _GLIBCXX_OPT_HAVE_RANDOM_SFMT_GEN_READ
    209       1.1  mrg 
    210       1.1  mrg   namespace {
    211       1.1  mrg 
    212       1.1  mrg     template<size_t __shift>
    213       1.1  mrg       inline void __rshift(uint32_t *__out, const uint32_t *__in)
    214       1.1  mrg       {
    215       1.1  mrg 	uint64_t __th = ((static_cast<uint64_t>(__in[3]) << 32)
    216       1.1  mrg 			 | static_cast<uint64_t>(__in[2]));
    217       1.1  mrg 	uint64_t __tl = ((static_cast<uint64_t>(__in[1]) << 32)
    218       1.1  mrg 			 | static_cast<uint64_t>(__in[0]));
    219       1.1  mrg 
    220       1.1  mrg 	uint64_t __oh = __th >> (__shift * 8);
    221       1.1  mrg 	uint64_t __ol = __tl >> (__shift * 8);
    222       1.1  mrg 	__ol |= __th << (64 - __shift * 8);
    223       1.1  mrg 	__out[1] = static_cast<uint32_t>(__ol >> 32);
    224       1.1  mrg 	__out[0] = static_cast<uint32_t>(__ol);
    225       1.1  mrg 	__out[3] = static_cast<uint32_t>(__oh >> 32);
    226       1.1  mrg 	__out[2] = static_cast<uint32_t>(__oh);
    227       1.1  mrg       }
    228       1.1  mrg 
    229       1.1  mrg 
    230       1.1  mrg     template<size_t __shift>
    231       1.1  mrg       inline void __lshift(uint32_t *__out, const uint32_t *__in)
    232       1.1  mrg       {
    233       1.1  mrg 	uint64_t __th = ((static_cast<uint64_t>(__in[3]) << 32)
    234       1.1  mrg 			 | static_cast<uint64_t>(__in[2]));
    235       1.1  mrg 	uint64_t __tl = ((static_cast<uint64_t>(__in[1]) << 32)
    236       1.1  mrg 			 | static_cast<uint64_t>(__in[0]));
    237       1.1  mrg 
    238       1.1  mrg 	uint64_t __oh = __th << (__shift * 8);
    239       1.1  mrg 	uint64_t __ol = __tl << (__shift * 8);
    240       1.1  mrg 	__oh |= __tl >> (64 - __shift * 8);
    241       1.1  mrg 	__out[1] = static_cast<uint32_t>(__ol >> 32);
    242       1.1  mrg 	__out[0] = static_cast<uint32_t>(__ol);
    243       1.1  mrg 	__out[3] = static_cast<uint32_t>(__oh >> 32);
    244       1.1  mrg 	__out[2] = static_cast<uint32_t>(__oh);
    245       1.1  mrg       }
    246       1.1  mrg 
    247       1.1  mrg 
    248       1.1  mrg     template<size_t __sl1, size_t __sl2, size_t __sr1, size_t __sr2,
    249       1.1  mrg 	     uint32_t __msk1, uint32_t __msk2, uint32_t __msk3, uint32_t __msk4>
    250       1.1  mrg       inline void __recursion(uint32_t *__r,
    251       1.1  mrg 			      const uint32_t *__a, const uint32_t *__b,
    252       1.1  mrg 			      const uint32_t *__c, const uint32_t *__d)
    253       1.1  mrg       {
    254       1.1  mrg 	uint32_t __x[4];
    255       1.1  mrg 	uint32_t __y[4];
    256       1.1  mrg 
    257       1.1  mrg 	__lshift<__sl2>(__x, __a);
    258       1.1  mrg 	__rshift<__sr2>(__y, __c);
    259       1.1  mrg 	__r[0] = (__a[0] ^ __x[0] ^ ((__b[0] >> __sr1) & __msk1)
    260       1.1  mrg 		  ^ __y[0] ^ (__d[0] << __sl1));
    261       1.1  mrg 	__r[1] = (__a[1] ^ __x[1] ^ ((__b[1] >> __sr1) & __msk2)
    262       1.1  mrg 		  ^ __y[1] ^ (__d[1] << __sl1));
    263       1.1  mrg 	__r[2] = (__a[2] ^ __x[2] ^ ((__b[2] >> __sr1) & __msk3)
    264       1.1  mrg 		  ^ __y[2] ^ (__d[2] << __sl1));
    265       1.1  mrg 	__r[3] = (__a[3] ^ __x[3] ^ ((__b[3] >> __sr1) & __msk4)
    266       1.1  mrg 		  ^ __y[3] ^ (__d[3] << __sl1));
    267       1.1  mrg       }
    268       1.1  mrg 
    269       1.1  mrg   }
    270       1.1  mrg 
    271       1.1  mrg 
    272       1.1  mrg   template<typename _UIntType, size_t __m,
    273       1.1  mrg 	   size_t __pos1, size_t __sl1, size_t __sl2,
    274       1.1  mrg 	   size_t __sr1, size_t __sr2,
    275       1.1  mrg 	   uint32_t __msk1, uint32_t __msk2,
    276       1.1  mrg 	   uint32_t __msk3, uint32_t __msk4,
    277       1.1  mrg 	   uint32_t __parity1, uint32_t __parity2,
    278       1.1  mrg 	   uint32_t __parity3, uint32_t __parity4>
    279       1.1  mrg     void simd_fast_mersenne_twister_engine<_UIntType, __m,
    280       1.1  mrg 					   __pos1, __sl1, __sl2, __sr1, __sr2,
    281       1.1  mrg 					   __msk1, __msk2, __msk3, __msk4,
    282       1.1  mrg 					   __parity1, __parity2, __parity3,
    283       1.1  mrg 					   __parity4>::
    284       1.1  mrg     _M_gen_rand(void)
    285       1.1  mrg     {
    286       1.1  mrg       const uint32_t *__r1 = &_M_state32[_M_nstate32 - 8];
    287       1.1  mrg       const uint32_t *__r2 = &_M_state32[_M_nstate32 - 4];
    288       1.1  mrg       static constexpr size_t __pos1_32 = __pos1 * 4;
    289       1.1  mrg 
    290       1.1  mrg       size_t __i;
    291       1.1  mrg       for (__i = 0; __i < _M_nstate32 - __pos1_32; __i += 4)
    292       1.1  mrg 	{
    293       1.1  mrg 	  __recursion<__sl1, __sl2, __sr1, __sr2,
    294       1.1  mrg 		      __msk1, __msk2, __msk3, __msk4>
    295       1.1  mrg 	    (&_M_state32[__i], &_M_state32[__i],
    296       1.1  mrg 	     &_M_state32[__i + __pos1_32], __r1, __r2);
    297       1.1  mrg 	  __r1 = __r2;
    298       1.1  mrg 	  __r2 = &_M_state32[__i];
    299       1.1  mrg 	}
    300       1.1  mrg 
    301       1.1  mrg       for (; __i < _M_nstate32; __i += 4)
    302       1.1  mrg 	{
    303       1.1  mrg 	  __recursion<__sl1, __sl2, __sr1, __sr2,
    304       1.1  mrg 		      __msk1, __msk2, __msk3, __msk4>
    305       1.1  mrg 	    (&_M_state32[__i], &_M_state32[__i],
    306       1.1  mrg 	     &_M_state32[__i + __pos1_32 - _M_nstate32], __r1, __r2);
    307       1.1  mrg 	  __r1 = __r2;
    308       1.1  mrg 	  __r2 = &_M_state32[__i];
    309       1.1  mrg 	}
    310       1.1  mrg 
    311       1.1  mrg       _M_pos = 0;
    312       1.1  mrg     }
    313       1.1  mrg 
    314       1.1  mrg #endif
    315       1.1  mrg 
    316       1.1  mrg #ifndef _GLIBCXX_OPT_HAVE_RANDOM_SFMT_OPERATOREQUAL
    317       1.1  mrg   template<typename _UIntType, size_t __m,
    318       1.1  mrg 	   size_t __pos1, size_t __sl1, size_t __sl2,
    319       1.1  mrg 	   size_t __sr1, size_t __sr2,
    320       1.1  mrg 	   uint32_t __msk1, uint32_t __msk2,
    321       1.1  mrg 	   uint32_t __msk3, uint32_t __msk4,
    322       1.1  mrg 	   uint32_t __parity1, uint32_t __parity2,
    323       1.1  mrg 	   uint32_t __parity3, uint32_t __parity4>
    324       1.1  mrg     bool
    325       1.1  mrg     operator==(const __gnu_cxx::simd_fast_mersenne_twister_engine<_UIntType,
    326       1.1  mrg 	       __m, __pos1, __sl1, __sl2, __sr1, __sr2,
    327       1.1  mrg 	       __msk1, __msk2, __msk3, __msk4,
    328       1.1  mrg 	       __parity1, __parity2, __parity3, __parity4>& __lhs,
    329       1.1  mrg 	       const __gnu_cxx::simd_fast_mersenne_twister_engine<_UIntType,
    330       1.1  mrg 	       __m, __pos1, __sl1, __sl2, __sr1, __sr2,
    331       1.1  mrg 	       __msk1, __msk2, __msk3, __msk4,
    332       1.1  mrg 	       __parity1, __parity2, __parity3, __parity4>& __rhs)
    333       1.1  mrg     {
    334       1.1  mrg       typedef __gnu_cxx::simd_fast_mersenne_twister_engine<_UIntType,
    335       1.1  mrg 	       __m, __pos1, __sl1, __sl2, __sr1, __sr2,
    336       1.1  mrg 	       __msk1, __msk2, __msk3, __msk4,
    337       1.1  mrg 	       __parity1, __parity2, __parity3, __parity4> __engine;
    338       1.1  mrg       return (std::equal(__lhs._M_stateT,
    339       1.1  mrg 			 __lhs._M_stateT + __engine::state_size,
    340       1.1  mrg 			 __rhs._M_stateT)
    341       1.1  mrg 	      && __lhs._M_pos == __rhs._M_pos);
    342       1.1  mrg     }
    343       1.1  mrg #endif
    344       1.1  mrg 
    345       1.1  mrg   template<typename _UIntType, size_t __m,
    346       1.1  mrg 	   size_t __pos1, size_t __sl1, size_t __sl2,
    347       1.1  mrg 	   size_t __sr1, size_t __sr2,
    348       1.1  mrg 	   uint32_t __msk1, uint32_t __msk2,
    349       1.1  mrg 	   uint32_t __msk3, uint32_t __msk4,
    350       1.1  mrg 	   uint32_t __parity1, uint32_t __parity2,
    351       1.1  mrg 	   uint32_t __parity3, uint32_t __parity4,
    352       1.1  mrg 	   typename _CharT, typename _Traits>
    353       1.1  mrg     std::basic_ostream<_CharT, _Traits>&
    354       1.1  mrg     operator<<(std::basic_ostream<_CharT, _Traits>& __os,
    355       1.1  mrg 	       const __gnu_cxx::simd_fast_mersenne_twister_engine<_UIntType,
    356       1.1  mrg 	       __m, __pos1, __sl1, __sl2, __sr1, __sr2,
    357       1.1  mrg 	       __msk1, __msk2, __msk3, __msk4,
    358       1.1  mrg 	       __parity1, __parity2, __parity3, __parity4>& __x)
    359       1.1  mrg     {
    360       1.1  mrg       typedef std::basic_ostream<_CharT, _Traits> __ostream_type;
    361       1.1  mrg       typedef typename __ostream_type::ios_base __ios_base;
    362       1.1  mrg 
    363       1.1  mrg       const typename __ios_base::fmtflags __flags = __os.flags();
    364       1.1  mrg       const _CharT __fill = __os.fill();
    365       1.1  mrg       const _CharT __space = __os.widen(' ');
    366       1.1  mrg       __os.flags(__ios_base::dec | __ios_base::fixed | __ios_base::left);
    367       1.1  mrg       __os.fill(__space);
    368       1.1  mrg 
    369       1.1  mrg       for (size_t __i = 0; __i < __x._M_nstate32; ++__i)
    370       1.1  mrg 	__os << __x._M_state32[__i] << __space;
    371       1.1  mrg       __os << __x._M_pos;
    372       1.1  mrg 
    373       1.1  mrg       __os.flags(__flags);
    374       1.1  mrg       __os.fill(__fill);
    375       1.1  mrg       return __os;
    376       1.1  mrg     }
    377       1.1  mrg 
    378       1.1  mrg 
    379       1.1  mrg   template<typename _UIntType, size_t __m,
    380       1.1  mrg 	   size_t __pos1, size_t __sl1, size_t __sl2,
    381       1.1  mrg 	   size_t __sr1, size_t __sr2,
    382       1.1  mrg 	   uint32_t __msk1, uint32_t __msk2,
    383       1.1  mrg 	   uint32_t __msk3, uint32_t __msk4,
    384       1.1  mrg 	   uint32_t __parity1, uint32_t __parity2,
    385       1.1  mrg 	   uint32_t __parity3, uint32_t __parity4,
    386       1.1  mrg 	   typename _CharT, typename _Traits>
    387       1.1  mrg     std::basic_istream<_CharT, _Traits>&
    388       1.1  mrg     operator>>(std::basic_istream<_CharT, _Traits>& __is,
    389       1.1  mrg 	       __gnu_cxx::simd_fast_mersenne_twister_engine<_UIntType,
    390       1.1  mrg 	       __m, __pos1, __sl1, __sl2, __sr1, __sr2,
    391       1.1  mrg 	       __msk1, __msk2, __msk3, __msk4,
    392       1.1  mrg 	       __parity1, __parity2, __parity3, __parity4>& __x)
    393       1.1  mrg     {
    394       1.1  mrg       typedef std::basic_istream<_CharT, _Traits> __istream_type;
    395       1.1  mrg       typedef typename __istream_type::ios_base __ios_base;
    396       1.1  mrg 
    397       1.1  mrg       const typename __ios_base::fmtflags __flags = __is.flags();
    398       1.1  mrg       __is.flags(__ios_base::dec | __ios_base::skipws);
    399       1.1  mrg 
    400       1.1  mrg       for (size_t __i = 0; __i < __x._M_nstate32; ++__i)
    401       1.1  mrg 	__is >> __x._M_state32[__i];
    402       1.1  mrg       __is >> __x._M_pos;
    403       1.1  mrg 
    404       1.1  mrg       __is.flags(__flags);
    405       1.1  mrg       return __is;
    406       1.1  mrg     }
    407       1.1  mrg 
    408       1.1  mrg #endif // __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
    409       1.1  mrg 
    410       1.1  mrg   /**
    411       1.1  mrg    * Iteration method due to M.D. J<o:>hnk.
    412       1.1  mrg    *
    413       1.1  mrg    * M.D. J<o:>hnk, Erzeugung von betaverteilten und gammaverteilten
    414       1.1  mrg    * Zufallszahlen, Metrika, Volume 8, 1964
    415       1.1  mrg    */
    416       1.1  mrg   template<typename _RealType>
    417       1.1  mrg     template<typename _UniformRandomNumberGenerator>
    418       1.1  mrg       typename beta_distribution<_RealType>::result_type
    419       1.1  mrg       beta_distribution<_RealType>::
    420       1.1  mrg       operator()(_UniformRandomNumberGenerator& __urng,
    421       1.1  mrg 		 const param_type& __param)
    422       1.1  mrg       {
    423       1.1  mrg 	std::__detail::_Adaptor<_UniformRandomNumberGenerator, result_type>
    424       1.1  mrg 	  __aurng(__urng);
    425       1.1  mrg 
    426       1.1  mrg 	result_type __x, __y;
    427       1.1  mrg 	do
    428       1.1  mrg 	  {
    429       1.1  mrg 	    __x = std::exp(std::log(__aurng()) / __param.alpha());
    430       1.1  mrg 	    __y = std::exp(std::log(__aurng()) / __param.beta());
    431       1.1  mrg 	  }
    432       1.1  mrg 	while (__x + __y > result_type(1));
    433       1.1  mrg 
    434       1.1  mrg 	return __x / (__x + __y);
    435       1.1  mrg       }
    436       1.1  mrg 
    437       1.1  mrg   template<typename _RealType>
    438       1.1  mrg     template<typename _OutputIterator,
    439       1.1  mrg 	     typename _UniformRandomNumberGenerator>
    440       1.1  mrg       void
    441       1.1  mrg       beta_distribution<_RealType>::
    442       1.1  mrg       __generate_impl(_OutputIterator __f, _OutputIterator __t,
    443       1.1  mrg 		      _UniformRandomNumberGenerator& __urng,
    444       1.1  mrg 		      const param_type& __param)
    445       1.1  mrg       {
    446   1.1.1.4  mrg 	__glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
    447   1.1.1.4  mrg 	    result_type>)
    448       1.1  mrg 
    449       1.1  mrg 	std::__detail::_Adaptor<_UniformRandomNumberGenerator, result_type>
    450       1.1  mrg 	  __aurng(__urng);
    451       1.1  mrg 
    452       1.1  mrg 	while (__f != __t)
    453       1.1  mrg 	  {
    454       1.1  mrg 	    result_type __x, __y;
    455       1.1  mrg 	    do
    456       1.1  mrg 	      {
    457       1.1  mrg 		__x = std::exp(std::log(__aurng()) / __param.alpha());
    458       1.1  mrg 		__y = std::exp(std::log(__aurng()) / __param.beta());
    459       1.1  mrg 	      }
    460       1.1  mrg 	    while (__x + __y > result_type(1));
    461       1.1  mrg 
    462       1.1  mrg 	    *__f++ = __x / (__x + __y);
    463       1.1  mrg 	  }
    464       1.1  mrg       }
    465       1.1  mrg 
    466       1.1  mrg   template<typename _RealType, typename _CharT, typename _Traits>
    467       1.1  mrg     std::basic_ostream<_CharT, _Traits>&
    468       1.1  mrg     operator<<(std::basic_ostream<_CharT, _Traits>& __os,
    469       1.1  mrg 	       const __gnu_cxx::beta_distribution<_RealType>& __x)
    470       1.1  mrg     {
    471       1.1  mrg       typedef std::basic_ostream<_CharT, _Traits>  __ostream_type;
    472       1.1  mrg       typedef typename __ostream_type::ios_base    __ios_base;
    473       1.1  mrg 
    474       1.1  mrg       const typename __ios_base::fmtflags __flags = __os.flags();
    475       1.1  mrg       const _CharT __fill = __os.fill();
    476       1.1  mrg       const std::streamsize __precision = __os.precision();
    477       1.1  mrg       const _CharT __space = __os.widen(' ');
    478       1.1  mrg       __os.flags(__ios_base::scientific | __ios_base::left);
    479       1.1  mrg       __os.fill(__space);
    480       1.1  mrg       __os.precision(std::numeric_limits<_RealType>::max_digits10);
    481       1.1  mrg 
    482       1.1  mrg       __os << __x.alpha() << __space << __x.beta();
    483       1.1  mrg 
    484       1.1  mrg       __os.flags(__flags);
    485       1.1  mrg       __os.fill(__fill);
    486       1.1  mrg       __os.precision(__precision);
    487       1.1  mrg       return __os;
    488       1.1  mrg     }
    489       1.1  mrg 
    490       1.1  mrg   template<typename _RealType, typename _CharT, typename _Traits>
    491       1.1  mrg     std::basic_istream<_CharT, _Traits>&
    492       1.1  mrg     operator>>(std::basic_istream<_CharT, _Traits>& __is,
    493       1.1  mrg 	       __gnu_cxx::beta_distribution<_RealType>& __x)
    494       1.1  mrg     {
    495       1.1  mrg       typedef std::basic_istream<_CharT, _Traits>  __istream_type;
    496       1.1  mrg       typedef typename __istream_type::ios_base    __ios_base;
    497       1.1  mrg 
    498       1.1  mrg       const typename __ios_base::fmtflags __flags = __is.flags();
    499       1.1  mrg       __is.flags(__ios_base::dec | __ios_base::skipws);
    500       1.1  mrg 
    501       1.1  mrg       _RealType __alpha_val, __beta_val;
    502       1.1  mrg       __is >> __alpha_val >> __beta_val;
    503       1.1  mrg       __x.param(typename __gnu_cxx::beta_distribution<_RealType>::
    504       1.1  mrg 		param_type(__alpha_val, __beta_val));
    505       1.1  mrg 
    506       1.1  mrg       __is.flags(__flags);
    507       1.1  mrg       return __is;
    508       1.1  mrg     }
    509       1.1  mrg 
    510       1.1  mrg 
    511       1.1  mrg   template<std::size_t _Dimen, typename _RealType>
    512       1.1  mrg     template<typename _InputIterator1, typename _InputIterator2>
    513       1.1  mrg       void
    514       1.1  mrg       normal_mv_distribution<_Dimen, _RealType>::param_type::
    515       1.1  mrg       _M_init_full(_InputIterator1 __meanbegin, _InputIterator1 __meanend,
    516       1.1  mrg 		   _InputIterator2 __varcovbegin, _InputIterator2 __varcovend)
    517       1.1  mrg       {
    518       1.1  mrg 	__glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
    519       1.1  mrg 	__glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
    520       1.1  mrg 	std::fill(std::copy(__meanbegin, __meanend, _M_mean.begin()),
    521       1.1  mrg 		  _M_mean.end(), _RealType(0));
    522       1.1  mrg 
    523       1.1  mrg 	// Perform the Cholesky decomposition
    524       1.1  mrg 	auto __w = _M_t.begin();
    525       1.1  mrg 	for (size_t __j = 0; __j < _Dimen; ++__j)
    526       1.1  mrg 	  {
    527       1.1  mrg 	    _RealType __sum = _RealType(0);
    528       1.1  mrg 
    529       1.1  mrg 	    auto __slitbegin = __w;
    530       1.1  mrg 	    auto __cit = _M_t.begin();
    531       1.1  mrg 	    for (size_t __i = 0; __i < __j; ++__i)
    532       1.1  mrg 	      {
    533       1.1  mrg 		auto __slit = __slitbegin;
    534       1.1  mrg 		_RealType __s = *__varcovbegin++;
    535       1.1  mrg 		for (size_t __k = 0; __k < __i; ++__k)
    536       1.1  mrg 		  __s -= *__slit++ * *__cit++;
    537       1.1  mrg 
    538       1.1  mrg 		*__w++ = __s /= *__cit++;
    539       1.1  mrg 		__sum += __s * __s;
    540       1.1  mrg 	      }
    541       1.1  mrg 
    542       1.1  mrg 	    __sum = *__varcovbegin - __sum;
    543       1.1  mrg 	    if (__builtin_expect(__sum <= _RealType(0), 0))
    544       1.1  mrg 	      std::__throw_runtime_error(__N("normal_mv_distribution::"
    545       1.1  mrg 					     "param_type::_M_init_full"));
    546       1.1  mrg 	    *__w++ = std::sqrt(__sum);
    547       1.1  mrg 
    548       1.1  mrg 	    std::advance(__varcovbegin, _Dimen - __j);
    549       1.1  mrg 	  }
    550       1.1  mrg       }
    551       1.1  mrg 
    552       1.1  mrg   template<std::size_t _Dimen, typename _RealType>
    553       1.1  mrg     template<typename _InputIterator1, typename _InputIterator2>
    554       1.1  mrg       void
    555       1.1  mrg       normal_mv_distribution<_Dimen, _RealType>::param_type::
    556       1.1  mrg       _M_init_lower(_InputIterator1 __meanbegin, _InputIterator1 __meanend,
    557       1.1  mrg 		    _InputIterator2 __varcovbegin, _InputIterator2 __varcovend)
    558       1.1  mrg       {
    559       1.1  mrg 	__glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
    560       1.1  mrg 	__glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
    561       1.1  mrg 	std::fill(std::copy(__meanbegin, __meanend, _M_mean.begin()),
    562       1.1  mrg 		  _M_mean.end(), _RealType(0));
    563       1.1  mrg 
    564       1.1  mrg 	// Perform the Cholesky decomposition
    565       1.1  mrg 	auto __w = _M_t.begin();
    566       1.1  mrg 	for (size_t __j = 0; __j < _Dimen; ++__j)
    567       1.1  mrg 	  {
    568       1.1  mrg 	    _RealType __sum = _RealType(0);
    569       1.1  mrg 
    570       1.1  mrg 	    auto __slitbegin = __w;
    571       1.1  mrg 	    auto __cit = _M_t.begin();
    572       1.1  mrg 	    for (size_t __i = 0; __i < __j; ++__i)
    573       1.1  mrg 	      {
    574       1.1  mrg 		auto __slit = __slitbegin;
    575       1.1  mrg 		_RealType __s = *__varcovbegin++;
    576       1.1  mrg 		for (size_t __k = 0; __k < __i; ++__k)
    577       1.1  mrg 		  __s -= *__slit++ * *__cit++;
    578       1.1  mrg 
    579       1.1  mrg 		*__w++ = __s /= *__cit++;
    580       1.1  mrg 		__sum += __s * __s;
    581       1.1  mrg 	      }
    582       1.1  mrg 
    583       1.1  mrg 	    __sum = *__varcovbegin++ - __sum;
    584       1.1  mrg 	    if (__builtin_expect(__sum <= _RealType(0), 0))
    585       1.1  mrg 	      std::__throw_runtime_error(__N("normal_mv_distribution::"
    586   1.1.1.9  mrg 					     "param_type::_M_init_lower"));
    587       1.1  mrg 	    *__w++ = std::sqrt(__sum);
    588       1.1  mrg 	  }
    589       1.1  mrg       }
    590       1.1  mrg 
    591       1.1  mrg   template<std::size_t _Dimen, typename _RealType>
    592       1.1  mrg     template<typename _InputIterator1, typename _InputIterator2>
    593       1.1  mrg       void
    594       1.1  mrg       normal_mv_distribution<_Dimen, _RealType>::param_type::
    595       1.1  mrg       _M_init_diagonal(_InputIterator1 __meanbegin, _InputIterator1 __meanend,
    596       1.1  mrg 		       _InputIterator2 __varbegin, _InputIterator2 __varend)
    597       1.1  mrg       {
    598       1.1  mrg 	__glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
    599       1.1  mrg 	__glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
    600       1.1  mrg 	std::fill(std::copy(__meanbegin, __meanend, _M_mean.begin()),
    601       1.1  mrg 		  _M_mean.end(), _RealType(0));
    602       1.1  mrg 
    603       1.1  mrg 	auto __w = _M_t.begin();
    604       1.1  mrg 	size_t __step = 0;
    605       1.1  mrg 	while (__varbegin != __varend)
    606       1.1  mrg 	  {
    607       1.1  mrg 	    std::fill_n(__w, __step, _RealType(0));
    608       1.1  mrg 	    __w += __step++;
    609       1.1  mrg 	    if (__builtin_expect(*__varbegin < _RealType(0), 0))
    610       1.1  mrg 	      std::__throw_runtime_error(__N("normal_mv_distribution::"
    611       1.1  mrg 					     "param_type::_M_init_diagonal"));
    612       1.1  mrg 	    *__w++ = std::sqrt(*__varbegin++);
    613       1.1  mrg 	  }
    614       1.1  mrg       }
    615       1.1  mrg 
    616       1.1  mrg   template<std::size_t _Dimen, typename _RealType>
    617       1.1  mrg     template<typename _UniformRandomNumberGenerator>
    618       1.1  mrg       typename normal_mv_distribution<_Dimen, _RealType>::result_type
    619       1.1  mrg       normal_mv_distribution<_Dimen, _RealType>::
    620       1.1  mrg       operator()(_UniformRandomNumberGenerator& __urng,
    621       1.1  mrg 		 const param_type& __param)
    622       1.1  mrg       {
    623       1.1  mrg 	result_type __ret;
    624       1.1  mrg 
    625       1.1  mrg 	_M_nd.__generate(__ret.begin(), __ret.end(), __urng);
    626       1.1  mrg 
    627       1.1  mrg 	auto __t_it = __param._M_t.crbegin();
    628       1.1  mrg 	for (size_t __i = _Dimen; __i > 0; --__i)
    629       1.1  mrg 	  {
    630       1.1  mrg 	    _RealType __sum = _RealType(0);
    631       1.1  mrg 	    for (size_t __j = __i; __j > 0; --__j)
    632       1.1  mrg 	      __sum += __ret[__j - 1] * *__t_it++;
    633       1.1  mrg 	    __ret[__i - 1] = __sum;
    634       1.1  mrg 	  }
    635       1.1  mrg 
    636       1.1  mrg 	return __ret;
    637       1.1  mrg       }
    638       1.1  mrg 
    639       1.1  mrg   template<std::size_t _Dimen, typename _RealType>
    640       1.1  mrg     template<typename _ForwardIterator, typename _UniformRandomNumberGenerator>
    641       1.1  mrg       void
    642       1.1  mrg       normal_mv_distribution<_Dimen, _RealType>::
    643       1.1  mrg       __generate_impl(_ForwardIterator __f, _ForwardIterator __t,
    644       1.1  mrg 		      _UniformRandomNumberGenerator& __urng,
    645       1.1  mrg 		      const param_type& __param)
    646       1.1  mrg       {
    647       1.1  mrg 	__glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
    648       1.1  mrg 				    _ForwardIterator>)
    649       1.1  mrg 	while (__f != __t)
    650       1.1  mrg 	  *__f++ = this->operator()(__urng, __param);
    651       1.1  mrg       }
    652       1.1  mrg 
    653       1.1  mrg   template<size_t _Dimen, typename _RealType>
    654       1.1  mrg     bool
    655       1.1  mrg     operator==(const __gnu_cxx::normal_mv_distribution<_Dimen, _RealType>&
    656       1.1  mrg 	       __d1,
    657       1.1  mrg 	       const __gnu_cxx::normal_mv_distribution<_Dimen, _RealType>&
    658       1.1  mrg 	       __d2)
    659       1.1  mrg     {
    660       1.1  mrg       return __d1._M_param == __d2._M_param && __d1._M_nd == __d2._M_nd;
    661       1.1  mrg     }
    662       1.1  mrg 
    663       1.1  mrg   template<size_t _Dimen, typename _RealType, typename _CharT, typename _Traits>
    664       1.1  mrg     std::basic_ostream<_CharT, _Traits>&
    665       1.1  mrg     operator<<(std::basic_ostream<_CharT, _Traits>& __os,
    666       1.1  mrg 	       const __gnu_cxx::normal_mv_distribution<_Dimen, _RealType>& __x)
    667       1.1  mrg     {
    668       1.1  mrg       typedef std::basic_ostream<_CharT, _Traits>  __ostream_type;
    669       1.1  mrg       typedef typename __ostream_type::ios_base    __ios_base;
    670       1.1  mrg 
    671       1.1  mrg       const typename __ios_base::fmtflags __flags = __os.flags();
    672       1.1  mrg       const _CharT __fill = __os.fill();
    673       1.1  mrg       const std::streamsize __precision = __os.precision();
    674       1.1  mrg       const _CharT __space = __os.widen(' ');
    675       1.1  mrg       __os.flags(__ios_base::scientific | __ios_base::left);
    676       1.1  mrg       __os.fill(__space);
    677       1.1  mrg       __os.precision(std::numeric_limits<_RealType>::max_digits10);
    678       1.1  mrg 
    679       1.1  mrg       auto __mean = __x._M_param.mean();
    680       1.1  mrg       for (auto __it : __mean)
    681       1.1  mrg 	__os << __it << __space;
    682       1.1  mrg       auto __t = __x._M_param.varcov();
    683       1.1  mrg       for (auto __it : __t)
    684       1.1  mrg 	__os << __it << __space;
    685       1.1  mrg 
    686       1.1  mrg       __os << __x._M_nd;
    687       1.1  mrg 
    688       1.1  mrg       __os.flags(__flags);
    689       1.1  mrg       __os.fill(__fill);
    690       1.1  mrg       __os.precision(__precision);
    691       1.1  mrg       return __os;
    692       1.1  mrg     }
    693       1.1  mrg 
    694       1.1  mrg   template<size_t _Dimen, typename _RealType, typename _CharT, typename _Traits>
    695       1.1  mrg     std::basic_istream<_CharT, _Traits>&
    696       1.1  mrg     operator>>(std::basic_istream<_CharT, _Traits>& __is,
    697       1.1  mrg 	       __gnu_cxx::normal_mv_distribution<_Dimen, _RealType>& __x)
    698       1.1  mrg     {
    699       1.1  mrg       typedef std::basic_istream<_CharT, _Traits>  __istream_type;
    700       1.1  mrg       typedef typename __istream_type::ios_base    __ios_base;
    701       1.1  mrg 
    702       1.1  mrg       const typename __ios_base::fmtflags __flags = __is.flags();
    703       1.1  mrg       __is.flags(__ios_base::dec | __ios_base::skipws);
    704       1.1  mrg 
    705       1.1  mrg       std::array<_RealType, _Dimen> __mean;
    706       1.1  mrg       for (auto& __it : __mean)
    707       1.1  mrg 	__is >> __it;
    708       1.1  mrg       std::array<_RealType, _Dimen * (_Dimen + 1) / 2> __varcov;
    709       1.1  mrg       for (auto& __it : __varcov)
    710       1.1  mrg 	__is >> __it;
    711       1.1  mrg 
    712       1.1  mrg       __is >> __x._M_nd;
    713       1.1  mrg 
    714   1.1.1.9  mrg       // The param_type temporary is built with a private constructor,
    715   1.1.1.9  mrg       // to skip the Cholesky decomposition that would be performed
    716   1.1.1.9  mrg       // otherwise.
    717       1.1  mrg       __x.param(typename normal_mv_distribution<_Dimen, _RealType>::
    718   1.1.1.9  mrg 		param_type(__mean, __varcov));
    719       1.1  mrg 
    720       1.1  mrg       __is.flags(__flags);
    721       1.1  mrg       return __is;
    722       1.1  mrg     }
    723       1.1  mrg 
    724       1.1  mrg 
    725       1.1  mrg   template<typename _RealType>
    726       1.1  mrg     template<typename _OutputIterator,
    727       1.1  mrg 	     typename _UniformRandomNumberGenerator>
    728       1.1  mrg       void
    729       1.1  mrg       rice_distribution<_RealType>::
    730       1.1  mrg       __generate_impl(_OutputIterator __f, _OutputIterator __t,
    731       1.1  mrg 		      _UniformRandomNumberGenerator& __urng,
    732       1.1  mrg 		      const param_type& __p)
    733       1.1  mrg       {
    734   1.1.1.4  mrg 	__glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
    735   1.1.1.4  mrg 	    result_type>)
    736       1.1  mrg 
    737       1.1  mrg 	while (__f != __t)
    738       1.1  mrg 	  {
    739       1.1  mrg 	    typename std::normal_distribution<result_type>::param_type
    740       1.1  mrg 	      __px(__p.nu(), __p.sigma()), __py(result_type(0), __p.sigma());
    741       1.1  mrg 	    result_type __x = this->_M_ndx(__px, __urng);
    742       1.1  mrg 	    result_type __y = this->_M_ndy(__py, __urng);
    743  1.1.1.11  mrg #if _GLIBCXX_USE_C99_MATH_FUNCS
    744       1.1  mrg 	    *__f++ = std::hypot(__x, __y);
    745       1.1  mrg #else
    746       1.1  mrg 	    *__f++ = std::sqrt(__x * __x + __y * __y);
    747       1.1  mrg #endif
    748       1.1  mrg 	  }
    749       1.1  mrg       }
    750       1.1  mrg 
    751       1.1  mrg   template<typename _RealType, typename _CharT, typename _Traits>
    752       1.1  mrg     std::basic_ostream<_CharT, _Traits>&
    753       1.1  mrg     operator<<(std::basic_ostream<_CharT, _Traits>& __os,
    754       1.1  mrg 	       const rice_distribution<_RealType>& __x)
    755       1.1  mrg     {
    756       1.1  mrg       typedef std::basic_ostream<_CharT, _Traits>  __ostream_type;
    757       1.1  mrg       typedef typename __ostream_type::ios_base    __ios_base;
    758       1.1  mrg 
    759       1.1  mrg       const typename __ios_base::fmtflags __flags = __os.flags();
    760       1.1  mrg       const _CharT __fill = __os.fill();
    761       1.1  mrg       const std::streamsize __precision = __os.precision();
    762       1.1  mrg       const _CharT __space = __os.widen(' ');
    763       1.1  mrg       __os.flags(__ios_base::scientific | __ios_base::left);
    764       1.1  mrg       __os.fill(__space);
    765       1.1  mrg       __os.precision(std::numeric_limits<_RealType>::max_digits10);
    766       1.1  mrg 
    767       1.1  mrg       __os << __x.nu() << __space << __x.sigma();
    768       1.1  mrg       __os << __space << __x._M_ndx;
    769       1.1  mrg       __os << __space << __x._M_ndy;
    770       1.1  mrg 
    771       1.1  mrg       __os.flags(__flags);
    772       1.1  mrg       __os.fill(__fill);
    773       1.1  mrg       __os.precision(__precision);
    774       1.1  mrg       return __os;
    775       1.1  mrg     }
    776       1.1  mrg 
    777       1.1  mrg   template<typename _RealType, typename _CharT, typename _Traits>
    778       1.1  mrg     std::basic_istream<_CharT, _Traits>&
    779       1.1  mrg     operator>>(std::basic_istream<_CharT, _Traits>& __is,
    780       1.1  mrg 	       rice_distribution<_RealType>& __x)
    781       1.1  mrg     {
    782       1.1  mrg       typedef std::basic_istream<_CharT, _Traits>  __istream_type;
    783       1.1  mrg       typedef typename __istream_type::ios_base    __ios_base;
    784       1.1  mrg 
    785       1.1  mrg       const typename __ios_base::fmtflags __flags = __is.flags();
    786       1.1  mrg       __is.flags(__ios_base::dec | __ios_base::skipws);
    787       1.1  mrg 
    788       1.1  mrg       _RealType __nu_val, __sigma_val;
    789       1.1  mrg       __is >> __nu_val >> __sigma_val;
    790       1.1  mrg       __is >> __x._M_ndx;
    791       1.1  mrg       __is >> __x._M_ndy;
    792       1.1  mrg       __x.param(typename rice_distribution<_RealType>::
    793       1.1  mrg 		param_type(__nu_val, __sigma_val));
    794       1.1  mrg 
    795       1.1  mrg       __is.flags(__flags);
    796       1.1  mrg       return __is;
    797       1.1  mrg     }
    798       1.1  mrg 
    799       1.1  mrg 
    800       1.1  mrg   template<typename _RealType>
    801       1.1  mrg     template<typename _OutputIterator,
    802       1.1  mrg 	     typename _UniformRandomNumberGenerator>
    803       1.1  mrg       void
    804       1.1  mrg       nakagami_distribution<_RealType>::
    805       1.1  mrg       __generate_impl(_OutputIterator __f, _OutputIterator __t,
    806       1.1  mrg 		      _UniformRandomNumberGenerator& __urng,
    807       1.1  mrg 		      const param_type& __p)
    808       1.1  mrg       {
    809   1.1.1.4  mrg 	__glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
    810   1.1.1.4  mrg 	    result_type>)
    811       1.1  mrg 
    812       1.1  mrg 	typename std::gamma_distribution<result_type>::param_type
    813       1.1  mrg 	  __pg(__p.mu(), __p.omega() / __p.mu());
    814       1.1  mrg 	while (__f != __t)
    815       1.1  mrg 	  *__f++ = std::sqrt(this->_M_gd(__pg, __urng));
    816       1.1  mrg       }
    817       1.1  mrg 
    818       1.1  mrg   template<typename _RealType, typename _CharT, typename _Traits>
    819       1.1  mrg     std::basic_ostream<_CharT, _Traits>&
    820       1.1  mrg     operator<<(std::basic_ostream<_CharT, _Traits>& __os,
    821       1.1  mrg 	       const nakagami_distribution<_RealType>& __x)
    822       1.1  mrg     {
    823       1.1  mrg       typedef std::basic_ostream<_CharT, _Traits>  __ostream_type;
    824       1.1  mrg       typedef typename __ostream_type::ios_base    __ios_base;
    825       1.1  mrg 
    826       1.1  mrg       const typename __ios_base::fmtflags __flags = __os.flags();
    827       1.1  mrg       const _CharT __fill = __os.fill();
    828       1.1  mrg       const std::streamsize __precision = __os.precision();
    829       1.1  mrg       const _CharT __space = __os.widen(' ');
    830       1.1  mrg       __os.flags(__ios_base::scientific | __ios_base::left);
    831       1.1  mrg       __os.fill(__space);
    832       1.1  mrg       __os.precision(std::numeric_limits<_RealType>::max_digits10);
    833       1.1  mrg 
    834       1.1  mrg       __os << __x.mu() << __space << __x.omega();
    835       1.1  mrg       __os << __space << __x._M_gd;
    836       1.1  mrg 
    837       1.1  mrg       __os.flags(__flags);
    838       1.1  mrg       __os.fill(__fill);
    839       1.1  mrg       __os.precision(__precision);
    840       1.1  mrg       return __os;
    841       1.1  mrg     }
    842       1.1  mrg 
    843       1.1  mrg   template<typename _RealType, typename _CharT, typename _Traits>
    844       1.1  mrg     std::basic_istream<_CharT, _Traits>&
    845       1.1  mrg     operator>>(std::basic_istream<_CharT, _Traits>& __is,
    846       1.1  mrg 	       nakagami_distribution<_RealType>& __x)
    847       1.1  mrg     {
    848       1.1  mrg       typedef std::basic_istream<_CharT, _Traits>  __istream_type;
    849       1.1  mrg       typedef typename __istream_type::ios_base    __ios_base;
    850       1.1  mrg 
    851       1.1  mrg       const typename __ios_base::fmtflags __flags = __is.flags();
    852       1.1  mrg       __is.flags(__ios_base::dec | __ios_base::skipws);
    853       1.1  mrg 
    854       1.1  mrg       _RealType __mu_val, __omega_val;
    855       1.1  mrg       __is >> __mu_val >> __omega_val;
    856       1.1  mrg       __is >> __x._M_gd;
    857       1.1  mrg       __x.param(typename nakagami_distribution<_RealType>::
    858       1.1  mrg 		param_type(__mu_val, __omega_val));
    859       1.1  mrg 
    860       1.1  mrg       __is.flags(__flags);
    861       1.1  mrg       return __is;
    862       1.1  mrg     }
    863       1.1  mrg 
    864       1.1  mrg 
    865       1.1  mrg   template<typename _RealType>
    866       1.1  mrg     template<typename _OutputIterator,
    867       1.1  mrg 	     typename _UniformRandomNumberGenerator>
    868       1.1  mrg       void
    869       1.1  mrg       pareto_distribution<_RealType>::
    870       1.1  mrg       __generate_impl(_OutputIterator __f, _OutputIterator __t,
    871       1.1  mrg 		      _UniformRandomNumberGenerator& __urng,
    872       1.1  mrg 		      const param_type& __p)
    873       1.1  mrg       {
    874   1.1.1.4  mrg 	__glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
    875   1.1.1.4  mrg 	    result_type>)
    876       1.1  mrg 
    877       1.1  mrg 	result_type __mu_val = __p.mu();
    878       1.1  mrg 	result_type __malphinv = -result_type(1) / __p.alpha();
    879       1.1  mrg 	while (__f != __t)
    880       1.1  mrg 	  *__f++ = __mu_val * std::pow(this->_M_ud(__urng), __malphinv);
    881       1.1  mrg       }
    882       1.1  mrg 
    883       1.1  mrg   template<typename _RealType, typename _CharT, typename _Traits>
    884       1.1  mrg     std::basic_ostream<_CharT, _Traits>&
    885       1.1  mrg     operator<<(std::basic_ostream<_CharT, _Traits>& __os,
    886       1.1  mrg 	       const pareto_distribution<_RealType>& __x)
    887       1.1  mrg     {
    888       1.1  mrg       typedef std::basic_ostream<_CharT, _Traits>  __ostream_type;
    889       1.1  mrg       typedef typename __ostream_type::ios_base    __ios_base;
    890       1.1  mrg 
    891       1.1  mrg       const typename __ios_base::fmtflags __flags = __os.flags();
    892       1.1  mrg       const _CharT __fill = __os.fill();
    893       1.1  mrg       const std::streamsize __precision = __os.precision();
    894       1.1  mrg       const _CharT __space = __os.widen(' ');
    895       1.1  mrg       __os.flags(__ios_base::scientific | __ios_base::left);
    896       1.1  mrg       __os.fill(__space);
    897       1.1  mrg       __os.precision(std::numeric_limits<_RealType>::max_digits10);
    898       1.1  mrg 
    899       1.1  mrg       __os << __x.alpha() << __space << __x.mu();
    900       1.1  mrg       __os << __space << __x._M_ud;
    901       1.1  mrg 
    902       1.1  mrg       __os.flags(__flags);
    903       1.1  mrg       __os.fill(__fill);
    904       1.1  mrg       __os.precision(__precision);
    905       1.1  mrg       return __os;
    906       1.1  mrg     }
    907       1.1  mrg 
    908       1.1  mrg   template<typename _RealType, typename _CharT, typename _Traits>
    909       1.1  mrg     std::basic_istream<_CharT, _Traits>&
    910       1.1  mrg     operator>>(std::basic_istream<_CharT, _Traits>& __is,
    911       1.1  mrg 	       pareto_distribution<_RealType>& __x)
    912       1.1  mrg     {
    913       1.1  mrg       typedef std::basic_istream<_CharT, _Traits>  __istream_type;
    914       1.1  mrg       typedef typename __istream_type::ios_base    __ios_base;
    915       1.1  mrg 
    916       1.1  mrg       const typename __ios_base::fmtflags __flags = __is.flags();
    917       1.1  mrg       __is.flags(__ios_base::dec | __ios_base::skipws);
    918       1.1  mrg 
    919       1.1  mrg       _RealType __alpha_val, __mu_val;
    920       1.1  mrg       __is >> __alpha_val >> __mu_val;
    921       1.1  mrg       __is >> __x._M_ud;
    922       1.1  mrg       __x.param(typename pareto_distribution<_RealType>::
    923       1.1  mrg 		param_type(__alpha_val, __mu_val));
    924       1.1  mrg 
    925       1.1  mrg       __is.flags(__flags);
    926       1.1  mrg       return __is;
    927       1.1  mrg     }
    928       1.1  mrg 
    929       1.1  mrg 
    930       1.1  mrg   template<typename _RealType>
    931       1.1  mrg     template<typename _UniformRandomNumberGenerator>
    932       1.1  mrg       typename k_distribution<_RealType>::result_type
    933       1.1  mrg       k_distribution<_RealType>::
    934       1.1  mrg       operator()(_UniformRandomNumberGenerator& __urng)
    935       1.1  mrg       {
    936       1.1  mrg 	result_type __x = this->_M_gd1(__urng);
    937       1.1  mrg 	result_type __y = this->_M_gd2(__urng);
    938       1.1  mrg 	return std::sqrt(__x * __y);
    939       1.1  mrg       }
    940       1.1  mrg 
    941       1.1  mrg   template<typename _RealType>
    942       1.1  mrg     template<typename _UniformRandomNumberGenerator>
    943       1.1  mrg       typename k_distribution<_RealType>::result_type
    944       1.1  mrg       k_distribution<_RealType>::
    945       1.1  mrg       operator()(_UniformRandomNumberGenerator& __urng,
    946       1.1  mrg 		 const param_type& __p)
    947       1.1  mrg       {
    948       1.1  mrg 	typename std::gamma_distribution<result_type>::param_type
    949       1.1  mrg 	  __p1(__p.lambda(), result_type(1) / __p.lambda()),
    950       1.1  mrg 	  __p2(__p.nu(), __p.mu() / __p.nu());
    951       1.1  mrg 	result_type __x = this->_M_gd1(__p1, __urng);
    952       1.1  mrg 	result_type __y = this->_M_gd2(__p2, __urng);
    953       1.1  mrg 	return std::sqrt(__x * __y);
    954       1.1  mrg       }
    955       1.1  mrg 
    956       1.1  mrg   template<typename _RealType>
    957       1.1  mrg     template<typename _OutputIterator,
    958       1.1  mrg 	     typename _UniformRandomNumberGenerator>
    959       1.1  mrg       void
    960       1.1  mrg       k_distribution<_RealType>::
    961       1.1  mrg       __generate_impl(_OutputIterator __f, _OutputIterator __t,
    962       1.1  mrg 		      _UniformRandomNumberGenerator& __urng,
    963       1.1  mrg 		      const param_type& __p)
    964       1.1  mrg       {
    965   1.1.1.4  mrg 	__glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
    966   1.1.1.4  mrg 	    result_type>)
    967       1.1  mrg 
    968       1.1  mrg 	typename std::gamma_distribution<result_type>::param_type
    969       1.1  mrg 	  __p1(__p.lambda(), result_type(1) / __p.lambda()),
    970       1.1  mrg 	  __p2(__p.nu(), __p.mu() / __p.nu());
    971       1.1  mrg 	while (__f != __t)
    972       1.1  mrg 	  {
    973       1.1  mrg 	    result_type __x = this->_M_gd1(__p1, __urng);
    974       1.1  mrg 	    result_type __y = this->_M_gd2(__p2, __urng);
    975       1.1  mrg 	    *__f++ = std::sqrt(__x * __y);
    976       1.1  mrg 	  }
    977       1.1  mrg       }
    978       1.1  mrg 
    979       1.1  mrg   template<typename _RealType, typename _CharT, typename _Traits>
    980       1.1  mrg     std::basic_ostream<_CharT, _Traits>&
    981       1.1  mrg     operator<<(std::basic_ostream<_CharT, _Traits>& __os,
    982       1.1  mrg 	       const k_distribution<_RealType>& __x)
    983       1.1  mrg     {
    984       1.1  mrg       typedef std::basic_ostream<_CharT, _Traits>  __ostream_type;
    985       1.1  mrg       typedef typename __ostream_type::ios_base    __ios_base;
    986       1.1  mrg 
    987       1.1  mrg       const typename __ios_base::fmtflags __flags = __os.flags();
    988       1.1  mrg       const _CharT __fill = __os.fill();
    989       1.1  mrg       const std::streamsize __precision = __os.precision();
    990       1.1  mrg       const _CharT __space = __os.widen(' ');
    991       1.1  mrg       __os.flags(__ios_base::scientific | __ios_base::left);
    992       1.1  mrg       __os.fill(__space);
    993       1.1  mrg       __os.precision(std::numeric_limits<_RealType>::max_digits10);
    994       1.1  mrg 
    995       1.1  mrg       __os << __x.lambda() << __space << __x.mu() << __space << __x.nu();
    996       1.1  mrg       __os << __space << __x._M_gd1;
    997       1.1  mrg       __os << __space << __x._M_gd2;
    998       1.1  mrg 
    999       1.1  mrg       __os.flags(__flags);
   1000       1.1  mrg       __os.fill(__fill);
   1001       1.1  mrg       __os.precision(__precision);
   1002       1.1  mrg       return __os;
   1003       1.1  mrg     }
   1004       1.1  mrg 
   1005       1.1  mrg   template<typename _RealType, typename _CharT, typename _Traits>
   1006       1.1  mrg     std::basic_istream<_CharT, _Traits>&
   1007       1.1  mrg     operator>>(std::basic_istream<_CharT, _Traits>& __is,
   1008       1.1  mrg 	       k_distribution<_RealType>& __x)
   1009       1.1  mrg     {
   1010       1.1  mrg       typedef std::basic_istream<_CharT, _Traits>  __istream_type;
   1011       1.1  mrg       typedef typename __istream_type::ios_base    __ios_base;
   1012       1.1  mrg 
   1013       1.1  mrg       const typename __ios_base::fmtflags __flags = __is.flags();
   1014       1.1  mrg       __is.flags(__ios_base::dec | __ios_base::skipws);
   1015       1.1  mrg 
   1016       1.1  mrg       _RealType __lambda_val, __mu_val, __nu_val;
   1017       1.1  mrg       __is >> __lambda_val >> __mu_val >> __nu_val;
   1018       1.1  mrg       __is >> __x._M_gd1;
   1019       1.1  mrg       __is >> __x._M_gd2;
   1020       1.1  mrg       __x.param(typename k_distribution<_RealType>::
   1021       1.1  mrg 		param_type(__lambda_val, __mu_val, __nu_val));
   1022       1.1  mrg 
   1023       1.1  mrg       __is.flags(__flags);
   1024       1.1  mrg       return __is;
   1025       1.1  mrg     }
   1026       1.1  mrg 
   1027       1.1  mrg 
   1028       1.1  mrg   template<typename _RealType>
   1029       1.1  mrg     template<typename _OutputIterator,
   1030       1.1  mrg 	     typename _UniformRandomNumberGenerator>
   1031       1.1  mrg       void
   1032       1.1  mrg       arcsine_distribution<_RealType>::
   1033       1.1  mrg       __generate_impl(_OutputIterator __f, _OutputIterator __t,
   1034       1.1  mrg 		      _UniformRandomNumberGenerator& __urng,
   1035       1.1  mrg 		      const param_type& __p)
   1036       1.1  mrg       {
   1037   1.1.1.4  mrg 	__glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
   1038   1.1.1.4  mrg 	    result_type>)
   1039       1.1  mrg 
   1040       1.1  mrg 	result_type __dif = __p.b() - __p.a();
   1041       1.1  mrg 	result_type __sum = __p.a() + __p.b();
   1042       1.1  mrg 	while (__f != __t)
   1043       1.1  mrg 	  {
   1044       1.1  mrg 	    result_type __x = std::sin(this->_M_ud(__urng));
   1045       1.1  mrg 	    *__f++ = (__x * __dif + __sum) / result_type(2);
   1046       1.1  mrg 	  }
   1047       1.1  mrg       }
   1048       1.1  mrg 
   1049       1.1  mrg   template<typename _RealType, typename _CharT, typename _Traits>
   1050       1.1  mrg     std::basic_ostream<_CharT, _Traits>&
   1051       1.1  mrg     operator<<(std::basic_ostream<_CharT, _Traits>& __os,
   1052       1.1  mrg 	       const arcsine_distribution<_RealType>& __x)
   1053       1.1  mrg     {
   1054       1.1  mrg       typedef std::basic_ostream<_CharT, _Traits>  __ostream_type;
   1055       1.1  mrg       typedef typename __ostream_type::ios_base    __ios_base;
   1056       1.1  mrg 
   1057       1.1  mrg       const typename __ios_base::fmtflags __flags = __os.flags();
   1058       1.1  mrg       const _CharT __fill = __os.fill();
   1059       1.1  mrg       const std::streamsize __precision = __os.precision();
   1060       1.1  mrg       const _CharT __space = __os.widen(' ');
   1061       1.1  mrg       __os.flags(__ios_base::scientific | __ios_base::left);
   1062       1.1  mrg       __os.fill(__space);
   1063       1.1  mrg       __os.precision(std::numeric_limits<_RealType>::max_digits10);
   1064       1.1  mrg 
   1065       1.1  mrg       __os << __x.a() << __space << __x.b();
   1066       1.1  mrg       __os << __space << __x._M_ud;
   1067       1.1  mrg 
   1068       1.1  mrg       __os.flags(__flags);
   1069       1.1  mrg       __os.fill(__fill);
   1070       1.1  mrg       __os.precision(__precision);
   1071       1.1  mrg       return __os;
   1072       1.1  mrg     }
   1073       1.1  mrg 
   1074       1.1  mrg   template<typename _RealType, typename _CharT, typename _Traits>
   1075       1.1  mrg     std::basic_istream<_CharT, _Traits>&
   1076       1.1  mrg     operator>>(std::basic_istream<_CharT, _Traits>& __is,
   1077       1.1  mrg 	       arcsine_distribution<_RealType>& __x)
   1078       1.1  mrg     {
   1079       1.1  mrg       typedef std::basic_istream<_CharT, _Traits>  __istream_type;
   1080       1.1  mrg       typedef typename __istream_type::ios_base    __ios_base;
   1081       1.1  mrg 
   1082       1.1  mrg       const typename __ios_base::fmtflags __flags = __is.flags();
   1083       1.1  mrg       __is.flags(__ios_base::dec | __ios_base::skipws);
   1084       1.1  mrg 
   1085       1.1  mrg       _RealType __a, __b;
   1086       1.1  mrg       __is >> __a >> __b;
   1087       1.1  mrg       __is >> __x._M_ud;
   1088       1.1  mrg       __x.param(typename arcsine_distribution<_RealType>::
   1089       1.1  mrg 		param_type(__a, __b));
   1090       1.1  mrg 
   1091       1.1  mrg       __is.flags(__flags);
   1092       1.1  mrg       return __is;
   1093       1.1  mrg     }
   1094       1.1  mrg 
   1095       1.1  mrg 
   1096       1.1  mrg   template<typename _RealType>
   1097       1.1  mrg     template<typename _UniformRandomNumberGenerator>
   1098       1.1  mrg       typename hoyt_distribution<_RealType>::result_type
   1099       1.1  mrg       hoyt_distribution<_RealType>::
   1100       1.1  mrg       operator()(_UniformRandomNumberGenerator& __urng)
   1101       1.1  mrg       {
   1102       1.1  mrg 	result_type __x = this->_M_ad(__urng);
   1103       1.1  mrg 	result_type __y = this->_M_ed(__urng);
   1104       1.1  mrg 	return (result_type(2) * this->q()
   1105       1.1  mrg 		  / (result_type(1) + this->q() * this->q()))
   1106       1.1  mrg 	       * std::sqrt(this->omega() * __x * __y);
   1107       1.1  mrg       }
   1108       1.1  mrg 
   1109       1.1  mrg   template<typename _RealType>
   1110       1.1  mrg     template<typename _UniformRandomNumberGenerator>
   1111       1.1  mrg       typename hoyt_distribution<_RealType>::result_type
   1112       1.1  mrg       hoyt_distribution<_RealType>::
   1113       1.1  mrg       operator()(_UniformRandomNumberGenerator& __urng,
   1114       1.1  mrg 		 const param_type& __p)
   1115       1.1  mrg       {
   1116       1.1  mrg 	result_type __q2 = __p.q() * __p.q();
   1117       1.1  mrg 	result_type __num = result_type(0.5L) * (result_type(1) + __q2);
   1118       1.1  mrg 	typename __gnu_cxx::arcsine_distribution<result_type>::param_type
   1119       1.1  mrg 	  __pa(__num, __num / __q2);
   1120       1.1  mrg 	result_type __x = this->_M_ad(__pa, __urng);
   1121       1.1  mrg 	result_type __y = this->_M_ed(__urng);
   1122       1.1  mrg 	return (result_type(2) * __p.q() / (result_type(1) + __q2))
   1123       1.1  mrg 	       * std::sqrt(__p.omega() * __x * __y);
   1124       1.1  mrg       }
   1125       1.1  mrg 
   1126       1.1  mrg   template<typename _RealType>
   1127       1.1  mrg     template<typename _OutputIterator,
   1128       1.1  mrg 	     typename _UniformRandomNumberGenerator>
   1129       1.1  mrg       void
   1130       1.1  mrg       hoyt_distribution<_RealType>::
   1131       1.1  mrg       __generate_impl(_OutputIterator __f, _OutputIterator __t,
   1132       1.1  mrg 		      _UniformRandomNumberGenerator& __urng,
   1133       1.1  mrg 		      const param_type& __p)
   1134       1.1  mrg       {
   1135   1.1.1.4  mrg 	__glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
   1136   1.1.1.4  mrg 	    result_type>)
   1137       1.1  mrg 
   1138       1.1  mrg 	result_type __2q = result_type(2) * __p.q();
   1139       1.1  mrg 	result_type __q2 = __p.q() * __p.q();
   1140       1.1  mrg 	result_type __q2p1 = result_type(1) + __q2;
   1141       1.1  mrg 	result_type __num = result_type(0.5L) * __q2p1;
   1142       1.1  mrg 	result_type __omega = __p.omega();
   1143       1.1  mrg 	typename __gnu_cxx::arcsine_distribution<result_type>::param_type
   1144       1.1  mrg 	  __pa(__num, __num / __q2);
   1145       1.1  mrg 	while (__f != __t)
   1146       1.1  mrg 	  {
   1147       1.1  mrg 	    result_type __x = this->_M_ad(__pa, __urng);
   1148       1.1  mrg 	    result_type __y = this->_M_ed(__urng);
   1149       1.1  mrg 	    *__f++ = (__2q / __q2p1) * std::sqrt(__omega * __x * __y);
   1150       1.1  mrg 	  }
   1151       1.1  mrg       }
   1152       1.1  mrg 
   1153       1.1  mrg   template<typename _RealType, typename _CharT, typename _Traits>
   1154       1.1  mrg     std::basic_ostream<_CharT, _Traits>&
   1155       1.1  mrg     operator<<(std::basic_ostream<_CharT, _Traits>& __os,
   1156       1.1  mrg 	       const hoyt_distribution<_RealType>& __x)
   1157       1.1  mrg     {
   1158       1.1  mrg       typedef std::basic_ostream<_CharT, _Traits>  __ostream_type;
   1159       1.1  mrg       typedef typename __ostream_type::ios_base    __ios_base;
   1160       1.1  mrg 
   1161       1.1  mrg       const typename __ios_base::fmtflags __flags = __os.flags();
   1162       1.1  mrg       const _CharT __fill = __os.fill();
   1163       1.1  mrg       const std::streamsize __precision = __os.precision();
   1164       1.1  mrg       const _CharT __space = __os.widen(' ');
   1165       1.1  mrg       __os.flags(__ios_base::scientific | __ios_base::left);
   1166       1.1  mrg       __os.fill(__space);
   1167       1.1  mrg       __os.precision(std::numeric_limits<_RealType>::max_digits10);
   1168       1.1  mrg 
   1169       1.1  mrg       __os << __x.q() << __space << __x.omega();
   1170       1.1  mrg       __os << __space << __x._M_ad;
   1171       1.1  mrg       __os << __space << __x._M_ed;
   1172       1.1  mrg 
   1173       1.1  mrg       __os.flags(__flags);
   1174       1.1  mrg       __os.fill(__fill);
   1175       1.1  mrg       __os.precision(__precision);
   1176       1.1  mrg       return __os;
   1177       1.1  mrg     }
   1178       1.1  mrg 
   1179       1.1  mrg   template<typename _RealType, typename _CharT, typename _Traits>
   1180       1.1  mrg     std::basic_istream<_CharT, _Traits>&
   1181       1.1  mrg     operator>>(std::basic_istream<_CharT, _Traits>& __is,
   1182       1.1  mrg 	       hoyt_distribution<_RealType>& __x)
   1183       1.1  mrg     {
   1184       1.1  mrg       typedef std::basic_istream<_CharT, _Traits>  __istream_type;
   1185       1.1  mrg       typedef typename __istream_type::ios_base    __ios_base;
   1186       1.1  mrg 
   1187       1.1  mrg       const typename __ios_base::fmtflags __flags = __is.flags();
   1188       1.1  mrg       __is.flags(__ios_base::dec | __ios_base::skipws);
   1189       1.1  mrg 
   1190       1.1  mrg       _RealType __q, __omega;
   1191       1.1  mrg       __is >> __q >> __omega;
   1192       1.1  mrg       __is >> __x._M_ad;
   1193       1.1  mrg       __is >> __x._M_ed;
   1194       1.1  mrg       __x.param(typename hoyt_distribution<_RealType>::
   1195       1.1  mrg 		param_type(__q, __omega));
   1196       1.1  mrg 
   1197       1.1  mrg       __is.flags(__flags);
   1198       1.1  mrg       return __is;
   1199       1.1  mrg     }
   1200       1.1  mrg 
   1201       1.1  mrg 
   1202       1.1  mrg   template<typename _RealType>
   1203       1.1  mrg     template<typename _OutputIterator,
   1204       1.1  mrg 	     typename _UniformRandomNumberGenerator>
   1205       1.1  mrg       void
   1206       1.1  mrg       triangular_distribution<_RealType>::
   1207       1.1  mrg       __generate_impl(_OutputIterator __f, _OutputIterator __t,
   1208       1.1  mrg 		      _UniformRandomNumberGenerator& __urng,
   1209       1.1  mrg 		      const param_type& __param)
   1210       1.1  mrg       {
   1211   1.1.1.4  mrg 	__glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
   1212   1.1.1.4  mrg 	    result_type>)
   1213       1.1  mrg 
   1214       1.1  mrg 	while (__f != __t)
   1215       1.1  mrg 	  *__f++ = this->operator()(__urng, __param);
   1216       1.1  mrg       }
   1217       1.1  mrg 
   1218       1.1  mrg   template<typename _RealType, typename _CharT, typename _Traits>
   1219       1.1  mrg     std::basic_ostream<_CharT, _Traits>&
   1220       1.1  mrg     operator<<(std::basic_ostream<_CharT, _Traits>& __os,
   1221       1.1  mrg 	       const __gnu_cxx::triangular_distribution<_RealType>& __x)
   1222       1.1  mrg     {
   1223       1.1  mrg       typedef std::basic_ostream<_CharT, _Traits>  __ostream_type;
   1224       1.1  mrg       typedef typename __ostream_type::ios_base    __ios_base;
   1225       1.1  mrg 
   1226       1.1  mrg       const typename __ios_base::fmtflags __flags = __os.flags();
   1227       1.1  mrg       const _CharT __fill = __os.fill();
   1228       1.1  mrg       const std::streamsize __precision = __os.precision();
   1229       1.1  mrg       const _CharT __space = __os.widen(' ');
   1230       1.1  mrg       __os.flags(__ios_base::scientific | __ios_base::left);
   1231       1.1  mrg       __os.fill(__space);
   1232       1.1  mrg       __os.precision(std::numeric_limits<_RealType>::max_digits10);
   1233       1.1  mrg 
   1234       1.1  mrg       __os << __x.a() << __space << __x.b() << __space << __x.c();
   1235       1.1  mrg 
   1236       1.1  mrg       __os.flags(__flags);
   1237       1.1  mrg       __os.fill(__fill);
   1238       1.1  mrg       __os.precision(__precision);
   1239       1.1  mrg       return __os;
   1240       1.1  mrg     }
   1241       1.1  mrg 
   1242       1.1  mrg   template<typename _RealType, typename _CharT, typename _Traits>
   1243       1.1  mrg     std::basic_istream<_CharT, _Traits>&
   1244       1.1  mrg     operator>>(std::basic_istream<_CharT, _Traits>& __is,
   1245       1.1  mrg 	       __gnu_cxx::triangular_distribution<_RealType>& __x)
   1246       1.1  mrg     {
   1247       1.1  mrg       typedef std::basic_istream<_CharT, _Traits>  __istream_type;
   1248       1.1  mrg       typedef typename __istream_type::ios_base    __ios_base;
   1249       1.1  mrg 
   1250       1.1  mrg       const typename __ios_base::fmtflags __flags = __is.flags();
   1251       1.1  mrg       __is.flags(__ios_base::dec | __ios_base::skipws);
   1252       1.1  mrg 
   1253       1.1  mrg       _RealType __a, __b, __c;
   1254       1.1  mrg       __is >> __a >> __b >> __c;
   1255       1.1  mrg       __x.param(typename __gnu_cxx::triangular_distribution<_RealType>::
   1256       1.1  mrg 		param_type(__a, __b, __c));
   1257       1.1  mrg 
   1258       1.1  mrg       __is.flags(__flags);
   1259       1.1  mrg       return __is;
   1260       1.1  mrg     }
   1261       1.1  mrg 
   1262       1.1  mrg 
   1263       1.1  mrg   template<typename _RealType>
   1264   1.1.1.2  mrg     template<typename _UniformRandomNumberGenerator>
   1265   1.1.1.2  mrg       typename von_mises_distribution<_RealType>::result_type
   1266   1.1.1.2  mrg       von_mises_distribution<_RealType>::
   1267   1.1.1.2  mrg       operator()(_UniformRandomNumberGenerator& __urng,
   1268   1.1.1.2  mrg 		 const param_type& __p)
   1269   1.1.1.2  mrg       {
   1270   1.1.1.2  mrg 	const result_type __pi
   1271   1.1.1.2  mrg 	  = __gnu_cxx::__math_constants<result_type>::__pi;
   1272   1.1.1.2  mrg 	std::__detail::_Adaptor<_UniformRandomNumberGenerator, result_type>
   1273   1.1.1.2  mrg 	  __aurng(__urng);
   1274   1.1.1.2  mrg 
   1275   1.1.1.2  mrg 	result_type __f;
   1276   1.1.1.2  mrg 	while (1)
   1277   1.1.1.2  mrg 	  {
   1278   1.1.1.2  mrg 	    result_type __rnd = std::cos(__pi * __aurng());
   1279   1.1.1.2  mrg 	    __f = (result_type(1) + __p._M_r * __rnd) / (__p._M_r + __rnd);
   1280   1.1.1.2  mrg 	    result_type __c = __p._M_kappa * (__p._M_r - __f);
   1281   1.1.1.2  mrg 
   1282   1.1.1.2  mrg 	    result_type __rnd2 = __aurng();
   1283   1.1.1.2  mrg 	    if (__c * (result_type(2) - __c) > __rnd2)
   1284   1.1.1.2  mrg 	      break;
   1285   1.1.1.2  mrg 	    if (std::log(__c / __rnd2) >= __c - result_type(1))
   1286   1.1.1.2  mrg 	      break;
   1287   1.1.1.2  mrg 	  }
   1288   1.1.1.2  mrg 
   1289   1.1.1.2  mrg 	result_type __res = std::acos(__f);
   1290  1.1.1.11  mrg #if _GLIBCXX_USE_C99_MATH_FUNCS
   1291   1.1.1.2  mrg 	__res = std::copysign(__res, __aurng() - result_type(0.5));
   1292   1.1.1.2  mrg #else
   1293   1.1.1.2  mrg 	if (__aurng() < result_type(0.5))
   1294   1.1.1.2  mrg 	  __res = -__res;
   1295   1.1.1.2  mrg #endif
   1296   1.1.1.2  mrg 	__res += __p._M_mu;
   1297   1.1.1.2  mrg 	if (__res > __pi)
   1298   1.1.1.2  mrg 	  __res -= result_type(2) * __pi;
   1299   1.1.1.2  mrg 	else if (__res < -__pi)
   1300   1.1.1.2  mrg 	  __res += result_type(2) * __pi;
   1301   1.1.1.2  mrg 	return __res;
   1302   1.1.1.2  mrg       }
   1303   1.1.1.2  mrg 
   1304   1.1.1.2  mrg   template<typename _RealType>
   1305       1.1  mrg     template<typename _OutputIterator,
   1306       1.1  mrg 	     typename _UniformRandomNumberGenerator>
   1307       1.1  mrg       void
   1308       1.1  mrg       von_mises_distribution<_RealType>::
   1309       1.1  mrg       __generate_impl(_OutputIterator __f, _OutputIterator __t,
   1310       1.1  mrg 		      _UniformRandomNumberGenerator& __urng,
   1311       1.1  mrg 		      const param_type& __param)
   1312       1.1  mrg       {
   1313   1.1.1.4  mrg 	__glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
   1314   1.1.1.4  mrg 	    result_type>)
   1315       1.1  mrg 
   1316       1.1  mrg 	while (__f != __t)
   1317       1.1  mrg 	  *__f++ = this->operator()(__urng, __param);
   1318       1.1  mrg       }
   1319       1.1  mrg 
   1320       1.1  mrg   template<typename _RealType, typename _CharT, typename _Traits>
   1321       1.1  mrg     std::basic_ostream<_CharT, _Traits>&
   1322       1.1  mrg     operator<<(std::basic_ostream<_CharT, _Traits>& __os,
   1323       1.1  mrg 	       const __gnu_cxx::von_mises_distribution<_RealType>& __x)
   1324       1.1  mrg     {
   1325       1.1  mrg       typedef std::basic_ostream<_CharT, _Traits>  __ostream_type;
   1326       1.1  mrg       typedef typename __ostream_type::ios_base    __ios_base;
   1327       1.1  mrg 
   1328       1.1  mrg       const typename __ios_base::fmtflags __flags = __os.flags();
   1329       1.1  mrg       const _CharT __fill = __os.fill();
   1330       1.1  mrg       const std::streamsize __precision = __os.precision();
   1331       1.1  mrg       const _CharT __space = __os.widen(' ');
   1332       1.1  mrg       __os.flags(__ios_base::scientific | __ios_base::left);
   1333       1.1  mrg       __os.fill(__space);
   1334       1.1  mrg       __os.precision(std::numeric_limits<_RealType>::max_digits10);
   1335       1.1  mrg 
   1336       1.1  mrg       __os << __x.mu() << __space << __x.kappa();
   1337       1.1  mrg 
   1338       1.1  mrg       __os.flags(__flags);
   1339       1.1  mrg       __os.fill(__fill);
   1340       1.1  mrg       __os.precision(__precision);
   1341       1.1  mrg       return __os;
   1342       1.1  mrg     }
   1343       1.1  mrg 
   1344       1.1  mrg   template<typename _RealType, typename _CharT, typename _Traits>
   1345       1.1  mrg     std::basic_istream<_CharT, _Traits>&
   1346       1.1  mrg     operator>>(std::basic_istream<_CharT, _Traits>& __is,
   1347       1.1  mrg 	       __gnu_cxx::von_mises_distribution<_RealType>& __x)
   1348       1.1  mrg     {
   1349       1.1  mrg       typedef std::basic_istream<_CharT, _Traits>  __istream_type;
   1350       1.1  mrg       typedef typename __istream_type::ios_base    __ios_base;
   1351       1.1  mrg 
   1352       1.1  mrg       const typename __ios_base::fmtflags __flags = __is.flags();
   1353       1.1  mrg       __is.flags(__ios_base::dec | __ios_base::skipws);
   1354       1.1  mrg 
   1355       1.1  mrg       _RealType __mu, __kappa;
   1356       1.1  mrg       __is >> __mu >> __kappa;
   1357       1.1  mrg       __x.param(typename __gnu_cxx::von_mises_distribution<_RealType>::
   1358       1.1  mrg 		param_type(__mu, __kappa));
   1359       1.1  mrg 
   1360       1.1  mrg       __is.flags(__flags);
   1361       1.1  mrg       return __is;
   1362       1.1  mrg     }
   1363       1.1  mrg 
   1364   1.1.1.2  mrg 
   1365   1.1.1.2  mrg   template<typename _UIntType>
   1366   1.1.1.2  mrg     template<typename _UniformRandomNumberGenerator>
   1367   1.1.1.2  mrg       typename hypergeometric_distribution<_UIntType>::result_type
   1368   1.1.1.2  mrg       hypergeometric_distribution<_UIntType>::
   1369   1.1.1.2  mrg       operator()(_UniformRandomNumberGenerator& __urng,
   1370   1.1.1.2  mrg 		 const param_type& __param)
   1371   1.1.1.2  mrg       {
   1372   1.1.1.2  mrg 	std::__detail::_Adaptor<_UniformRandomNumberGenerator, double>
   1373   1.1.1.2  mrg 	  __aurng(__urng);
   1374   1.1.1.2  mrg 
   1375   1.1.1.2  mrg 	result_type __a = __param.successful_size();
   1376   1.1.1.2  mrg 	result_type __b = __param.total_size();
   1377   1.1.1.2  mrg 	result_type __k = 0;
   1378   1.1.1.2  mrg 
   1379   1.1.1.2  mrg 	if (__param.total_draws() < __param.total_size() / 2)
   1380   1.1.1.2  mrg 	  {
   1381   1.1.1.2  mrg 	    for (result_type __i = 0; __i < __param.total_draws(); ++__i)
   1382   1.1.1.2  mrg 	      {
   1383   1.1.1.2  mrg 		if (__b * __aurng() < __a)
   1384   1.1.1.2  mrg 		  {
   1385   1.1.1.2  mrg 		    ++__k;
   1386   1.1.1.2  mrg 		    if (__k == __param.successful_size())
   1387   1.1.1.2  mrg 		      return __k;
   1388   1.1.1.2  mrg 		   --__a;
   1389   1.1.1.2  mrg 		  }
   1390   1.1.1.2  mrg 		--__b;
   1391   1.1.1.2  mrg 	      }
   1392   1.1.1.2  mrg 	    return __k;
   1393   1.1.1.2  mrg 	  }
   1394   1.1.1.2  mrg 	else
   1395   1.1.1.2  mrg 	  {
   1396   1.1.1.2  mrg 	    for (result_type __i = 0; __i < __param.unsuccessful_size(); ++__i)
   1397   1.1.1.2  mrg 	      {
   1398   1.1.1.2  mrg 		if (__b * __aurng() < __a)
   1399   1.1.1.2  mrg 		  {
   1400   1.1.1.2  mrg 		    ++__k;
   1401   1.1.1.2  mrg 		    if (__k == __param.successful_size())
   1402   1.1.1.2  mrg 		      return __param.successful_size() - __k;
   1403   1.1.1.2  mrg 		    --__a;
   1404   1.1.1.2  mrg 		  }
   1405   1.1.1.2  mrg 		--__b;
   1406   1.1.1.2  mrg 	      }
   1407   1.1.1.2  mrg 	    return __param.successful_size() - __k;
   1408   1.1.1.2  mrg 	  }
   1409   1.1.1.2  mrg       }
   1410   1.1.1.2  mrg 
   1411   1.1.1.2  mrg   template<typename _UIntType>
   1412   1.1.1.2  mrg     template<typename _OutputIterator,
   1413   1.1.1.2  mrg 	     typename _UniformRandomNumberGenerator>
   1414   1.1.1.2  mrg       void
   1415   1.1.1.2  mrg       hypergeometric_distribution<_UIntType>::
   1416   1.1.1.2  mrg       __generate_impl(_OutputIterator __f, _OutputIterator __t,
   1417   1.1.1.2  mrg 		      _UniformRandomNumberGenerator& __urng,
   1418   1.1.1.2  mrg 		      const param_type& __param)
   1419   1.1.1.2  mrg       {
   1420   1.1.1.4  mrg 	__glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
   1421   1.1.1.4  mrg 	    result_type>)
   1422   1.1.1.2  mrg 
   1423   1.1.1.2  mrg 	while (__f != __t)
   1424   1.1.1.2  mrg 	  *__f++ = this->operator()(__urng);
   1425   1.1.1.2  mrg       }
   1426   1.1.1.2  mrg 
   1427   1.1.1.2  mrg   template<typename _UIntType, typename _CharT, typename _Traits>
   1428   1.1.1.2  mrg     std::basic_ostream<_CharT, _Traits>&
   1429   1.1.1.2  mrg     operator<<(std::basic_ostream<_CharT, _Traits>& __os,
   1430   1.1.1.2  mrg 	       const __gnu_cxx::hypergeometric_distribution<_UIntType>& __x)
   1431   1.1.1.2  mrg     {
   1432   1.1.1.2  mrg       typedef std::basic_ostream<_CharT, _Traits>  __ostream_type;
   1433   1.1.1.2  mrg       typedef typename __ostream_type::ios_base    __ios_base;
   1434   1.1.1.2  mrg 
   1435   1.1.1.2  mrg       const typename __ios_base::fmtflags __flags = __os.flags();
   1436   1.1.1.2  mrg       const _CharT __fill = __os.fill();
   1437   1.1.1.2  mrg       const std::streamsize __precision = __os.precision();
   1438   1.1.1.2  mrg       const _CharT __space = __os.widen(' ');
   1439   1.1.1.2  mrg       __os.flags(__ios_base::scientific | __ios_base::left);
   1440   1.1.1.2  mrg       __os.fill(__space);
   1441   1.1.1.2  mrg       __os.precision(std::numeric_limits<_UIntType>::max_digits10);
   1442   1.1.1.2  mrg 
   1443   1.1.1.2  mrg       __os << __x.total_size() << __space << __x.successful_size() << __space
   1444   1.1.1.2  mrg 	   << __x.total_draws();
   1445   1.1.1.2  mrg 
   1446   1.1.1.2  mrg       __os.flags(__flags);
   1447   1.1.1.2  mrg       __os.fill(__fill);
   1448   1.1.1.2  mrg       __os.precision(__precision);
   1449   1.1.1.2  mrg       return __os;
   1450   1.1.1.2  mrg     }
   1451   1.1.1.2  mrg 
   1452   1.1.1.2  mrg   template<typename _UIntType, typename _CharT, typename _Traits>
   1453   1.1.1.2  mrg     std::basic_istream<_CharT, _Traits>&
   1454   1.1.1.2  mrg     operator>>(std::basic_istream<_CharT, _Traits>& __is,
   1455   1.1.1.2  mrg 	       __gnu_cxx::hypergeometric_distribution<_UIntType>& __x)
   1456   1.1.1.2  mrg     {
   1457   1.1.1.2  mrg       typedef std::basic_istream<_CharT, _Traits>  __istream_type;
   1458   1.1.1.2  mrg       typedef typename __istream_type::ios_base    __ios_base;
   1459   1.1.1.2  mrg 
   1460   1.1.1.2  mrg       const typename __ios_base::fmtflags __flags = __is.flags();
   1461   1.1.1.2  mrg       __is.flags(__ios_base::dec | __ios_base::skipws);
   1462   1.1.1.2  mrg 
   1463   1.1.1.2  mrg       _UIntType __total_size, __successful_size, __total_draws;
   1464   1.1.1.2  mrg       __is >> __total_size >> __successful_size >> __total_draws;
   1465   1.1.1.2  mrg       __x.param(typename __gnu_cxx::hypergeometric_distribution<_UIntType>::
   1466   1.1.1.2  mrg 		param_type(__total_size, __successful_size, __total_draws));
   1467   1.1.1.2  mrg 
   1468   1.1.1.2  mrg       __is.flags(__flags);
   1469   1.1.1.2  mrg       return __is;
   1470   1.1.1.2  mrg     }
   1471   1.1.1.2  mrg 
   1472   1.1.1.2  mrg 
   1473   1.1.1.2  mrg   template<typename _RealType>
   1474   1.1.1.2  mrg     template<typename _UniformRandomNumberGenerator>
   1475   1.1.1.2  mrg       typename logistic_distribution<_RealType>::result_type
   1476   1.1.1.2  mrg       logistic_distribution<_RealType>::
   1477   1.1.1.2  mrg       operator()(_UniformRandomNumberGenerator& __urng,
   1478   1.1.1.2  mrg 		 const param_type& __p)
   1479   1.1.1.2  mrg       {
   1480   1.1.1.2  mrg 	std::__detail::_Adaptor<_UniformRandomNumberGenerator, result_type>
   1481   1.1.1.2  mrg 	  __aurng(__urng);
   1482   1.1.1.2  mrg 
   1483   1.1.1.2  mrg 	result_type __arg = result_type(1);
   1484   1.1.1.2  mrg 	while (__arg == result_type(1) || __arg == result_type(0))
   1485   1.1.1.2  mrg 	  __arg = __aurng();
   1486   1.1.1.2  mrg 	return __p.a()
   1487   1.1.1.2  mrg 	     + __p.b() * std::log(__arg / (result_type(1) - __arg));
   1488   1.1.1.2  mrg       }
   1489   1.1.1.2  mrg 
   1490   1.1.1.2  mrg   template<typename _RealType>
   1491   1.1.1.2  mrg     template<typename _OutputIterator,
   1492   1.1.1.2  mrg 	     typename _UniformRandomNumberGenerator>
   1493   1.1.1.2  mrg       void
   1494   1.1.1.2  mrg       logistic_distribution<_RealType>::
   1495   1.1.1.2  mrg       __generate_impl(_OutputIterator __f, _OutputIterator __t,
   1496   1.1.1.2  mrg 		      _UniformRandomNumberGenerator& __urng,
   1497   1.1.1.2  mrg 		      const param_type& __p)
   1498   1.1.1.2  mrg       {
   1499   1.1.1.4  mrg 	__glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
   1500   1.1.1.4  mrg 	    result_type>)
   1501   1.1.1.4  mrg 
   1502   1.1.1.2  mrg 	std::__detail::_Adaptor<_UniformRandomNumberGenerator, result_type>
   1503   1.1.1.2  mrg 	  __aurng(__urng);
   1504   1.1.1.2  mrg 
   1505   1.1.1.2  mrg 	while (__f != __t)
   1506   1.1.1.2  mrg 	  {
   1507   1.1.1.2  mrg 	    result_type __arg = result_type(1);
   1508   1.1.1.2  mrg 	    while (__arg == result_type(1) || __arg == result_type(0))
   1509   1.1.1.2  mrg 	      __arg = __aurng();
   1510   1.1.1.2  mrg 	    *__f++ = __p.a()
   1511   1.1.1.2  mrg 		   + __p.b() * std::log(__arg / (result_type(1) - __arg));
   1512   1.1.1.2  mrg 	  }
   1513   1.1.1.2  mrg       }
   1514   1.1.1.2  mrg 
   1515   1.1.1.2  mrg   template<typename _RealType, typename _CharT, typename _Traits>
   1516   1.1.1.2  mrg     std::basic_ostream<_CharT, _Traits>&
   1517   1.1.1.2  mrg     operator<<(std::basic_ostream<_CharT, _Traits>& __os,
   1518   1.1.1.2  mrg 	       const logistic_distribution<_RealType>& __x)
   1519   1.1.1.2  mrg     {
   1520   1.1.1.2  mrg       typedef std::basic_ostream<_CharT, _Traits>  __ostream_type;
   1521   1.1.1.2  mrg       typedef typename __ostream_type::ios_base    __ios_base;
   1522   1.1.1.2  mrg 
   1523   1.1.1.2  mrg       const typename __ios_base::fmtflags __flags = __os.flags();
   1524   1.1.1.2  mrg       const _CharT __fill = __os.fill();
   1525   1.1.1.2  mrg       const std::streamsize __precision = __os.precision();
   1526   1.1.1.2  mrg       const _CharT __space = __os.widen(' ');
   1527   1.1.1.2  mrg       __os.flags(__ios_base::scientific | __ios_base::left);
   1528   1.1.1.2  mrg       __os.fill(__space);
   1529   1.1.1.2  mrg       __os.precision(std::numeric_limits<_RealType>::max_digits10);
   1530   1.1.1.2  mrg 
   1531   1.1.1.2  mrg       __os << __x.a() << __space << __x.b();
   1532   1.1.1.2  mrg 
   1533   1.1.1.2  mrg       __os.flags(__flags);
   1534   1.1.1.2  mrg       __os.fill(__fill);
   1535   1.1.1.2  mrg       __os.precision(__precision);
   1536   1.1.1.2  mrg       return __os;
   1537   1.1.1.2  mrg     }
   1538   1.1.1.2  mrg 
   1539   1.1.1.2  mrg   template<typename _RealType, typename _CharT, typename _Traits>
   1540   1.1.1.2  mrg     std::basic_istream<_CharT, _Traits>&
   1541   1.1.1.2  mrg     operator>>(std::basic_istream<_CharT, _Traits>& __is,
   1542   1.1.1.2  mrg 	       logistic_distribution<_RealType>& __x)
   1543   1.1.1.2  mrg     {
   1544   1.1.1.2  mrg       typedef std::basic_istream<_CharT, _Traits>  __istream_type;
   1545   1.1.1.2  mrg       typedef typename __istream_type::ios_base    __ios_base;
   1546   1.1.1.2  mrg 
   1547   1.1.1.2  mrg       const typename __ios_base::fmtflags __flags = __is.flags();
   1548   1.1.1.2  mrg       __is.flags(__ios_base::dec | __ios_base::skipws);
   1549   1.1.1.2  mrg 
   1550   1.1.1.2  mrg       _RealType __a, __b;
   1551   1.1.1.2  mrg       __is >> __a >> __b;
   1552   1.1.1.2  mrg       __x.param(typename logistic_distribution<_RealType>::
   1553   1.1.1.2  mrg 		param_type(__a, __b));
   1554   1.1.1.2  mrg 
   1555   1.1.1.2  mrg       __is.flags(__flags);
   1556   1.1.1.2  mrg       return __is;
   1557   1.1.1.2  mrg     }
   1558   1.1.1.2  mrg 
   1559   1.1.1.2  mrg 
   1560   1.1.1.2  mrg   namespace {
   1561   1.1.1.2  mrg 
   1562   1.1.1.2  mrg     // Helper class for the uniform_on_sphere_distribution generation
   1563   1.1.1.2  mrg     // function.
   1564   1.1.1.2  mrg     template<std::size_t _Dimen, typename _RealType>
   1565   1.1.1.2  mrg       class uniform_on_sphere_helper
   1566   1.1.1.2  mrg       {
   1567   1.1.1.2  mrg 	typedef typename uniform_on_sphere_distribution<_Dimen, _RealType>::
   1568   1.1.1.2  mrg 	  result_type result_type;
   1569   1.1.1.2  mrg 
   1570   1.1.1.2  mrg       public:
   1571   1.1.1.2  mrg 	template<typename _NormalDistribution,
   1572   1.1.1.2  mrg 		 typename _UniformRandomNumberGenerator>
   1573   1.1.1.2  mrg 	result_type operator()(_NormalDistribution& __nd,
   1574   1.1.1.2  mrg 			       _UniformRandomNumberGenerator& __urng)
   1575   1.1.1.2  mrg         {
   1576   1.1.1.2  mrg 	  result_type __ret;
   1577   1.1.1.2  mrg 	  typename result_type::value_type __norm;
   1578   1.1.1.2  mrg 
   1579   1.1.1.2  mrg 	  do
   1580   1.1.1.2  mrg 	    {
   1581   1.1.1.2  mrg 	      auto __sum = _RealType(0);
   1582   1.1.1.2  mrg 
   1583   1.1.1.2  mrg 	      std::generate(__ret.begin(), __ret.end(),
   1584   1.1.1.2  mrg 			    [&__nd, &__urng, &__sum](){
   1585   1.1.1.2  mrg 			      _RealType __t = __nd(__urng);
   1586   1.1.1.2  mrg 			      __sum += __t * __t;
   1587   1.1.1.2  mrg 			      return __t; });
   1588   1.1.1.2  mrg 	      __norm = std::sqrt(__sum);
   1589   1.1.1.2  mrg 	    }
   1590   1.1.1.3  mrg 	  while (__norm == _RealType(0) || ! __builtin_isfinite(__norm));
   1591   1.1.1.2  mrg 
   1592   1.1.1.2  mrg 	  std::transform(__ret.begin(), __ret.end(), __ret.begin(),
   1593   1.1.1.2  mrg 			 [__norm](_RealType __val){ return __val / __norm; });
   1594   1.1.1.2  mrg 
   1595   1.1.1.2  mrg 	  return __ret;
   1596   1.1.1.2  mrg         }
   1597   1.1.1.2  mrg       };
   1598   1.1.1.2  mrg 
   1599   1.1.1.2  mrg 
   1600   1.1.1.2  mrg     template<typename _RealType>
   1601   1.1.1.2  mrg       class uniform_on_sphere_helper<2, _RealType>
   1602   1.1.1.2  mrg       {
   1603   1.1.1.2  mrg 	typedef typename uniform_on_sphere_distribution<2, _RealType>::
   1604   1.1.1.2  mrg 	  result_type result_type;
   1605   1.1.1.2  mrg 
   1606   1.1.1.2  mrg       public:
   1607   1.1.1.2  mrg 	template<typename _NormalDistribution,
   1608   1.1.1.2  mrg 		 typename _UniformRandomNumberGenerator>
   1609   1.1.1.2  mrg 	result_type operator()(_NormalDistribution&,
   1610   1.1.1.2  mrg 			       _UniformRandomNumberGenerator& __urng)
   1611   1.1.1.2  mrg         {
   1612   1.1.1.2  mrg 	  result_type __ret;
   1613   1.1.1.2  mrg 	  _RealType __sq;
   1614   1.1.1.2  mrg 	  std::__detail::_Adaptor<_UniformRandomNumberGenerator,
   1615   1.1.1.2  mrg 				  _RealType> __aurng(__urng);
   1616   1.1.1.2  mrg 
   1617   1.1.1.2  mrg 	  do
   1618   1.1.1.2  mrg 	    {
   1619   1.1.1.2  mrg 	      __ret[0] = _RealType(2) * __aurng() - _RealType(1);
   1620   1.1.1.2  mrg 	      __ret[1] = _RealType(2) * __aurng() - _RealType(1);
   1621   1.1.1.2  mrg 
   1622   1.1.1.2  mrg 	      __sq = __ret[0] * __ret[0] + __ret[1] * __ret[1];
   1623   1.1.1.2  mrg 	    }
   1624   1.1.1.2  mrg 	  while (__sq == _RealType(0) || __sq > _RealType(1));
   1625   1.1.1.2  mrg 
   1626  1.1.1.11  mrg #if _GLIBCXX_USE_C99_MATH_FUNCS
   1627   1.1.1.2  mrg 	  // Yes, we do not just use sqrt(__sq) because hypot() is more
   1628   1.1.1.2  mrg 	  // accurate.
   1629   1.1.1.2  mrg 	  auto __norm = std::hypot(__ret[0], __ret[1]);
   1630   1.1.1.2  mrg #else
   1631   1.1.1.2  mrg 	  auto __norm = std::sqrt(__sq);
   1632   1.1.1.2  mrg #endif
   1633   1.1.1.2  mrg 	  __ret[0] /= __norm;
   1634   1.1.1.2  mrg 	  __ret[1] /= __norm;
   1635   1.1.1.2  mrg 
   1636   1.1.1.2  mrg 	  return __ret;
   1637   1.1.1.2  mrg         }
   1638   1.1.1.2  mrg       };
   1639   1.1.1.2  mrg 
   1640   1.1.1.2  mrg   }
   1641   1.1.1.2  mrg 
   1642   1.1.1.2  mrg 
   1643   1.1.1.2  mrg   template<std::size_t _Dimen, typename _RealType>
   1644   1.1.1.2  mrg     template<typename _UniformRandomNumberGenerator>
   1645   1.1.1.2  mrg       typename uniform_on_sphere_distribution<_Dimen, _RealType>::result_type
   1646   1.1.1.2  mrg       uniform_on_sphere_distribution<_Dimen, _RealType>::
   1647   1.1.1.2  mrg       operator()(_UniformRandomNumberGenerator& __urng,
   1648   1.1.1.2  mrg 		 const param_type& __p)
   1649   1.1.1.2  mrg       {
   1650   1.1.1.2  mrg         uniform_on_sphere_helper<_Dimen, _RealType> __helper;
   1651   1.1.1.2  mrg         return __helper(_M_nd, __urng);
   1652   1.1.1.2  mrg       }
   1653   1.1.1.2  mrg 
   1654   1.1.1.2  mrg   template<std::size_t _Dimen, typename _RealType>
   1655   1.1.1.2  mrg     template<typename _OutputIterator,
   1656   1.1.1.2  mrg 	     typename _UniformRandomNumberGenerator>
   1657   1.1.1.2  mrg       void
   1658   1.1.1.2  mrg       uniform_on_sphere_distribution<_Dimen, _RealType>::
   1659   1.1.1.2  mrg       __generate_impl(_OutputIterator __f, _OutputIterator __t,
   1660   1.1.1.2  mrg 		      _UniformRandomNumberGenerator& __urng,
   1661   1.1.1.2  mrg 		      const param_type& __param)
   1662   1.1.1.2  mrg       {
   1663   1.1.1.4  mrg 	__glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
   1664   1.1.1.4  mrg 	    result_type>)
   1665   1.1.1.2  mrg 
   1666   1.1.1.2  mrg 	while (__f != __t)
   1667   1.1.1.2  mrg 	  *__f++ = this->operator()(__urng, __param);
   1668   1.1.1.2  mrg       }
   1669   1.1.1.2  mrg 
   1670   1.1.1.2  mrg   template<std::size_t _Dimen, typename _RealType, typename _CharT,
   1671   1.1.1.2  mrg 	   typename _Traits>
   1672   1.1.1.2  mrg     std::basic_ostream<_CharT, _Traits>&
   1673   1.1.1.2  mrg     operator<<(std::basic_ostream<_CharT, _Traits>& __os,
   1674   1.1.1.2  mrg 	       const __gnu_cxx::uniform_on_sphere_distribution<_Dimen,
   1675   1.1.1.2  mrg 							       _RealType>& __x)
   1676   1.1.1.2  mrg     {
   1677   1.1.1.2  mrg       return __os << __x._M_nd;
   1678   1.1.1.2  mrg     }
   1679   1.1.1.2  mrg 
   1680   1.1.1.2  mrg   template<std::size_t _Dimen, typename _RealType, typename _CharT,
   1681   1.1.1.2  mrg 	   typename _Traits>
   1682   1.1.1.2  mrg     std::basic_istream<_CharT, _Traits>&
   1683   1.1.1.2  mrg     operator>>(std::basic_istream<_CharT, _Traits>& __is,
   1684   1.1.1.2  mrg 	       __gnu_cxx::uniform_on_sphere_distribution<_Dimen,
   1685   1.1.1.2  mrg 							 _RealType>& __x)
   1686   1.1.1.2  mrg     {
   1687   1.1.1.2  mrg       return __is >> __x._M_nd;
   1688   1.1.1.2  mrg     }
   1689   1.1.1.2  mrg 
   1690   1.1.1.4  mrg 
   1691   1.1.1.4  mrg   namespace {
   1692   1.1.1.4  mrg 
   1693   1.1.1.4  mrg     // Helper class for the uniform_inside_sphere_distribution generation
   1694   1.1.1.4  mrg     // function.
   1695   1.1.1.4  mrg     template<std::size_t _Dimen, bool _SmallDimen, typename _RealType>
   1696   1.1.1.4  mrg       class uniform_inside_sphere_helper;
   1697   1.1.1.4  mrg 
   1698   1.1.1.4  mrg     template<std::size_t _Dimen, typename _RealType>
   1699   1.1.1.4  mrg       class uniform_inside_sphere_helper<_Dimen, false, _RealType>
   1700   1.1.1.4  mrg       {
   1701   1.1.1.4  mrg 	using result_type
   1702   1.1.1.4  mrg 	  = typename uniform_inside_sphere_distribution<_Dimen, _RealType>::
   1703   1.1.1.4  mrg 	    result_type;
   1704   1.1.1.4  mrg 
   1705   1.1.1.4  mrg       public:
   1706   1.1.1.4  mrg 	template<typename _UniformOnSphereDistribution,
   1707   1.1.1.4  mrg 		 typename _UniformRandomNumberGenerator>
   1708   1.1.1.4  mrg 	result_type
   1709   1.1.1.4  mrg 	operator()(_UniformOnSphereDistribution& __uosd,
   1710   1.1.1.4  mrg 		   _UniformRandomNumberGenerator& __urng,
   1711   1.1.1.4  mrg 		   _RealType __radius)
   1712   1.1.1.4  mrg         {
   1713   1.1.1.4  mrg 	  std::__detail::_Adaptor<_UniformRandomNumberGenerator,
   1714   1.1.1.4  mrg 				  _RealType> __aurng(__urng);
   1715   1.1.1.4  mrg 
   1716   1.1.1.4  mrg 	  _RealType __pow = 1 / _RealType(_Dimen);
   1717   1.1.1.4  mrg 	  _RealType __urt = __radius * std::pow(__aurng(), __pow);
   1718   1.1.1.4  mrg 	  result_type __ret = __uosd(__aurng);
   1719   1.1.1.4  mrg 
   1720   1.1.1.4  mrg 	  std::transform(__ret.begin(), __ret.end(), __ret.begin(),
   1721   1.1.1.4  mrg 			 [__urt](_RealType __val)
   1722   1.1.1.4  mrg 			 { return __val * __urt; });
   1723   1.1.1.4  mrg 
   1724   1.1.1.4  mrg 	  return __ret;
   1725   1.1.1.4  mrg         }
   1726   1.1.1.4  mrg       };
   1727   1.1.1.4  mrg 
   1728   1.1.1.4  mrg     // Helper class for the uniform_inside_sphere_distribution generation
   1729   1.1.1.4  mrg     // function specialized for small dimensions.
   1730   1.1.1.4  mrg     template<std::size_t _Dimen, typename _RealType>
   1731   1.1.1.4  mrg       class uniform_inside_sphere_helper<_Dimen, true, _RealType>
   1732   1.1.1.4  mrg       {
   1733   1.1.1.4  mrg 	using result_type
   1734   1.1.1.4  mrg 	  = typename uniform_inside_sphere_distribution<_Dimen, _RealType>::
   1735   1.1.1.4  mrg 	    result_type;
   1736   1.1.1.4  mrg 
   1737   1.1.1.4  mrg       public:
   1738   1.1.1.4  mrg 	template<typename _UniformOnSphereDistribution,
   1739   1.1.1.4  mrg 		 typename _UniformRandomNumberGenerator>
   1740   1.1.1.4  mrg 	result_type
   1741   1.1.1.4  mrg 	operator()(_UniformOnSphereDistribution&,
   1742   1.1.1.4  mrg 		   _UniformRandomNumberGenerator& __urng,
   1743   1.1.1.4  mrg 		   _RealType __radius)
   1744   1.1.1.4  mrg         {
   1745   1.1.1.4  mrg 	  result_type __ret;
   1746   1.1.1.4  mrg 	  _RealType __sq;
   1747   1.1.1.4  mrg 	  _RealType __radsq = __radius * __radius;
   1748   1.1.1.4  mrg 	  std::__detail::_Adaptor<_UniformRandomNumberGenerator,
   1749   1.1.1.4  mrg 				  _RealType> __aurng(__urng);
   1750   1.1.1.4  mrg 
   1751   1.1.1.4  mrg 	  do
   1752   1.1.1.4  mrg 	    {
   1753   1.1.1.4  mrg 	      __sq = _RealType(0);
   1754   1.1.1.4  mrg 	      for (int i = 0; i < _Dimen; ++i)
   1755   1.1.1.4  mrg 		{
   1756   1.1.1.4  mrg 		  __ret[i] = _RealType(2) * __aurng() - _RealType(1);
   1757   1.1.1.4  mrg 		  __sq += __ret[i] * __ret[i];
   1758   1.1.1.4  mrg 		}
   1759   1.1.1.4  mrg 	    }
   1760   1.1.1.4  mrg 	  while (__sq > _RealType(1));
   1761   1.1.1.4  mrg 
   1762   1.1.1.4  mrg 	  for (int i = 0; i < _Dimen; ++i)
   1763   1.1.1.4  mrg             __ret[i] *= __radius;
   1764   1.1.1.4  mrg 
   1765   1.1.1.4  mrg 	  return __ret;
   1766   1.1.1.4  mrg         }
   1767   1.1.1.4  mrg       };
   1768   1.1.1.4  mrg   } // namespace
   1769   1.1.1.4  mrg 
   1770   1.1.1.4  mrg   //
   1771   1.1.1.4  mrg   //  Experiments have shown that rejection is more efficient than transform
   1772   1.1.1.4  mrg   //  for dimensions less than 8.
   1773   1.1.1.4  mrg   //
   1774   1.1.1.4  mrg   template<std::size_t _Dimen, typename _RealType>
   1775   1.1.1.4  mrg     template<typename _UniformRandomNumberGenerator>
   1776   1.1.1.4  mrg       typename uniform_inside_sphere_distribution<_Dimen, _RealType>::result_type
   1777   1.1.1.4  mrg       uniform_inside_sphere_distribution<_Dimen, _RealType>::
   1778   1.1.1.4  mrg       operator()(_UniformRandomNumberGenerator& __urng,
   1779   1.1.1.4  mrg 		 const param_type& __p)
   1780   1.1.1.4  mrg       {
   1781   1.1.1.4  mrg         uniform_inside_sphere_helper<_Dimen, _Dimen < 8, _RealType> __helper;
   1782   1.1.1.4  mrg         return __helper(_M_uosd, __urng, __p.radius());
   1783   1.1.1.4  mrg       }
   1784   1.1.1.4  mrg 
   1785   1.1.1.4  mrg   template<std::size_t _Dimen, typename _RealType>
   1786   1.1.1.4  mrg     template<typename _OutputIterator,
   1787   1.1.1.4  mrg 	     typename _UniformRandomNumberGenerator>
   1788   1.1.1.4  mrg       void
   1789   1.1.1.4  mrg       uniform_inside_sphere_distribution<_Dimen, _RealType>::
   1790   1.1.1.4  mrg       __generate_impl(_OutputIterator __f, _OutputIterator __t,
   1791   1.1.1.4  mrg 		      _UniformRandomNumberGenerator& __urng,
   1792   1.1.1.4  mrg 		      const param_type& __param)
   1793   1.1.1.4  mrg       {
   1794   1.1.1.4  mrg 	__glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
   1795   1.1.1.4  mrg 	    result_type>)
   1796   1.1.1.4  mrg 
   1797   1.1.1.4  mrg 	while (__f != __t)
   1798   1.1.1.4  mrg 	  *__f++ = this->operator()(__urng, __param);
   1799   1.1.1.4  mrg       }
   1800   1.1.1.4  mrg 
   1801   1.1.1.4  mrg   template<std::size_t _Dimen, typename _RealType, typename _CharT,
   1802   1.1.1.4  mrg 	   typename _Traits>
   1803   1.1.1.4  mrg     std::basic_ostream<_CharT, _Traits>&
   1804   1.1.1.4  mrg     operator<<(std::basic_ostream<_CharT, _Traits>& __os,
   1805   1.1.1.4  mrg 	       const __gnu_cxx::uniform_inside_sphere_distribution<_Dimen,
   1806   1.1.1.4  mrg 								_RealType>& __x)
   1807   1.1.1.4  mrg     {
   1808   1.1.1.4  mrg       typedef std::basic_ostream<_CharT, _Traits>  __ostream_type;
   1809   1.1.1.4  mrg       typedef typename __ostream_type::ios_base    __ios_base;
   1810   1.1.1.4  mrg 
   1811   1.1.1.4  mrg       const typename __ios_base::fmtflags __flags = __os.flags();
   1812   1.1.1.4  mrg       const _CharT __fill = __os.fill();
   1813   1.1.1.4  mrg       const std::streamsize __precision = __os.precision();
   1814   1.1.1.4  mrg       const _CharT __space = __os.widen(' ');
   1815   1.1.1.4  mrg       __os.flags(__ios_base::scientific | __ios_base::left);
   1816   1.1.1.4  mrg       __os.fill(__space);
   1817   1.1.1.4  mrg       __os.precision(std::numeric_limits<_RealType>::max_digits10);
   1818   1.1.1.4  mrg 
   1819   1.1.1.4  mrg       __os << __x.radius() << __space << __x._M_uosd;
   1820   1.1.1.4  mrg 
   1821   1.1.1.4  mrg       __os.flags(__flags);
   1822   1.1.1.4  mrg       __os.fill(__fill);
   1823   1.1.1.4  mrg       __os.precision(__precision);
   1824   1.1.1.4  mrg 
   1825   1.1.1.4  mrg       return __os;
   1826   1.1.1.4  mrg     }
   1827   1.1.1.4  mrg 
   1828   1.1.1.4  mrg   template<std::size_t _Dimen, typename _RealType, typename _CharT,
   1829   1.1.1.4  mrg 	   typename _Traits>
   1830   1.1.1.4  mrg     std::basic_istream<_CharT, _Traits>&
   1831   1.1.1.4  mrg     operator>>(std::basic_istream<_CharT, _Traits>& __is,
   1832   1.1.1.4  mrg 	       __gnu_cxx::uniform_inside_sphere_distribution<_Dimen,
   1833   1.1.1.4  mrg 							     _RealType>& __x)
   1834   1.1.1.4  mrg     {
   1835   1.1.1.4  mrg       typedef std::basic_istream<_CharT, _Traits>  __istream_type;
   1836   1.1.1.4  mrg       typedef typename __istream_type::ios_base    __ios_base;
   1837   1.1.1.4  mrg 
   1838   1.1.1.4  mrg       const typename __ios_base::fmtflags __flags = __is.flags();
   1839   1.1.1.4  mrg       __is.flags(__ios_base::dec | __ios_base::skipws);
   1840   1.1.1.4  mrg 
   1841   1.1.1.4  mrg       _RealType __radius_val;
   1842   1.1.1.4  mrg       __is >> __radius_val >> __x._M_uosd;
   1843   1.1.1.4  mrg       __x.param(typename uniform_inside_sphere_distribution<_Dimen, _RealType>::
   1844   1.1.1.4  mrg 		param_type(__radius_val));
   1845   1.1.1.4  mrg 
   1846   1.1.1.4  mrg       __is.flags(__flags);
   1847   1.1.1.4  mrg 
   1848   1.1.1.4  mrg       return __is;
   1849   1.1.1.4  mrg     }
   1850   1.1.1.4  mrg 
   1851       1.1  mrg _GLIBCXX_END_NAMESPACE_VERSION
   1852   1.1.1.4  mrg } // namespace __gnu_cxx
   1853       1.1  mrg 
   1854       1.1  mrg 
   1855       1.1  mrg #endif // _EXT_RANDOM_TCC
   1856