Oakfield API Documentation 1.0.0
Numerical core APIs
Loading...
Searching...
No Matches
special_functions.h
Go to the documentation of this file.
1
26#ifndef SIM_MATH_SPECIAL_FUNCTIONS_H
27#define SIM_MATH_SPECIAL_FUNCTIONS_H
28
29#include <complex.h>
30#include <stdbool.h>
31#include <stddef.h>
32#include <stdint.h>
33
34#include "oakfield/field.h" /* expected to define SimComplexDouble; we provide fallbacks below */
35
36/* Compile-time diagnostics toggle: enable lightweight sampling of
37 * special-function health metrics (reflection usage, Stirling tails, etc.).
38 * Can be overridden by defining SIM_DIAGNOSTICS at compile time. */
39#ifndef SIM_DIAGNOSTICS
40#define SIM_DIAGNOSTICS 0
41#endif
42
43#ifdef __cplusplus
44extern "C" {
45#endif
46
47#ifndef SIM_HAVE_SIMCOMPLEXFLOAT
49typedef struct {
50 float re, im;
52#endif
53
54#ifndef SIM_HAVE_SIMCOMPLEXDOUBLE
56typedef struct {
57 double re, im;
59#endif
60
71
72#ifndef SIM_DIGAMMA_SQUARE_DEFORMATION_DEFAULT
73#define SIM_DIGAMMA_SQUARE_DEFORMATION_DEFAULT 0.25
74#endif
75
76/*==============================================================================
77 * DIGAMMA (psi)
78 *============================================================================*/
79
85double sim_digamma_f64_12(double x);
86double sim_digamma_f64_7(double x);
87double sim_digamma_f64_5(double x);
91float sim_digamma_f32_12(float x);
92float sim_digamma_f32_7(float x);
93float sim_digamma_f32_5(float x);
94
96SimComplexDouble sim_digamma_c64_12(SimComplexDouble z);
97SimComplexDouble sim_digamma_c64_7(SimComplexDouble z);
98SimComplexDouble sim_digamma_c64_5(SimComplexDouble z);
99
101SimComplexFloat sim_digamma_c32_12(SimComplexFloat z);
102SimComplexFloat sim_digamma_c32_7(SimComplexFloat z);
103SimComplexFloat sim_digamma_c32_5(SimComplexFloat z);
104
110SimComplexFloat sim_digamma_c32_mortici(SimComplexFloat z);
111
118double sim_digamma_f64_tail(double x, double tol);
119
126
134double sim_digamma_f64_mortici(double x);
135
138
139/* Backward-compatible aliases matching your current API (default = 12-tail, double): */
140double sim_special_digamma(double x);
141SimComplexDouble sim_special_digamma_complex(SimComplexDouble z);
142
143/*==============================================================================
144 * DIGAMMA WAVEFORM HELPERS (SQUARE)
145 *============================================================================*/
146
154double sim_digamma_square_base_real(double amplitude,
155 double inner_radians,
156 SimDigammaBackend backend,
157 double tolerance);
158
166 double a,
167 double inner_radians,
168 SimDigammaBackend backend,
169 double tolerance);
170
171SimComplexDouble sim_digamma_square_base_complex(double amplitude,
172 SimComplexDouble inner_radians,
173 SimDigammaBackend backend,
174 double tolerance);
175
176SimComplexDouble sim_digamma_square_base_deformed_complex(double amplitude,
177 double a,
178 SimComplexDouble inner_radians,
179 SimDigammaBackend backend,
180 double tolerance);
181
182/*==============================================================================
183 * TRIGAMMA (psi_1)
184 *============================================================================*/
185
187double sim_trigamma_f64_12(double x);
188double sim_trigamma_f64_7(double x);
189double sim_trigamma_f64_5(double x);
190
192float sim_trigamma_f32_12(float x);
193float sim_trigamma_f32_7(float x);
194float sim_trigamma_f32_5(float x);
195
197SimComplexDouble sim_trigamma_c64_12(SimComplexDouble z);
198SimComplexDouble sim_trigamma_c64_7(SimComplexDouble z);
199SimComplexDouble sim_trigamma_c64_5(SimComplexDouble z);
200
202SimComplexFloat sim_trigamma_c32_12(SimComplexFloat z);
203SimComplexFloat sim_trigamma_c32_7(SimComplexFloat z);
204SimComplexFloat sim_trigamma_c32_5(SimComplexFloat z);
205
211double sim_trigamma_f64_tail(double x, double tol);
212
219
225
228
229#define sim_digamma_f64_speedy sim_digamma_f64_mortici
230#define sim_digamma_f32_speedy sim_digamma_f32_mortici
231#define sim_trigamma_f64_speedy sim_trigamma_f64_mortici
232#define sim_trigamma_f32_speedy sim_trigamma_f32_mortici
233
234/* Backward-compatible aliases matching your current API (default = 12-tail, double): */
235double sim_special_trigamma(double x);
236SimComplexDouble sim_special_trigamma_complex(SimComplexDouble z);
237
238/*==============================================================================
239 * TETRAGAMMA (psi_2)
240 *============================================================================*/
241
243double sim_tetragamma_f64_12(double x);
244double sim_tetragamma_f64_7(double x);
245double sim_tetragamma_f64_5(double x);
246
248float sim_tetragamma_f32_12(float x);
249float sim_tetragamma_f32_7(float x);
250float sim_tetragamma_f32_5(float x);
251
253SimComplexDouble sim_tetragamma_c64_12(SimComplexDouble z);
254SimComplexDouble sim_tetragamma_c64_7(SimComplexDouble z);
255SimComplexDouble sim_tetragamma_c64_5(SimComplexDouble z);
256
258SimComplexFloat sim_tetragamma_c32_12(SimComplexFloat z);
259SimComplexFloat sim_tetragamma_c32_7(SimComplexFloat z);
260SimComplexFloat sim_tetragamma_c32_5(SimComplexFloat z);
261
262/* Backward-compatible aliases */
263double sim_special_tetragamma(double x);
264SimComplexDouble sim_special_tetragamma_complex(SimComplexDouble z);
265
266/*==============================================================================
267 * GENERALIZED HARMONIC NUMBERS (MGHN CORE)
268 *============================================================================*/
269
278double sim_ghn_HK(double a, int K);
279
281double sim_ghn_HK_d1(double a, int K);
282
284double sim_ghn_HK_d2(double a, int K);
285
288
291
294
295/*==============================================================================
296 * FINITE LADDER φ AND q-DEFORMED φ
297 *============================================================================*/
298
305double sim_hyperexp_phi(double lambda, double epsilon, int K);
306
308double sim_hyperexp_phi_deriv(double lambda, double epsilon, int K);
309
312
322double sim_qhyperexp_phi(double lambda, double epsilon, int K, double q);
323double sim_qhyperexp_phi_deriv(double lambda, double epsilon, int K, double q);
324
335sim_qhyperexp_phi_deriv_complex(SimComplexDouble lambda, SimComplexDouble epsilon, int K, double q);
336
337/*==============================================================================
338 * Q-ANALOGS
339 *============================================================================*/
340
349double sim_q_number(double x, double q);
350
353
358double sim_q_zeta(double s, double a, double q);
359
361double sim_q_digamma(double x, double q);
362
365
366#if SIM_DIAGNOSTICS
374typedef struct SimSpecialDiagnosticsSnapshot {
375 uint64_t reflection_count;
376 uint64_t recurrence_shift_samples;
377 double max_recurrence_shift;
378 uint64_t stirling_tail_samples;
379 double max_stirling_tail;
380 uint64_t pole_proximity_samples;
381 double min_pole_distance;
382} SimSpecialDiagnosticsSnapshot;
383
390void sim_special_diagnostics_snapshot(SimSpecialDiagnosticsSnapshot* out, bool reset);
391#endif
392
403
418
420typedef SimResult (*SimSpecialFallbackFn)(void* userdata,
421 const SimSpecialEvalReport* report,
422 SimComplexDouble* value_out);
423
426
428SimResult sim_digamma_safe(double x,
429 SimSpecialFallbackFn fallback,
430 void* userdata,
431 SimSpecialEvalReport* report,
432 double* out_value);
433
434SimResult sim_trigamma_safe(double x,
435 SimSpecialFallbackFn fallback,
436 void* userdata,
437 SimSpecialEvalReport* report,
438 double* out_value);
439
440SimResult sim_tetragamma_safe(double x,
441 SimSpecialFallbackFn fallback,
442 void* userdata,
443 SimSpecialEvalReport* report,
444 double* out_value);
445
446SimResult sim_hyperexp_phi_safe(double lambda,
447 double epsilon,
448 int K,
449 SimSpecialFallbackFn fallback,
450 void* userdata,
451 SimSpecialEvalReport* report,
452 double* out_value);
453
454SimResult sim_hyperexp_phi_deriv_safe(double lambda,
455 double epsilon,
456 int K,
457 SimSpecialFallbackFn fallback,
458 void* userdata,
459 SimSpecialEvalReport* report,
460 double* out_value);
461
463SimResult sim_q_number_safe(double x,
464 double q,
465 SimSpecialFallbackFn fallback,
466 void* userdata,
467 SimSpecialEvalReport* report,
468 double* out_value);
469
470SimResult sim_q_number_complex_safe(SimComplexDouble z,
471 double q,
472 SimSpecialFallbackFn fallback,
473 void* userdata,
474 SimSpecialEvalReport* report,
475 SimComplexDouble* out_value);
476
478SimResult sim_q_zeta_safe(double s,
479 double a,
480 double q,
481 SimSpecialFallbackFn fallback,
482 void* userdata,
483 SimSpecialEvalReport* report,
484 double* out_value);
485
487SimResult sim_q_digamma_safe(double x,
488 double q,
489 SimSpecialFallbackFn fallback,
490 void* userdata,
491 SimSpecialEvalReport* report,
492 double* out_value);
493
494SimResult sim_q_digamma_complex_safe(SimComplexDouble z,
495 double q,
496 SimSpecialFallbackFn fallback,
497 void* userdata,
498 SimSpecialEvalReport* report,
499 SimComplexDouble* out_value);
500
501/*==============================================================================
502 * OPTIONAL ARBITRARY PRECISION (MPFR/MPC)
503 *============================================================================*/
504
505#ifdef SIM_HAVE_MPFR
506#include <mpfr.h>
515void sim_digamma_mpfr(mpfr_t y, const mpfr_t x, const mpfr_t tol);
516
518void sim_trigamma_mpfr(mpfr_t y, const mpfr_t x, const mpfr_t tol);
519
520#ifdef SIM_HAVE_MPC
521#include <mpc.h>
523void sim_digamma_mpc(mpc_t y, const mpc_t z, const mpfr_t tol);
525void sim_trigamma_mpc(mpc_t y, const mpc_t z, const mpfr_t tol);
526#endif
527#endif /* SIM_HAVE_MPFR */
528
529#ifdef __cplusplus
530}
531#endif
532#endif /* SIM_MATH_SPECIAL_FUNCTIONS_H */
Multidimensional contiguous field abstraction with configurable layout.
SimResult
Return codes shared by libsimcore modules.
Definition field.h:29
double sim_digamma_square_base_real(double amplitude, double inner_radians, SimDigammaBackend backend, double tolerance)
Legacy digamma-square base with the quarter-shift deformation.
SimComplexDouble sim_qhyperexp_phi_complex(SimComplexDouble lambda, SimComplexDouble epsilon, int K, double q)
Experimental complex q-φ and derivative.
SimComplexDouble sim_digamma_c64_mortici(SimComplexDouble z)
Speedy Mortici-style digamma (complex, double).
SimComplexDouble sim_ghn_HK_d1_complex(SimComplexDouble a, int K)
Complex first derivative using trigamma difference.
double sim_q_digamma(double x, double q)
Experimental q-digamma ψ_q(z) with analytic continuation via Jackson series.
double sim_ghn_HK(double a, int K)
Generalized harmonic ladder H_K(a) = Σ_{k=0}^{K-1} 1/(a+k).
double sim_hyperexp_phi_deriv(double lambda, double epsilon, int K)
∂φ/∂λ = [ψ(λ+ε+K) − ψ(λ+ε)] + λ[ψ₁(λ+ε+K) − ψ₁(λ+ε)].
double sim_ghn_HK_d1(double a, int K)
First derivative H'_K(a) = ψ₁(a+K) − ψ₁(a). (Negative for a>0,K>0.)
double sim_trigamma_f64_mortici(double x)
Speedy trigamma (real, double): ψ₁(x) ≈ 1/x + 1/(2x²) + 1/(6x³) for x>0, with reflection+recurrence e...
SimComplexDouble sim_digamma_c64_tail(SimComplexDouble z, double tol)
Complex digamma with adaptive tail.
double sim_digamma_f64_tail(double x, double tol)
Digamma with adaptive tail: run Bernoulli series until |next term| < tol.
double sim_q_number(double x, double q)
Experimental Jackson q-number [x]_q = (1 - q^x) / (1 - q) with stable q→1 limit.
SimComplexDouble sim_q_digamma_complex(SimComplexDouble z, double q)
Experimental complex q-digamma ψ_q(z) for SimComplexDouble argument.
double sim_q_zeta(double s, double a, double q)
Experimental q-zeta (Hurwitz-style) ζ_q(s, a) = Σ_{n>=0} q^{(n+a)(s-1)} / [n+a]_q^s.
double sim_qhyperexp_phi(double lambda, double epsilon, int K, double q)
q-deformed φ_q(λ,ε;K,q) := Σ_{k=0}^{K-1} λ / (λ + ε q^k).
SimDigammaBackend
Backend choice for digamma/trigamma evaluation.
Definition special_functions.h:64
@ SIM_DIGAMMA_BACKEND_5_TAIL
Definition special_functions.h:67
@ SIM_DIGAMMA_BACKEND_7_TAIL
Definition special_functions.h:66
@ SIM_DIGAMMA_BACKEND_ADAPTIVE
Definition special_functions.h:68
@ SIM_DIGAMMA_BACKEND_12_TAIL
Definition special_functions.h:65
@ SIM_DIGAMMA_BACKEND_MORTICI
Definition special_functions.h:69
SimComplexDouble sim_ghn_HK_d2_complex(SimComplexDouble a, int K)
Complex second derivative using tetragamma difference.
SimComplexDouble sim_ghn_HK_complex(SimComplexDouble a, int K)
Complex generalized harmonic ladder using ψ difference.
double sim_digamma_f64_mortici(double x)
Speedy Mortici-style digamma (real, double).
const char * sim_special_fault_name(SimSpecialFault fault)
Convert a fault enum to a human-readable string.
SimSpecialFault
Fault categories for special-function helpers when evaluation fails.
Definition special_functions.h:396
@ SIM_SPECIAL_FAULT_NONE
Definition special_functions.h:397
@ SIM_SPECIAL_FAULT_SINGULARITY
Definition special_functions.h:399
@ SIM_SPECIAL_FAULT_ITERATION_LIMIT
Definition special_functions.h:400
@ SIM_SPECIAL_FAULT_DOMAIN
Definition special_functions.h:398
@ SIM_SPECIAL_FAULT_NUMERIC
Definition special_functions.h:401
double sim_digamma_square_base_deformed_real(double amplitude, double a, double inner_radians, SimDigammaBackend backend, double tolerance)
Deformable digamma-square base using notebook-style shift parameter a.
SimComplexDouble sim_hyperexp_phi_complex(SimComplexDouble lambda, SimComplexDouble epsilon, int K)
Complex φ using the same ψ-difference identity.
float sim_trigamma_f32_mortici(float x)
Speedy trigamma (real, float).
SimComplexDouble sim_trigamma_c64_tail(SimComplexDouble z, double tol)
Trigamma with adaptive tail (complex).
double sim_trigamma_f64_tail(double x, double tol)
Trigamma with adaptive tail (real).
SimComplexDouble sim_q_number_complex(SimComplexDouble z, double q)
Experimental complex Jackson q-number for SimComplexDouble argument.
double sim_ghn_HK_d2(double a, int K)
Second derivative H''_K(a) = ψ₂(a+K) − ψ₂(a). (Positive for a>0,K>0.)
float sim_digamma_f32_mortici(float x)
Speedy Mortici-style digamma (real, float).
double sim_hyperexp_phi(double lambda, double epsilon, int K)
Finite ladder helper φ(λ,ε;K) = Σ_{k=0}^{K-1} λ/(λ+ε+k).
SimResult(* SimSpecialFallbackFn)(void *userdata, const SimSpecialEvalReport *report, SimComplexDouble *value_out)
Callback signature used to provide fallback values on failure.
Definition special_functions.h:420
Explicit in-memory representation for a complex double scalar (re, im)
Definition field.h:175
Fallback ABI-compatible complex float if not in field.h.
Definition special_functions.h:49
float im
Definition special_functions.h:50
Structured report describing why a special-function helper failed.
Definition special_functions.h:407
double exponent_param
Definition special_functions.h:413
double tolerance
Definition special_functions.h:416
SimComplexDouble input
Definition special_functions.h:410
double aux_param
Definition special_functions.h:412
int iteration_count
Definition special_functions.h:414
const char * function
Definition special_functions.h:409
double residual
Definition special_functions.h:415
SimSpecialFault fault
Definition special_functions.h:408
double q_param
Definition special_functions.h:411