The Perl and Raku Conference 2025: Greenville, South Carolina - June 27-29 Learn more

=encoding utf8
=head1 NAME
Math::Symbolic::AuxFunctions - Auxiliary functions for Math::Symbolic hierarchy
=head1 SYNOPSIS
use Math::Symbolic::AuxFunctions;
Math::Symbolic::AuxFunctions::acos($x);
# etc
=head1 DESCRIPTION
This module contains implementations of some auxiliary functions that are
used within the Math::Symbolic hierarchy of modules. In particular, this
module holds all trigonometric functions used for numeric evaluation of
trees by Math::Symbolic::Operator.
=head2 EXPORT
None. On purpose. If I wished this module would pollute others' namespaces,
I'd have put the functions right where they're used.
=cut
use 5.006;
use strict;
use Carp;
use Memoize;
our $VERSION = '0.613';
=head1 TRIGONOMETRIC FUNCTIONS
=head2 tan
Computes the tangent sin(x) / cos(x).
=cut
sub tan { sin( $_[0] ) / cos( $_[0] ) }
=head2 cot
Computes the cotangent cos(x) / sin(x).
=cut
sub cot { cos( $_[0] ) / sin( $_[0] ) }
=head2 asin
Computes the arc sine asin(z) = -i log(iz + sqrt(1-z*z)).
Above formula is for complex numbers.
=cut
sub asin { atan2( $_[0], sqrt( 1 - $_[0] * $_[0] ) ) }
=head2 acos
Computes the arc cosine acos(z) = -i log(z + sqrt(z*z-1)).
Above formula is for complex numbers.
=cut
sub acos { atan2( sqrt( 1 - $_[0] * $_[0] ), $_[0] ) }
=head2 atan
Computes the arc tangent atan(z) = i/2 log((i+z) / (i-z)).
Above formula is for complex numbers.
=cut
sub atan { atan2( $_[0], 1 ) }
=head2 acot
Computes the arc cotangent ( atan( 1 / x ) ).
=cut
sub acot { atan2( 1 / $_[0], 1 ) }
=head2 asinh
Computes the arc hyperbolic sine asinh(z) = log(z + sqrt(z*z+1))
=cut
sub asinh { log( $_[0] + sqrt( $_[0] * $_[0] + 1 ) ) }
=head2 acosh
Computes the arc hyperbolic cosine acosh(z) = log(z + sqrt(z*z-1)).
=cut
sub acosh { log( $_[0] + sqrt( $_[0] * $_[0] - 1 ) ) }
=head1 OTHER FUNCTIONS
=cut
=head2 binomial_coeff
Calculates the binomial coefficient n over k of its first two
arguments (n, k).
Code taken from Orwant et al, "Mastering Algorithms with Perl"
=cut
memoize('binomial_coeff');
sub binomial_coeff {
my ( $n, $k ) = @_;
my ( $res, $j ) = ( 1, 1 );
return 0 if $k > $n || $k < 0;
$k = ( $n - $k ) if ( $n - $k ) < $k;
while ( $j <= $k ) {
$res *= $n--;
$res /= $j++;
}
return $res;
}
=head2 bell_number
The Bell numbers are defined as follows:
B_0 = 1
B_n+1 = sum_k=0_to_n( B_k * binomial_coeff(n, k) )
This function uses memoization.
=cut
memoize('bell_number');
sub bell_number {
my $n = shift;
return undef if $n < 0;
return 1 if $n == 0;
my $bell = 0;
$bell += bell_number($_) * binomial_coeff( $n - 1, $_ ) for 0 .. $n - 1;
return $bell;
}
1;
__END__
=head1 AUTHOR
Please send feedback, bug reports, and support requests to the Math::Symbolic
support mailing list:
math-symbolic-support at lists dot sourceforge dot net. Please
consider letting us know how you use Math::Symbolic. Thank you.
If you're interested in helping with the development or extending the
module's functionality, please contact the developers' mailing list:
math-symbolic-develop at lists dot sourceforge dot net.
List of contributors:
Steffen Müller, symbolic-module at steffen-mueller dot net
Stray Toaster, mwk at users dot sourceforge dot net
Oliver Ebenhöh
=head1 SEE ALSO
New versions of this module can be found on
http://steffen-mueller.net or CPAN. The module development takes place on
L<Math::Symbolic>
=cut