00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033 #ifndef NEWBASECHANGE_H_
00034 #define NEWBASECHANGE_H_
00035
00036 #include "change/base_change.h"
00037 #include "generator/bsgs_random_generator.h"
00038 #include "construct/random_schreier_sims_construction.h"
00039
00040 namespace permlib {
00041
00043 template<class PERM, class TRANS>
00044 class NewBaseChange : public BaseChange<PERM,TRANS> {
00045 public:
00047 NewBaseChange(const BSGS<PERM,TRANS> &bsgs);
00049 ~NewBaseChange();
00050
00052 template <class InputIterator>
00053 void change(BSGS<PERM,TRANS> &bsgs, InputIterator baseBegin, InputIterator baseEnd, bool skipRedundant = false) const;
00054 private:
00055 RandomGenerator<PERM>* rng;
00056 RandomSchreierSimsConstruction<PERM,TRANS> rssc;
00057 };
00058
00059
00060 template<class PERM, class TRANS>
00061 NewBaseChange<PERM,TRANS>::NewBaseChange(const BSGS<PERM,TRANS> &bsgs)
00062 : rng(new BSGSRandomGenerator<PERM,TRANS>(bsgs)),
00063 rssc(bsgs.n, rng, bsgs.order())
00064 { }
00065
00066 template<class PERM, class TRANS>
00067 NewBaseChange<PERM,TRANS>::~NewBaseChange() {
00068 delete rng;
00069 }
00070
00071 template<class PERM, class TRANS>
00072 template <class InputIterator>
00073 void NewBaseChange<PERM,TRANS>::change(BSGS<PERM,TRANS> &bsgs, InputIterator baseBegin, InputIterator baseEnd, bool skipRedundant) const {
00074 bool guarantee = false;
00075 bsgs = rssc.construct(bsgs.S.begin(), bsgs.S.end(), baseBegin, baseEnd, guarantee);
00076 BOOST_ASSERT(guarantee);
00077 }
00078
00079 }
00080
00081 #endif // -- NEWBASECHANGE_H_