Loading...
Searching...
No Matches
SymEngine::BasicToUPolyBase< P, V > Class Template Reference
+ Inheritance diagram for SymEngine::BasicToUPolyBase< P, V >:
+ Collaboration diagram for SymEngine::BasicToUPolyBase< P, V >:

Public Types

using D = typename P::container_type
 

Public Member Functions

 BasicToUPolyBase (const RCP< const Basic > &gen_)
 
apply (const Basic &b)
 
void dict_set (unsigned int pow, const Basic &x)
 
void bvisit (const Pow &x)
 
void bvisit (const Add &x)
 
void bvisit (const Mul &x)
 
void bvisit (const Integer &x)
 
template<typename Poly , typename = enable_if_t< ((std::is_base_of<UIntPolyBase<typename P::container_type, P>, P>::value and std::is_base_of< UIntPolyBase<typename Poly::container_type, Poly>, Poly>::value) or (std::is_base_of<URatPolyBase<typename P::container_type, P>, P>::value and (std::is_base_of< UIntPolyBase<typename Poly::container_type, Poly>, Poly>::value or std::is_base_of< URatPolyBase<typename Poly::container_type, Poly>, Poly>::value)) or (std::is_same<P, UExprPoly>::value and std::is_base_of< UPolyBase<typename Poly::container_type, Poly>, Poly>::value)) and not std::is_same<Poly, GaloisField>::value>>
void bvisit (const Poly &x)
 
void bvisit (const Basic &x)
 

Data Fields

RCP< const Basicgen
 
dict
 

Detailed Description

template<typename P, typename V>
class SymEngine::BasicToUPolyBase< P, V >

Definition at line 37 of file basic_conversions.h.

Member Typedef Documentation

◆ D

template<typename P , typename V >
using SymEngine::BasicToUPolyBase< P, V >::D = typename P::container_type

Definition at line 41 of file basic_conversions.h.

Constructor & Destructor Documentation

◆ BasicToUPolyBase()

template<typename P , typename V >
SymEngine::BasicToUPolyBase< P, V >::BasicToUPolyBase ( const RCP< const Basic > &  gen_)
inline

Definition at line 44 of file basic_conversions.h.

45 {
46 gen = gen_;
47 }

Member Function Documentation

◆ apply()

template<typename P , typename V >
D SymEngine::BasicToUPolyBase< P, V >::apply ( const Basic b)
inline

Definition at line 49 of file basic_conversions.h.

50 {
51 b.accept(*this);
52 return std::move(dict);
53 }
T move(T... args)

◆ bvisit() [1/6]

template<typename P , typename V >
void SymEngine::BasicToUPolyBase< P, V >::bvisit ( const Add x)
inline

Definition at line 113 of file basic_conversions.h.

114 {
115 D res = apply(*x.get_coef());
116 for (auto const &it : x.get_dict())
117 res += apply(*it.first) * apply(*it.second);
118 dict = std::move(res);
119 }

◆ bvisit() [2/6]

template<typename P , typename V >
void SymEngine::BasicToUPolyBase< P, V >::bvisit ( const Basic x)
inline

Definition at line 161 of file basic_conversions.h.

162 {
163 RCP<const Basic> genpow = one, genbase = gen, powr;
164 if (is_a<const Pow>(*gen)) {
165 genpow = down_cast<const Pow &>(*gen).get_exp();
166 genbase = down_cast<const Pow &>(*gen).get_base();
167 }
168 if (eq(*genbase, x)) {
169 powr = div(one, genpow);
170 if (is_a<const Integer>(*powr)) {
171 int i = numeric_cast<int>(
172 down_cast<const Integer &>(*powr).as_int());
173 if (i > 0) {
174 dict = P::container_from_dict(
175 gen, {{i, typename P::coef_type(1)}});
176 return;
177 }
178 }
179 }
180 if (is_a<const Symbol>(*gen)) {
181 if (has_symbol(x, *gen)) {
182 throw SymEngineException("Not a Polynomial");
183 }
184 }
185 dict_set(0, x);
186 }
RCP< const Basic > div(const RCP< const Basic > &a, const RCP< const Basic > &b)
Division.
Definition: mul.cpp:431
bool eq(const Basic &a, const Basic &b)
Checks equality for a and b
Definition: basic-inl.h:21

◆ bvisit() [3/6]

template<typename P , typename V >
void SymEngine::BasicToUPolyBase< P, V >::bvisit ( const Integer x)
inline

