Dedekind 0.0.0
A structuralist C++23 Module Library
Loading...
Searching...
No Matches
mandelbrot.cppm File Reference

Core Mandelbrot recurrence helpers over complex carriers. More...

#include <concepts>
#include <cstddef>
#include <functional>
#include <optional>
#include <type_traits>
#include <utility>
import dedekind.numbers:rational;
import dedekind.sets;
import dedekind.sequences;
import dedekind.geometry;
import dedekind.category;
Include dependency graph for mandelbrot.cppm:

Classes

class  dedekind::numbers::DivergencePath< R >
 The escape signal of a Mandelbrot orbit, tagged as a sequence-shape witness: a monotone {Unknown,True}-valued Path<Ternary> that is structurally absorptive for every parameter c. More...

Namespaces

namespace  dedekind::numbers

Concepts

concept  dedekind::numbers::IsEscapeCriterion
 Escape predicate: ComplexType → bool.

Typedefs

template<IsComplexScalar R>
using dedekind::numbers::OrbitPath = Path<Complex<R>>

Enumerations

enum class  dedekind::numbers::KleenePolicy { Inclusive , Exclusive }

Functions

template<IsComplexScalar R>
constexpr auto dedekind::numbers::euclidean_escape_radius_squared (R escape_radius_squared=R{4})
template<IsComplexScalar R>
constexpr auto dedekind::numbers::mandelbrot_step (const Complex< R > &c)
template<IsComplexScalar R>
constexpr auto dedekind::numbers::mandelbrot_orbit (const Complex< R > &c)
template<IsComplexScalar R, typename EscapeCriterion>
requires IsEscapeCriterion<EscapeCriterion, Complex<R>>
constexpr auto dedekind::numbers::orbit_divergence_path (const OrbitPath< R > &orbit, EscapeCriterion criterion) -> DivergencePath< R >
template<IsComplexScalar R, typename EscapeCriterion>
requires IsEscapeCriterion<EscapeCriterion, Complex<R>>
constexpr std::optional< std::size_t > dedekind::numbers::orbit_escape_time (const OrbitPath< R > &orbit, std::size_t max_iter, const EscapeCriterion &criterion)
template<IsComplexScalar R>
constexpr std::optional< std::size_t > dedekind::numbers::orbit_escape_time (const OrbitPath< R > &orbit, std::size_t max_iter, R escape_radius_squared=R{4})
constexpr bool dedekind::numbers::collapse_ternary (Ternary t, KleenePolicy policy) noexcept
template<IsComplexScalar R, typename EscapeCriterion>
requires IsEscapeCriterion<EscapeCriterion, Complex<R>>
constexpr auto dedekind::numbers::M_kleene_N (std::size_t max_iter, EscapeCriterion criterion)
template<IsComplexScalar R, typename EscapeCriterion>
requires IsEscapeCriterion<EscapeCriterion, Complex<R>>
constexpr auto dedekind::numbers::M_N (std::size_t max_iter, EscapeCriterion criterion, KleenePolicy policy=KleenePolicy::Inclusive)
template<IsComplexScalar R, typename EscapeCriterion>
requires IsEscapeCriterion<EscapeCriterion, Complex<R>>
constexpr auto dedekind::numbers::M_tower (EscapeCriterion criterion, KleenePolicy policy=KleenePolicy::Inclusive)

Variables

template<dedekind::numbers::IsComplexScalar R>
constexpr bool dedekind::sequences::is_absorptive_sequence_v< dedekind::numbers::DivergencePath< R > > = true
 Opt-in: every DivergencePath<R> is absorptive (eventually constant — True after escape, or the degenerate constant Unknown when bounded). The eventual-constancy is structural, holding for all c, so it is a sound type-level registration. See dedekind::numbers::DivergencePath.

Detailed Description

Core Mandelbrot recurrence helpers over complex carriers.

@partition :mandelbrot

Architecture — three layers of the "intensional first" strategy:

Layer 1 (intensional, Kleene, infinite): orbit_divergence_path(orbit(c), criterion) : Path<Ternary> The exact epistemic state at each depth — not fully computable for in-set points, but expressible as a lazy infinite sequence.

Layer 2 (N-step Kleene approximation, computable): M_kleene_N(max_iter, criterion)(c) : Ternary True = escape witnessed within max_iter steps (c is outside M) Unknown = no escape yet (open question: c might be in M or escape later) False = provably bounded (unreachable by finite computation alone)

Layer 3 (Boolean collapse, classical set): M_N(max_iter, criterion, policy)(c) : Set<..., Bool> KleenePolicy::Inclusive => Unknown → in M (outer approx, M_N ⊇ M_true) KleenePolicy::Exclusive => Unknown → not in M (inner approx, M_N ⊆ M_true; ≡ ∅ under finite computation)

Note
"Man muss immer umkehren." ("One must always invert.") – Carl Gustav Jacob Jacobi