/usr/include/linbox/randiter/multimod-randomprime.h is in liblinbox-dev 1.1.6~rc0-4.1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 | /* -*- mode: C++; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
/* linbox/randiter/multimod-randomprime.h
* Copyright (C) 2005 Pascal Giorgi
*
* Written by Pascal Giorgi <pascal.giorgi@ens-lyon.fr>
*
* ------------------------------------
*
* See COPYING for license information.
*/
#ifndef _MULTIMOD_RANDOM_PRIME_H__
#define _MULTIMOD_RANDOM_PRIME_H__
#include <linbox/integer.h>
#include <linbox/util/timer.h>
#include <vector>
namespace LinBox {
class MultiModRandomPrime {
protected:
size_t _bits;
size_t _size;
integer _shift;
public:
MultiModRandomPrime(size_t n=1, size_t bits = 30, unsigned long seed = 0)
: _bits(bits), _size(n)
{
_shift = integer(1)<<_bits;
if (! seed)
MultiModRandomPrime::setSeed( BaseTimer::seed() );
else
MultiModRandomPrime::setSeed( seed );
}
// define the prime type
typedef std::vector<integer> Prime_Type;
/** @memo randomPrime()
* return a vector of random prime
*/
inline Prime_Type randomPrime() const {std::cout<<"ist used\n";
std::vector<integer> tmp(_size);
for (size_t i=0;i<_size; ++i){
do {
integer::random(tmp[i],_bits-1);
tmp[i]= _shift-tmp[i];
nextprime(tmp[i],tmp[i]);
} while (find(tmp.begin(), tmp.begin()+i, tmp[i]) != (tmp.begin()+i ));
}
return tmp;
}
/** @memo randomPrime(Prime_Type& p)
* return a random prime
*/
inline Prime_Type randomPrime (Prime_Type& p) const {
for (size_t i=0;i<p.size(); ++i){
do {
integer::random(p[i],_bits-1);
p[i]= _shift-p[i];
nextprime(p[i],p[i]);
} while (find(p.begin(), p.begin()+i-1, p[i]) != (p.begin()+i-1 ));
}
return p;
}
/** @memo setSeed (unsigned long ul)
* Set the random seed to be ul.
*/
void static setSeed(unsigned long ul) {
integer::seeding(ul);
}
inline Prime_Type createPrimes (const integer& maxPrime, const integer& productBound) const {
Prime_Type tmp;
integer acc=1, cur=maxPrime;
do {
prevprime(cur, cur);
tmp.push_back(cur);
acc*=cur;
} while (acc < productBound);
return tmp;
}
};
}
#endif
|