Definition at line 129 of file basic_conversions.h.

130 {
131 integer_class i = x.as_integer_class();
132 dict = P::container_from_dict(gen, {{0, typename P::coef_type(i)}});
133 }

◆ bvisit() [4/6]

template<typename P , typename V >
void SymEngine::BasicToUPolyBase< P, V >::bvisit ( const Mul x)
inline

Definition at line 121 of file basic_conversions.h.

122 {
123 D res = apply(*x.get_coef());
124 for (auto const &it : x.get_dict())
125 res *= apply(*pow(it.first, it.second));
126 dict = std::move(res);
127 }
T pow(T... args)

◆ bvisit() [5/6]

template<typename P , typename V >
template<typename Poly , typename = enable_if_t< ((std::is_base_of<UIntPolyBase<typename P::container_type, P>, P>::value and std::is_base_of< UIntPolyBase<typename Poly::container_type, Poly>, Poly>::value) or (std::is_base_of<URatPolyBase<typename P::container_type, P>, P>::value and (std::is_base_of< UIntPolyBase<typename Poly::container_type, Poly>, Poly>::value or std::is_base_of< URatPolyBase<typename Poly::container_type, Poly>, Poly>::value)) or (std::is_same<P, UExprPoly>::value and std::is_base_of< UPolyBase<typename Poly::container_type, Poly>, Poly>::value)) and not std::is_same<Poly, GaloisField>::value>>
void SymEngine::BasicToUPolyBase< P, V >::bvisit ( const Poly &  x)
inline

Definition at line 156 of file basic_conversions.h.

157 {
158 dict = (P::from_poly(x))->get_poly();
159 }

◆ bvisit() [6/6]

template<typename P , typename V >
void SymEngine::BasicToUPolyBase< P, V >::bvisit ( const Pow x)
inline

Definition at line 60 of file basic_conversions.h.

61 {
62 if (is_a<const Integer>(*x.get_exp())) {
63 int i = numeric_cast<int>(
64 down_cast<const Integer &>(*x.get_exp()).as_int());
65 if (i > 0) {
66 dict
67 = pow_upoly(*P::from_container(gen, _basic_to_upoly<D, P>(
68 x.get_base(), gen)),
69 i)
70 ->get_poly();
71 return;
72 }
73 }
74
75 RCP<const Basic> genbase = gen, genpow = one, coef = one, tmp;
76 if (is_a<const Pow>(*gen)) {
77 genbase = down_cast<const Pow &>(*gen).get_base();
78 genpow = down_cast<const Pow &>(*gen).get_exp();
79 }
80
81 if (eq(*genbase, *x.get_base())) {
82
83 set_basic expos;
84
85 if (is_a<const Add>(*x.get_exp())) {
86 RCP<const Add> addx = rcp_static_cast<const Add>(x.get_exp());
87 for (auto const &it : addx->get_dict())
88 expos.insert(mul(it.first, it.second));
89 if (not addx->get_coef()->is_zero())
90 expos.insert(addx->get_coef());
91 } else {
92 expos.insert(x.get_exp());
93 }
94
95 int powr = 0;
96 for (auto const &it : expos) {
97 tmp = div(it, genpow);
98 if (is_a<const Integer>(*tmp)) {
99 RCP<const Integer> i = rcp_static_cast<const Integer>(tmp);
100 if (i->is_positive()) {
101 powr = static_cast<int>(i->as_int());
102 continue;
103 }
104 }
105 coef = mul(coef, pow(genbase, it));
106 }
107 dict_set(powr, *coef);
108 } else {
109 this->bvisit((const Basic &)x);
110 }
111 }
RCP< const Basic > mul(const RCP< const Basic > &a, const RCP< const Basic > &b)
Multiplication.
Definition: mul.cpp:352

◆ dict_set()

template<typename P , typename V >
void SymEngine::BasicToUPolyBase< P, V >::dict_set ( unsigned int  pow,
const Basic x 
)
inline

Definition at line 55 of file basic_conversions.h.

56 {
57 down_cast<V *>(this)->dict_set(pow, x);
58 }

Field Documentation

◆ dict

template<typename P , typename V >
D SymEngine::BasicToUPolyBase< P, V >::dict

Definition at line 42 of file basic_conversions.h.

◆ gen

template<typename P , typename V >
RCP<const Basic> SymEngine::BasicToUPolyBase< P, V >::gen

Definition at line 40 of file basic_conversions.h.


The documentation for this class was generated from the following file: