1#define _USE_MATH_DEFINES
28 "complex_locus_perpendicular_bisector";
33 const std::string& operation) {
34 auto step =
context.consume_steps(1, operation);
35 if (!step)
return step;
50 const std::string& operation) {
51 auto step =
context.consume_steps(1, operation);
52 if (!step)
return step;
61template <
typename T,
typename F>
64 if constexpr (std::is_same_v<std::invoke_result_t<F>,
Result<T>>) {
69 }
catch (
const std::bad_alloc&) {
71 "symbolic complex allocation failed", operation);
72 }
catch (
const std::exception& ex) {
81 auto va = validate_complex_symbolic(
a,
"a",
context, kComplexAddOperation);
83 auto vb = validate_complex_symbolic(
b,
"b",
context, kComplexAddOperation);
85 auto budget =
context.consume_steps(4, kComplexAddOperation);
87 return checked_construct<ComplexSymbolic>([&]() {
88 return make_complex(SymbolicExpr::add(
a.real,
b.real), SymbolicExpr::add(
a.imag,
b.imag));
89 }, kComplexAddOperation);
98 auto va = validate_complex_symbolic(
a,
"a",
context, kComplexSubOperation);
100 auto vb = validate_complex_symbolic(
b,
"b",
context, kComplexSubOperation);
102 auto budget =
context.consume_steps(6, kComplexSubOperation);
104 return checked_construct<ComplexSymbolic>([&]() {
106 SymbolicExpr::add(
a.real, SymbolicExpr::multiply(SymbolicExpr::number(-1),
b.real)),
107 SymbolicExpr::add(
a.imag, SymbolicExpr::multiply(SymbolicExpr::number(-1),
b.imag)));
108 }, kComplexSubOperation);
117 auto va = validate_complex_symbolic(
a,
"a",
context, kComplexMulOperation);
119 auto vb = validate_complex_symbolic(
b,
"b",
context, kComplexMulOperation);
121 auto budget =
context.consume_steps(10, kComplexMulOperation);
123 return checked_construct<ComplexSymbolic>([&]() {
124 auto real = SymbolicExpr::add(
125 SymbolicExpr::multiply(
a.real,
b.real),
126 SymbolicExpr::multiply(SymbolicExpr::number(-1), SymbolicExpr::multiply(
a.imag,
b.imag)));
127 auto imag = SymbolicExpr::add(SymbolicExpr::multiply(
a.real,
b.imag),
128 SymbolicExpr::multiply(
a.imag,
b.real));
130 }, kComplexMulOperation);
139 auto va = validate_complex_symbolic(
a,
"a",
context, kComplexDivOperation);
141 auto vb = validate_complex_symbolic(
b,
"b",
context, kComplexDivOperation);
147 auto budget =
context.consume_steps(16, kComplexDivOperation);
149 return checked_construct<ComplexSymbolic>([&]() {
150 auto denom = SymbolicExpr::add(SymbolicExpr::power(
b.real, SymbolicExpr::number(2)),
151 SymbolicExpr::power(
b.imag, SymbolicExpr::number(2)));
152 auto real = SymbolicExpr::divide(
153 SymbolicExpr::add(SymbolicExpr::multiply(
a.real,
b.real), SymbolicExpr::multiply(
a.imag,
b.imag)),
155 auto imag = SymbolicExpr::divide(
156 SymbolicExpr::add(SymbolicExpr::multiply(
a.imag,
b.real),
157 SymbolicExpr::multiply(SymbolicExpr::number(-1),
158 SymbolicExpr::multiply(
a.real,
b.imag))),
161 }, kComplexDivOperation);
169 auto vz = validate_complex_symbolic(z,
"z",
context, kComplexConjOperation);
171 auto budget =
context.consume_steps(3, kComplexConjOperation);
173 return checked_construct<ComplexSymbolic>([&]() {
175 }, kComplexConjOperation);
183 auto vz = validate_complex_symbolic(z,
"z",
context, kComplexAbsOperation);
185 auto budget =
context.consume_steps(8, kComplexAbsOperation);
187 return checked_construct<std::shared_ptr<SymbolicExpr>>([&]() {
188 return SymbolicExpr::sqrt(SymbolicExpr::add(
189 SymbolicExpr::power(z.
real, SymbolicExpr::number(2)),
190 SymbolicExpr::power(z.
imag, SymbolicExpr::number(2))));
191 }, kComplexAbsOperation);
199 auto vz = validate_complex_symbolic(z,
"z",
context, kComplexArgOperation);
201 auto budget =
context.consume_steps(4, kComplexArgOperation);
203 return checked_construct<std::shared_ptr<SymbolicExpr>>([&]() {
204 return SymbolicExpr::atan2(z.
imag, z.
real);
205 }, kComplexArgOperation);
213 std::shared_ptr<SymbolicExpr> theta,
215 auto vr = validate_expr(
r,
"r",
context, kComplexPolarOperation);
217 auto vt = validate_expr(theta,
"theta",
context, kComplexPolarOperation);
219 auto budget =
context.consume_steps(6, kComplexPolarOperation);
221 return checked_construct<ComplexSymbolic>([&]() {
222 auto real = SymbolicExpr::multiply(
r, SymbolicExpr::cos(theta));
223 auto imag = SymbolicExpr::multiply(
r, SymbolicExpr::sin(theta));
225 }, kComplexPolarOperation);
228 std::shared_ptr<SymbolicExpr> theta) {
234 std::shared_ptr<SymbolicExpr> theta,
239 std::shared_ptr<SymbolicExpr> theta) {
246 auto vc = validate_expr(
c,
"c",
context, kComplexNthRootOperation);
252 auto budget =
context.consume_steps(
static_cast<std::size_t
>(n) * 8 + 8,
253 kComplexNthRootOperation);
256 const auto number = std::dynamic_pointer_cast<const NumberNode>(
detail::node(
c));
260 "checked complex nth roots require a real numeric input",
261 kComplexNthRootOperation);
264 return checked_construct<std::vector<ComplexSymbolic>>(
266 const Rational
value = std::holds_alternative<BigInt>(number->value())
267 ? Rational(std::get<BigInt>(number->value()))
268 : std::get<Rational>(number->value());
269 auto radius = SymbolicExpr::power(
271 SymbolicExpr::number(Rational(1, n)));
274 std::vector<ComplexSymbolic>
roots;
275 roots.reserve(
static_cast<std::size_t
>(n));
276 for (
int k = 0; k < n; ++k) {
277 auto angle = SymbolicExpr::multiply(
278 SymbolicExpr::number(
279 Rational(BigInt(2) * BigInt(k) +
280 BigInt(
value < Rational(0) ? 1 : 0), BigInt(n))),
286 roots.push_back(std::move(root.value()));
289 }, kComplexNthRootOperation);
297 std::shared_ptr<SymbolicExpr>
a, std::shared_ptr<SymbolicExpr>
b,
301 return checked_construct<std::vector<ComplexSymbolic>>(
303 return std::vector<ComplexSymbolic>{
306 }, kComplexQuadraticOperation);
310 std::shared_ptr<SymbolicExpr>
a, std::shared_ptr<SymbolicExpr>
b,
311 std::shared_ptr<SymbolicExpr>
c) {
314 std::move(
a), std::move(
b), std::move(
c),
context);
320 auto va = validate_complex_symbolic(
321 a,
"a",
context, kComplexLocusCircleOperation);
323 auto vr = validate_expr(
r,
"r",
context, kComplexLocusCircleOperation);
328 kComplexLocusCircleOperation);
330 return checked_construct<std::shared_ptr<SymbolicExpr>>(
332 auto z = SymbolicExpr::variable(
z_var);
343 return SymbolicExpr::eq(magnitude.value(),
r);
344 }, kComplexLocusCircleOperation);
349 const std::string&
z_var) {
357 auto va = validate_complex_symbolic(
358 a,
"a",
context, kComplexLocusBisectorOperation);
360 auto vb = validate_complex_symbolic(
361 b,
"b",
context, kComplexLocusBisectorOperation);
366 kComplexLocusBisectorOperation);
368 return checked_construct<std::shared_ptr<SymbolicExpr>>(
370 auto z = SymbolicExpr::variable(
z_var);
387 return SymbolicExpr::eq(distance_a.value(), distance_b.value());
388 }, kComplexLocusBisectorOperation);
393 const std::string&
z_var) {
static Result failure(CasErrc code, std::string message, std::string operation={})
static Result success(T value)
virtual bool is_zero() const
constexpr const char * kComplexLocusBisectorOperation
constexpr const char * kComplexConjOperation
constexpr const char * kComplexMulOperation
Result< void > validate_complex_symbolic(const ComplexSymbolic &z, const char *name, ComputationContext &context, const std::string &operation)
Result< void > validate_expr(const std::shared_ptr< SymbolicExpr > &expr, const char *name, ComputationContext &context, const std::string &operation)
constexpr const char * kComplexLocusCircleOperation
constexpr const char * kComplexQuadraticOperation
constexpr const char * kComplexNthRootOperation
Result< T > checked_construct(F &&f, const std::string &operation)
constexpr const char * kComplexDivOperation
constexpr const char * kComplexAbsOperation
constexpr const char * kComplexPolarOperation
constexpr const char * kComplexSubOperation
constexpr const char * kComplexAddOperation
constexpr const char * kComplexArgOperation
std::shared_ptr<::LMCAS::SymbolicExpr > make_expression_ptr(SymbolicNodePtr root)
const SymbolicNodePtr & node(const ::LMCAS::SymbolicExpr &expression) noexcept
Result< CartesianQuadraticRoots > real_quadratic_roots_checked(const std::shared_ptr< SymbolicExpr > &a, const std::shared_ptr< SymbolicExpr > &b, const std::shared_ptr< SymbolicExpr > &c, ComputationContext &context)
std::shared_ptr< const Node > make_node(Args &&... args)
ComplexSymbolicResult complex_div_checked(const ComplexSymbolic &a, const ComplexSymbolic &b, ComputationContext &context)
ExpressionResult complex_abs_checked(const ComplexSymbolic &z, ComputationContext &context)
__attribute__((visibility("default"))) ComplexSymbolicResult complex_exp_form_checked(std __attribute__((visibility("default"))) ComplexSymbolicResult complex_exp_form_checked(std __attribute__((visibility("default"))) ComplexSymbolicResult complex_trig_form_checked(std __attribute__((visibility("default"))) ComplexSymbolicResult complex_trig_form_checked(std __attribute__((visibility("default"))) ComplexRootsResult solve_complex_nth_root_checked(std __attribute__((visibility("default"))) ComplexRootsResult solve_complex_nth_root_checked(std __attribute__((visibility("default"))) ComplexRootsResult solve_complex_quadratic_checked(std __attribute__((visibility("default"))) ComplexRootsResult solve_complex_quadratic_checked(std std::shared_ptr< SymbolicExpr > r
const std::vector< Polynomial< BigInt > > const BigInt ComputationContext & context
ComplexRootsResult solve_complex_quadratic_checked(std::shared_ptr< SymbolicExpr > a, std::shared_ptr< SymbolicExpr > b, std::shared_ptr< SymbolicExpr > c, ComputationContext &context)
ExprResult real(const ExprPtr &expression, ComputationContext &context)
ExpressionResult complex_locus_perpendicular_bisector_checked(const ComplexSymbolic &a, const ComplexSymbolic &b, const std::string &z_var, ComputationContext &context)
const VectorField const VectorField & c
ComplexSymbolicResult complex_sub_checked(const ComplexSymbolic &a, const ComplexSymbolic &b, ComputationContext &context)
ComplexSymbolic make_complex(std::shared_ptr< SymbolicExpr > real, std::shared_ptr< SymbolicExpr > imag)
构造符号复数
Result< std::shared_ptr< SymbolicExpr > > ExpressionResult
Result of an operation that produces a symbolic expression.
ComplexRootsResult solve_complex_nth_root_checked(std::shared_ptr< SymbolicExpr > c, int n, ComputationContext &context)
ComplexSymbolicResult complex_conj_checked(const ComplexSymbolic &z, ComputationContext &context)
__attribute__((visibility("default"))) VectorCalculusExprResult curve_integral_scalar_checked(const std __attribute__((visibility("default"))) VectorCalculusExprResult curve_integral_scalar_checked(const std __attribute__((visibility("default"))) std const VectorField const std::string const std::shared_ptr< SymbolicExpr > & a
ExpressionResult complex_locus_circle_checked(const ComplexSymbolic &a, std::shared_ptr< SymbolicExpr > r, const std::string &z_var, ComputationContext &context)
ComplexSymbolicResult complex_add_checked(const ComplexSymbolic &a, const ComplexSymbolic &b, ComputationContext &context)
Result< ComplexSymbolic > ComplexSymbolicResult
std::shared_ptr< SymbolicExpr > real
实部
ComplexSymbolicResult complex_trig_form_checked(std::shared_ptr< SymbolicExpr > r, std::shared_ptr< SymbolicExpr > theta, ComputationContext &context)
ComplexSymbolicResult complex_exp_form_checked(std::shared_ptr< SymbolicExpr > r, std::shared_ptr< SymbolicExpr > theta, ComputationContext &context)
std::shared_ptr< SymbolicExpr > imag
虚部
ExprSetResult roots(const ExprPtr &expression, const std::string &variable, ComputationContext &context, const SolveOptions &options)
ComplexSymbolicResult complex_mul_checked(const ComplexSymbolic &a, const ComplexSymbolic &b, ComputationContext &context)
const std::string const ExprPtr & value
ExpressionResult complex_arg_checked(const ComplexSymbolic &z, ComputationContext &context)
Result< std::vector< ComplexSymbolic > > ComplexRootsResult
__attribute__((visibility("default"))) Result< EqvProfile > eqv_profile_from_name(const std const std::string & name
__attribute__((visibility("default"))) ComplexSymbolicResult complex_exp_form_checked(std __attribute__((visibility("default"))) ComplexSymbolicResult complex_exp_form_checked(std __attribute__((visibility("default"))) ComplexSymbolicResult complex_trig_form_checked(std __attribute__((visibility("default"))) ComplexSymbolicResult complex_trig_form_checked(std __attribute__((visibility("default"))) ComplexRootsResult solve_complex_nth_root_checked(std __attribute__((visibility("default"))) ComplexRootsResult solve_complex_nth_root_checked(std __attribute__((visibility("default"))) ComplexRootsResult solve_complex_quadratic_checked(std __attribute__((visibility("default"))) ComplexRootsResult solve_complex_quadratic_checked(std std::shared_ptr< SymbolicExpr > const std::string & z_var
符号表达式主类 SymbolicExpr 及其工厂方法,运算接口.
符号复数运算:加减乘除、共轭、模、辐角、极坐标形式。