00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 #ifndef __MMX_CRT_POLYNOMIAL_HPP
00014 #define __MMX_CRT_POLYNOMIAL_HPP
00015 #include <algebramix/modular_polynomial.hpp>
00016 #include <algebramix/crt_blocks.hpp>
00017 namespace mmx {
00018
00019
00020
00021
00022
00023 struct coprime_moduli_sequence_polynomial {
00024 template<typename C, typename V, typename W, typename Z> static bool
00025 extend (vector<modulus<polynomial<C,V>, W>, Z>& v, nat k) {
00026 static polynomial<C,V> x (C(1), 1);
00027 for (nat i= N(v); i < k; i++) {
00028 if (i != 0 && C (i) == 0) return false;
00029 v << modulus<polynomial<C,V>, W> (x - C (i));
00030 }
00031 return true; }
00032 };
00033
00034 template<typename C, typename V, typename W>
00035 struct coprime_moduli_helper<modulus<polynomial<C,V>, W> > {
00036 typedef coprime_moduli_sequence_polynomial sequence;
00037 };
00038
00039
00040
00041
00042
00043 #define Crt_polynomial_transformer(P)\
00044 crt_blocks_transformer<\
00045 crt_naive_transformer<P>,\
00046 crt_dicho_transformer<P> >
00047
00048 template<typename C, typename V>
00049 struct threshold_helper<polynomial<C,V>,crt_blocks_threshold> {
00050 typedef fixed_value<nat,32> impl;
00051 };
00052
00053 }
00054 #endif // __MMX_CRT_POLYNOMIAL_HPP