Math-Algebra-Symbols
view release on metacpan or search on metacpan
lib/Math/Algebra/Symbols/Sum.pm view on Meta::CPAN
=head3 makeInt
Construct an integer
=cut
sub makeInt($)
{sigma(term()->one->clone->c(shift())->z)
}
=head2 Methods
=head3 isSum
Confirm type
=cut
sub isSum($) {1};
=head3 t
Get list of terms from existing sum
=cut
sub t($)
{my ($a) = @_;
(map {$a->{t}{$_}} sort(keys(%{$a->{t}})));
}
=head3 count
Count terms in sum
=cut
sub count($)
{my ($a) = @_;
scalar(keys(%{$a->{t}}));
}
=head3 st
Get the single term from a sum containing just one term
=cut
sub st($)
{my ($a) = @_;
return (values(%{$a->{t}}))[0] if scalar(keys(%{$a->{t}})) == 1;
undef;
}
=head3 negate
Multiply each term in a sum by -1
=cut
sub negate($)
{my ($s) = @_;
my @t;
for my $t($s->t)
{push @t, $t->clone->timesInt(-1)->z;
}
sigma(@t);
}
=head3 add
Add two sums together to make a new sum
=cut
sub add($$)
{my ($a, $b) = @_;
sigma($a->t, $b->t);
}
=head3 subtract
Subtract one sum from another
=cut
sub subtract($$)
{my ($a, $b) = @_;
return $b->negate if $a->{id} == $zero->{id};
$a->add($b->negate);
}
=head3 Conditional Multiply
Multiply two sums if both sums are defined, otherwise return
the defined sum. Assumes that at least one sum is defined.
=cut
sub multiplyC($$)
{my ($a, $b) = @_;
lib/Math/Algebra/Symbols/Sum.pm view on Meta::CPAN
Tanh, Sech, Csch, Coth of a sum
=cut
sub tanh($) {my ($x) = @_; $x->sinh()->divide($x->cosh())}
sub sech($) {my ($x) = @_; $one ->divide($x->cosh())}
sub csch($) {my ($x) = @_; $one ->divide($x->sinh())}
sub coth($) {my ($x) = @_; $x->cosh()->divide($x->sinh())}
=head3 dot
Dot - complex dot product of two complex sums
=cut
sub dot($$)
{my ($a, $b) = @_;
$b = newFromString("$b") unless ref($b) eq __PACKAGE__;
$a->re->multiply($b->re)->add($a->im->multiply($b->im));
}
=head3 cross
The area of the parallelogram formed by two complex sums
=cut
sub cross($$)
{my ($a, $b) = @_;
$a->dot($a)->multiply($b->dot($b))->subtract($a->dot($b)->power($two))->Sqrt;
}
=head3 unit
Intersection of a complex sum with the unit circle.
=cut
sub unit($)
{my ($a) = @_;
my $b = $a->modulus;
my $c = $a->divide($b);
$a->divide($a->modulus);
}
=head3 re
Real part of a complex sum
=cut
sub re($)
{my ($A) = @_;
$A = newFromString("$A") unless ref($A) eq __PACKAGE__;
my @r;
for my $a($A->t)
{next if $a->i == 1;
push @r, $a;
}
sigma(@r);
}
=head3 im
Imaginary part of a complex sum
=cut
sub im($)
{my ($A) = @_;
$A = newFromString("$A") unless ref($A) eq __PACKAGE__;
my @r;
for my $a($A->t)
{next if $a->i == 0;
push @r, $a;
}
$mI->multiply(sigma(@r));
}
=head3 modulus
Modulus of a complex sum
=cut
sub modulus($)
{my ($a) = @_;
$a->re->power($two)->add($a->im->power($two))->Sqrt;
}
=head3 conjugate
Conjugate of a complexs sum
=cut
sub conjugate($)
{my ($a) = @_;
$a->re->subtract($a->im->multiply($i));
}
=head3 clone
Clone
=cut
sub clone($)
{my ($t) = @_;
$t->{z} or die "Attempt to clone unfinalized sum";
my $c = bless {%$t};
$c->{t} = {%{$t->{t}}};
delete $c->{z};
delete $c->{s};
delete $c->{id};
$c;
}
=head3 signature
Signature of a sum: used to optimize add().
# Fix the problem of adding different logs
=cut
sub signature($)
{my ($t) = @_;
my $s = '';
for my $a($t->t)
{$s .= '+'. $a->print;
}
$s;
}
=head3 getSignature
Get the signature (see L</signature>) of a sum
=cut
sub getSignature($)
{my ($t) = @_;
exists $t->{z} ? $t->{z} : die "Attempt to get signature of unfinalized sum";
}
=head3 id
Get Id of sum: each sum has a unique identifying number.
=cut
sub id($)
{my ($t) = @_;
$t->{id} or die "Sum $t not yet finalized";
$t->{id};
}
=head3 zz
Check sum finalized. See: L</z>.
=cut
sub zz($)
{my ($t) = @_;
$t->{z} or die "Sum $t not yet finalized";
print $t->{z}, "\n";
$t;
}
=head3 z
Finalize creation of the sum: Once a sum has been finalized it becomes
read only.
=cut
sub z($)
{my ($t) = @_;
!exists($t->{z}) or die "Already finalized this term";
my $p = $t->print;
return $z{$p} if defined($z{$p});
$z{$p} = $t;
weaken($z{$p}); # Greatly reduces memory usage.
$t->{s} = $p;
$t->{z} = $t->signature;
$t->{id} = ++$z;
#HashUtil lock_hash(%{$t->{v}}) if $lock;
#HashUtil lock_hash %$t if $lock;
$t;
}
#sub DESTROY($)
# {my ($t) = @_;
# delete $z{$t->{s}} if defined($t) and exists $t->{s};
# }
sub lockHashes()
{my ($l) = @_;
#HashUtil for my $t(values %z)
#HashUtil {lock_hash(%{$t->{v}});
#HashUtil lock_hash %$t;
#HashUtil }
$lock = 1;
}
=head3 print
Print sum
=cut
sub print($)
{my ($t) = @_;
return $t->{s} if defined($t->{s});
my $s = '';
for my $a($t->t)
{$s .= $a->print .'+';
( run in 2.344 seconds using v1.01-cache-2.11-cpan-9169edd2b0e )