NO DOC.
#include <iostream>
#include <algorithm>
#include <givaro/givtimer.h>
#include <givaro/givpoly1crt.h>
#include <givaro/givintprime.h>
#include <givaro/montgomery.h>
#include <givaro/extension.h>
#include <givaro/modular.h>
#include <givaro/gfq.h>
#include <givaro/chineseremainder.h>
#include <givaro/givrns.h>
#include <givaro/givrandom.h>
#include <givaro/qfield.h>
template <typename Field>
bool pass = true;
typedef typename CRTSystem::Element Poly;
typedef typename CRTSystem::array_T VScal;
Integer a( generator() >>(argc>2?atoi(argv[2]):17) );
VScal Primes( argc>1 ? (size_t)atoi(argv[1]):15);
VScal Moduli( Primes.size() );
typename VScal::iterator i = Primes.begin();
typename VScal::iterator e = Moduli.begin();
for(; i != Primes.end(); ++i, ++e) {
do {
}
while ( (std::find(Primes.begin(), i, *i) != i) || (F.
isZero(*i))) ;
}
CRTSystem CRT( F, Primes, "X" );
Poly res;
CRT.RnsToRing( res, Moduli );
F.
write( std::cerr << tim <<
" using ") << std::endl;
if (Primes.size() < 14) {
i = Primes.begin();
e = Moduli.begin();
for( ; i != Primes.end(); ++i, ++e)
F.
write(CRT.getpolydom().write(F.
write(std::cout <<
"subs(X=", *i) <<
",", res) <<
") mod " << F.
characteristic() <<
" = ", *e) <<
';' << std::endl;
else
F.
write(CRT.getpolydom().write(F.
write(std::cout <<
"subs(X=", *i) <<
",", res) <<
") = ", *e) <<
';' << std::endl;
}
VScal Verifs( Primes.size() );
CRT.RingToRns( Verifs, res );
typename VScal::const_iterator v = Verifs.begin();
e = Moduli.begin();
for( ; e != Moduli.end(); ++e, ++v)
F.
write(std::cerr <<
"incoherency within ") << std::endl;
F.
write(std::cerr <<
"e: ", *e ) << std::endl;
F.
write(std::cerr <<
"v: ", *v ) << std::endl;
pass = false;
break;
}
CRT.getpolydom().random(generator, res,
Degree((int64_t)Primes.size()-1));
CRT.RingToRns( Verifs, res );
Poly nres;
CRT.RnsToRing( nres, Verifs );
if (! CRT.getpolydom().areEqual(res,nres) ) {
CRT.getpolydom().write(std::cerr << "incoherency within ") << std::endl;
CRT.getpolydom().write(std::cerr << "r: ", res ) << std::endl;
CRT.getpolydom().write(std::cerr << "n: ", nres ) << std::endl;
pass = false;
}
F.
write( std::cerr << tim <<
" using ") << std::endl;
return pass;
}
template <typename Field>
bool pass = true;
typedef typename CRTSystem::Element Poly;
typedef typename CRTSystem::array_T VScal;
Integer a( generator() >>(argc>2?atoi(argv[2]):17) );
VScal Primes( argc>1 ? (size_t)atoi(argv[1]):15);
VScal Moduli( Primes.size() );
typename VScal::iterator i = Primes.begin();
typename VScal::iterator e = Moduli.begin();
for(; i != Primes.end(); ++i, ++e) {
F.init(*i); F.init(*e);
do {
F.random(generator,*i);
} while ( (std::find(Primes.begin(), i, *i) != i) || (F.isZero(*i))) ;
F.random(generator,*e);
}
for(typename VScal::const_iterator it=Primes.begin(); it!=Primes.end();++it)
F.write(std::cout, *it) << std::endl;
for(typename VScal::const_iterator it=Moduli.begin(); it!=Moduli.end();++it)
F.write(std::cout, *it) << std::endl;
CRTSystem CRT( F, Primes, "X" );
Poly res;
CRT.RnsToRing( res, Moduli );
F.write( std::cerr << tim << " using ") << std::endl;
if (Primes.size() < 14) {
i = Primes.begin();
e = Moduli.begin();
for( ; i != Primes.end(); ++i, ++e)
if (F.characteristic()>0)
F.write(CRT.getpolydom().write(F.write(std::cout << "subs(X=", *i) << ",", res) << ") mod " << F.characteristic() << " = ", *e) << ';' << std::endl;
else
F.write(CRT.getpolydom().write(F.write(std::cout << "subs(X=", *i) << ",", res) << ") = ", *e) << ';' << std::endl;
}
VScal Verifs( Primes.size() );
CRT.RingToRns( Verifs, res );
typename VScal::const_iterator v = Verifs.begin();
e = Moduli.begin();
for( ; e != Moduli.end(); ++e, ++v)
if (! F.areEqual(*e, *v) ) {
F.write(std::cerr << "incoherency within ") << std::endl;
F.write(std::cerr << "e: ", *e ) << std::endl;
F.write(std::cerr << "v: ", *v ) << std::endl;
pass = false;
break;
}
CRT.getpolydom().random(generator, res,
Degree((int64_t)Primes.size()-1));
CRT.RingToRns( Verifs, res );
Poly nres;
CRT.RnsToRing( nres, Verifs );
if (! CRT.getpolydom().areEqual(res,nres) ) {
CRT.getpolydom().write(std::cerr << "incoherency within ") << std::endl;
CRT.getpolydom().write(std::cerr << "r: ", res ) << std::endl;
CRT.getpolydom().write(std::cerr << "n: ", nres ) << std::endl;
pass = false;
}
F.write( std::cerr << tim << " using ") << std::endl;
return pass;
}
int main(
int argc,
char ** argv) {
uint64_t seed = seedor.seed();
std::cerr << "seed: " << seed << std::endl;
return
;
}
bool tmainext(int argc, char **argv, GivRandom &generator)
Definition PolynomialCRT.C:126
Extension Field10
Definition PolynomialCRT.C:42
Modular< int64_t > Field5
Definition PolynomialCRT.C:35
bool tmain(int argc, char **argv, GivRandom &generator)
Definition PolynomialCRT.C:45
GFqDom< int64_t > Field1
Definition PolynomialCRT.C:31
Modular< int32_t > Field4
Definition PolynomialCRT.C:34
Modular< int16_t > Field2
Definition PolynomialCRT.C:32
Montgomery< int32_t > Field7
Definition PolynomialCRT.C:37
Modular< Integer > Field9
Definition PolynomialCRT.C:39
Modular< Log16 > Field3
Definition PolynomialCRT.C:33
QField< Rational > Field8
Definition PolynomialCRT.C:38
Modular< uint32_t > Field6
Definition PolynomialCRT.C:36
static int64_t seed()
Definition givtimer.C:30
Degree type for polynomials.
Definition givdegree.h:28
Extension.
Definition extension.h:79
class GFqDom
Definition gfq.h:44
UTT characteristic() const
Definition gfq.inl:224
Rep & init(Rep &r) const
Definition gfq.h:204
bool isZero(const Rep a) const
Definition gfq.inl:280
std::ostream & write(std::ostream &s) const
Definition gfq.inl:606
bool areEqual(const Rep a, const Rep b) const
Definition gfq.inl:272
GivRandom.
Definition givrandom.h:37
Primality tests.
Definition givintprime.h:67
Rep & nextprimein(Rep &, int r=_GIVARO_ISPRIMETESTS_) const
Definition givintprime.C:60
This is the Integer class.
Definition gmp++_int.h:160
static void seeding(uint64_t s)
Random numbers (no doc)
Definition gmp++_int_rand.inl:44
Forward declaration for Givaro::Modular.
Definition modular-inttype.h:38
Definition montgomery-int32.h:33
Poly1 CRT.
Definition givpoly1crt.h:26
Timer.
Definition givtimer.h:129
void start()
Start timer.
Definition givtimer.C:164
void stop()
Stop timer.
Definition givtimer.C:172
void clear()
Clear timer.
Definition givtimer.C:155
int main()
Definition f4n3.cpp:22
Givaro::GFqDom< int64_t > Field
Definition f4n3.cpp:11
Namespace in which the whole Givaro library resides.
Definition all_field.C:23