Math-NumSeq
view release on metacpan or search on metacpan
devel/factorials.pl view on Meta::CPAN
print Devel::Peek::Dump($value_next);
print Devel::Peek::Dump($value_ith);
die "oops, not eq";
}
}
exit 0;
}
{
# value_to_i_estimate()
my $seq = Math::NumSeq::Factorials->new;
my $prev_value = 0;
foreach (1..120) {
my ($i, $value) = $seq->next;
# print "$i $value\n";
# foreach my $try_value ($prev_value+1 .. $value-1) {
# my $est_i = $seq->value_to_i_estimate($try_value);
# my $factor = $est_i / ($i||1);
# printf "x est=%d tvalue=%b f=%.3f\n",
# $est_i, $try_value, $factor;
# }
{
my $est_i = $seq->value_to_i_estimate($value);
my $factor = $est_i / ($i||1);
printf "i=%d est=%.2f f=%.3f\n", $i, $est_i, $factor;
}
$prev_value = $value;
}
exit 0;
}
{
sub f {
my ($x) = @_;
return $x*log($x)-$x;
}
sub fd {
my ($x) = @_;
return log($x);
}
foreach my $x (2 .. 10) {
my $f = f($x);
my $fd = fd($x);
my $d = f($x+1) - f($x);
printf "%.3f %.3f %.3f\n", $f, $fd, $d;
}
exit 0;
}
{
{
package Math::Symbolic::Custom::MySimplification;
use base 'Math::Symbolic::Custom::Simplification';
# use Math::Symbolic::Custom::Pattern;
# my $formula = Math::Symbolic->parse_from_string("TREE_a * (TREE_b / TREE_c)");
# my $pattern = Math::Symbolic::Custom::Pattern->new($formula);
use Math::Symbolic::Custom::Transformation;
my $trafo = Math::Symbolic::Custom::Transformation::Group->new
(
',',
# 'TREE_a * (TREE_b / TREE_c)' => '(TREE_a * TREE_b) / TREE_c',
# 'TREE_a * (TREE_b + TREE_c)' => 'TREE_a * TREE_b + TREE_a * TREE_c',
# '(TREE_b + TREE_c) * TREE_a' => 'TREE_b * TREE_a + TREE_c * TREE_a',
#
# # '(TREE_a / TREE_b) / TREE_c' => 'TREE_a / (TREE_b * TREE_c)',
#
# '(TREE_a / TREE_b) / (TREE_c / TREE_d)'
# => '(TREE_a * TREE_d) / (TREE_b * TREE_c)',
#
# '1 - TREE_a / TREE_b' => '(TREE_b - TREE_a) / TREE_b',
#
# 'TREE_a / TREE_b + TREE_c' => '(TREE_a + TREE_b * TREE_c) / TREE_b',
#
# '(TREE_a / TREE_b) * TREE_c' => '(TREE_a * TREE_c) / TREE_b',
#
# 'TREE_a - (TREE_b + TREE_c)' => 'TREE_a - TREE_b - TREE_c',
# '(TREE_a - TREE_b) - TREE_c' => 'TREE_a - TREE_b - TREE_c',
#
# # '(TREE_a * 1)' => 'TREE_a',
# '(TREE_a * (1 / TREE_b))' => 'TREE_a / TREE_b',
# '(TREE_a / (TREE_b * TREE_a))' => '1/TREE_b',
# # '(VAR_a / ((TREE_b) * VAR_a))' => '1/TREE_b',
# 'log(CONST_a,CONST_b)' => 'value{log(CONST_a,CONST_b)}',
# '(CONST_a-CONST_b)' => 'value{(CONST_a-CONST_b)}',
# 'log(CONST_a,e)' => 'value{log(CONST_a,2.71828182845905)}',
# '1/CONST_a' => 'value{1/CONST_a}',
# '(TREE_a-CONST_b)+CONST_c' => 'TREE_a + (CONST_c - CONST_b)',
# 'log(e,e)' => '1',
# # '(TREE_a)' => 'TREE_a',
);
sub simplify {
my $tree = shift;
### simplify(): "$tree"
for (;;) {
my $new_tree = $trafo->apply_recursive($tree);
if ($new_tree) {
### new_tree: "$new_tree"
$tree = $new_tree;
} else {
### no more ...
return $tree;
}
}
# if (my $m = $pattern->match($tree)) {
# $m = $m->{'trees'};
# ### trees: $m
# ### return: ($m->{'a'} * $m->{'b'}) / $m->{'c'}
# return ($m->{'a'} * $m->{'b'}) / $m->{'c'};
# } else {
# ### no match
( run in 0.677 second using v1.01-cache-2.11-cpan-e1769b4cff6 )