File indexing completed on 2024-05-12 03:47:53

0001 /*
0002     File                 : nsl_sf_basic.h
0003     Project              : LabPlot
0004     Description          : NSL special basic functions
0005     --------------------------------------------------------------------
0006     SPDX-FileCopyrightText: 2017-2022 Stefan Gerlach <stefan.gerlach@uni.kn>
0007     SPDX-License-Identifier: GPL-2.0-or-later
0008 */
0009 
0010 #ifndef NSL_SF_BASIC_H
0011 #define NSL_SF_BASIC_H
0012 
0013 #include "nsl_complex.h"
0014 #include <gsl/gsl_version.h>
0015 
0016 #undef __BEGIN_DECLS
0017 #undef __END_DECLS
0018 #ifdef __cplusplus
0019 #define __BEGIN_DECLS extern "C" {
0020 #define __END_DECLS }
0021 #else
0022 #define __BEGIN_DECLS /* empty */
0023 #define __END_DECLS /* empty */
0024 #endif
0025 __BEGIN_DECLS
0026 
0027 #include <stdint.h> /* fixed size int types */
0028 
0029 /* dummy function for parsing statistical methods */
0030 double nsl_sf_dummy(double x);
0031 double nsl_sf_dummy2(double p, double x);
0032 
0033 /* random functions */
0034 double nsl_sf_rand(void);
0035 double nsl_sf_random(void);
0036 double nsl_sf_drand(void);
0037 
0038 /* signum function */
0039 double nsl_sf_sgn(double x);
0040 /* Heavyside theta function */
0041 double nsl_sf_theta(double x);
0042 
0043 /* non-standard function */
0044 double nsl_sf_exp10(double x);
0045 
0046 /* non-uniform random number generation */
0047 double nsl_sf_ran_gaussian(double sigma);
0048 double nsl_sf_ran_exponential(double mu);
0049 double nsl_sf_ran_laplace(double a);
0050 double nsl_sf_ran_cauchy(double a);
0051 double nsl_sf_ran_rayleigh(double sigma);
0052 double nsl_sf_ran_landau(void);
0053 double nsl_sf_ran_levy(double c, double alpha);
0054 double nsl_sf_ran_gamma(double a, double b);
0055 double nsl_sf_ran_flat(double a, double b);
0056 double nsl_sf_ran_lognormal(double zeta, double sigma);
0057 double nsl_sf_ran_chisq(double nu);
0058 double nsl_sf_ran_tdist(double nu);
0059 double nsl_sf_ran_logistic(double a);
0060 
0061 double nsl_sf_ran_poisson(double mu);
0062 double nsl_sf_ran_bernoulli(double p);
0063 double nsl_sf_ran_binomial(double p, double n);
0064 
0065 /* log2(x) for integer value x */
0066 int nsl_sf_log2_int(unsigned int x);
0067 int nsl_sf_log2_int0(unsigned int x);
0068 int nsl_sf_log2_int2(int x);
0069 int nsl_sf_log2_int3(uint64_t x);
0070 int nsl_sf_log2p1_int(int x);
0071 int nsl_sf_log2_longlong(unsigned long long x);
0072 
0073 /* more trig. functions */
0074 double nsl_sf_sec(double x);
0075 double nsl_sf_csc(double x);
0076 double nsl_sf_cot(double x);
0077 double nsl_sf_asec(double x);
0078 double nsl_sf_acsc(double x);
0079 double nsl_sf_acot(double x);
0080 double nsl_sf_sech(double x);
0081 double nsl_sf_csch(double x);
0082 double nsl_sf_coth(double x);
0083 double nsl_sf_asech(double x);
0084 double nsl_sf_acsch(double x);
0085 double nsl_sf_acoth(double x);
0086 
0087 /* harmonic numbers (extended to non-integers) */
0088 double nsl_sf_harmonic(double x);
0089 
0090 /* error function and related wrapper */
0091 double nsl_sf_erfcx(double x);
0092 double nsl_sf_erfi(double x);
0093 double nsl_sf_im_w_of_x(double x);
0094 #if !defined(_MSC_VER)
0095 double nsl_sf_im_w_of_z(COMPLEX z);
0096 #endif
0097 double nsl_sf_dawson(double x);
0098 double nsl_sf_voigt(double x, double sigma, double gamma);
0099 double nsl_sf_pseudovoigt(double x, double eta, double sigma, double gamma);
0100 /* same width pseudo Voigt*/
0101 double nsl_sf_pseudovoigt1(double x, double eta, double w);
0102 
0103 /* wrapper for GSL functions with integer parameters */
0104 /* mathematical functions */
0105 double nsl_sf_ldexp(double x, double expo);
0106 double nsl_sf_powint(double x, double n);
0107 /* Airy functions */
0108 double nsl_sf_airy_Ai(double x);
0109 double nsl_sf_airy_Bi(double x);
0110 double nsl_sf_airy_Ais(double x);
0111 double nsl_sf_airy_Bis(double x);
0112 double nsl_sf_airy_Aid(double x);
0113 double nsl_sf_airy_Bid(double x);
0114 double nsl_sf_airy_Aids(double x);
0115 double nsl_sf_airy_Bids(double x);
0116 double nsl_sf_airy_0_Ai(double s);
0117 double nsl_sf_airy_0_Bi(double s);
0118 double nsl_sf_airy_0_Aid(double s);
0119 double nsl_sf_airy_0_Bid(double s);
0120 /* Bessel functions */
0121 double nsl_sf_bessel_Jn(double n, double x);
0122 double nsl_sf_bessel_Yn(double n, double x);
0123 double nsl_sf_bessel_In(double n, double x);
0124 double nsl_sf_bessel_Ins(double n, double x);
0125 double nsl_sf_bessel_Kn(double n, double x);
0126 double nsl_sf_bessel_Kns(double n, double x);
0127 double nsl_sf_bessel_jl(double l, double x);
0128 double nsl_sf_bessel_yl(double l, double x);
0129 double nsl_sf_bessel_ils(double l, double x);
0130 double nsl_sf_bessel_kls(double l, double x);
0131 double nsl_sf_bessel_0_J0(double s);
0132 double nsl_sf_bessel_0_J1(double s);
0133 double nsl_sf_bessel_0_Jnu(double nu, double s);
0134 
0135 double nsl_sf_hydrogenicR(double n, double l, double z, double r);
0136 /* elliptic integrals */
0137 double nsl_sf_ellint_Kc(double x);
0138 double nsl_sf_ellint_Ec(double x);
0139 double nsl_sf_ellint_Pc(double x, double n);
0140 double nsl_sf_ellint_F(double phi, double k);
0141 double nsl_sf_ellint_E(double phi, double k);
0142 double nsl_sf_ellint_P(double phi, double k, double n);
0143 double nsl_sf_ellint_D(double phi, double k);
0144 double nsl_sf_ellint_RC(double x, double y);
0145 double nsl_sf_ellint_RD(double x, double y, double z);
0146 double nsl_sf_ellint_RF(double x, double y, double z);
0147 double nsl_sf_ellint_RJ(double x, double y, double z, double p);
0148 
0149 double nsl_sf_exprel_n(double n, double x);
0150 double nsl_sf_fermi_dirac_int(double j, double x);
0151 /* Gamma */
0152 double nsl_sf_fact(double n);
0153 double nsl_sf_doublefact(double n);
0154 double nsl_sf_lnfact(double n);
0155 double nsl_sf_lndoublefact(double n);
0156 double nsl_sf_choose(double n, double m);
0157 double nsl_sf_lnchoose(double n, double m);
0158 double nsl_sf_taylorcoeff(double n, double x);
0159 
0160 double nsl_sf_gegenpoly_n(double n, double l, double x);
0161 
0162 #if (GSL_MAJOR_VERSION > 2) || (GSL_MAJOR_VERSION == 2) && (GSL_MINOR_VERSION >= 4)
0163 double nsl_sf_hermite_prob(double n, double x);
0164 double nsl_sf_hermite_func(double n, double x);
0165 double nsl_sf_hermite_func_der(double m, double n, double x);
0166 double nsl_sf_hermite(double n, double x);
0167 double nsl_sf_hermite_deriv(double m, double n, double x);
0168 double nsl_sf_hermite_prob_deriv(double m, double n, double x);
0169 #if (GSL_MAJOR_VERSION > 2) || (GSL_MAJOR_VERSION == 2) && (GSL_MINOR_VERSION >= 6)
0170 double nsl_sf_hermite_func_fast(double n, double x);
0171 #endif
0172 #endif
0173 
0174 double nsl_sf_hyperg_1F1i(double m, double n, double x);
0175 double nsl_sf_hyperg_Ui(double m, double n, double x);
0176 double nsl_sf_laguerre_n(double n, double a, double x);
0177 
0178 double nsl_sf_legendre_Pl(double l, double x);
0179 double nsl_sf_legendre_Ql(double l, double x);
0180 double nsl_sf_legendre_Plm(double l, double m, double x);
0181 double nsl_sf_legendre_sphPlm(double l, double m, double x);
0182 double nsl_sf_conicalP_sphreg(double l, double L, double x);
0183 double nsl_sf_conicalP_cylreg(double m, double l, double x);
0184 double nsl_sf_legendre_H3d(double l, double L, double e);
0185 
0186 #if (GSL_MAJOR_VERSION >= 2)
0187 double nsl_sf_mathieu_a(double n, double q);
0188 double nsl_sf_mathieu_b(double n, double q);
0189 double nsl_sf_mathieu_ce(double n, double q, double x);
0190 double nsl_sf_mathieu_se(double n, double q, double x);
0191 double nsl_sf_mathieu_Mc(double j, double n, double q, double x);
0192 double nsl_sf_mathieu_Ms(double j, double n, double q, double x);
0193 #endif
0194 
0195 double nsl_sf_psiint(double n);
0196 double nsl_sf_psi1int(double n);
0197 double nsl_sf_psin(double n, double x);
0198 
0199 double nsl_sf_zetaint(double n);
0200 double nsl_sf_zetam1int(double n);
0201 double nsl_sf_etaint(double n);
0202 
0203 /* random number distributions */
0204 double nsl_sf_poisson(double k, double m);
0205 double nsl_sf_bernoulli(double k, double p);
0206 double nsl_sf_binomial(double k, double p, double n);
0207 double nsl_sf_negative_binomial(double k, double p, double n);
0208 double nsl_sf_pascal(double k, double p, double n);
0209 double nsl_sf_geometric(double k, double p);
0210 double nsl_sf_hypergeometric(double k, double n1, double n2, double t);
0211 double nsl_sf_logarithmic(double k, double p);
0212 
0213 __END_DECLS
0214 
0215 #endif /* NSL_SF_BASIC_H */