Math-Algebra-Symbols
view release on metacpan or search on metacpan
lib/Math/Algebra/Symbols/Sum.pm view on Meta::CPAN
{$s->{t} = $s->{t}->clone->divideInt($d) ->z;
$s->{s} = $s->{s}->clone->timesInt ($d*$d)->z;
}
}
# Eliminate duplicate squared factors
for my $s(@s)
{my $F = factorize($s->{s}->c);
my $p = 1;
for my $f(keys(%$F))
{$p *= $f**(int($F->{$f}/2)) if $F->{$f} > 1;
}
$s->{t} = $s->{t}->clone->timesInt ($p) ->z;
$s->{s} = $s->{s}->clone->divideInt($p*$p)->z;
if ($s->{s}->isOne)
{push @t, $s->{t}->removeSqrt;
}
else
{push @t, $s->{t}->clone->Sqrt($s->{$s})->z;
}
}
# Result
sigma(@t);
}
=head3 isEqualSqrt
Check whether one sum is equal to another after multiplying out sqrts.
=cut
sub isEqualSqrt($)
{my ($C) = @_;
#_______________________________________________________________________
# Each sqrt
#_______________________________________________________________________
for(1..99)
{$C = $C->normalizeSqrts;
my @s = grep { defined($_->Sqrt)} $C->t;
my @n = grep {!defined($_->Sqrt)} $C->t;
last unless scalar(@s) > 0;
#_______________________________________________________________________
# Partition by square roots.
#_______________________________________________________________________
my %S = ();
for my $t(@s)
{my $s = $t->Sqrt;
my $S = $s->signature;
push @{$S{$S}}, $t;
}
#_______________________________________________________________________
# Square each partitions, as required by the formulae below.
#_______________________________________________________________________
my @t;
push @t, sigma(@n)->power($two) if scalar(@n); # Non sqrt partition
for my $s(keys(%S))
{push @t, sigma(@{$S{$s}})->power($two); # Sqrt partition
}
#_______________________________________________________________________
# I can multiply out upto 4 square roots using the formulae below.
# There are formula to multiply out more than 4 sqrts, but they are big.
# These formulae are obtained by squaring out and rearranging:
# sqrt(a)+sqrt(b)+sqrt(c)+sqrt(d) == 0 until no sqrts remain, and
# then matching terms to produce optimal execution.
# This remarkable result was obtained with the help of this package:
# demonstrating its utility in optimizing complex calculations written
# in Perl: which in of itself cannot optimize broadly.
#_______________________________________________________________________
my $ns = scalar(@t);
# 2016/01/26 12:29:28 No need to die
# $ns < 5 or die "There are $ns square roots present. I can handle less than 5";
my ($a, $b, $c, $d, $e) = @t;
if ($ns == 1)
{$C = $a;
}
=pod
ð®+ð¯ = 0
=> a+b+2ð®ð¯ = 0
=> 2ð®ð¯ = -a-b
=> 0 = aa+bb-2ab
= (a-b)**2 or (b-a)**2
=cut
elsif ($ns == 2)
{$C = $a-$b;
}
elsif ($ns == 3)
{$C = -$a**2+2*$a*$b-$b**2+2*$c*$a+2*$c*$b-$c**2;
}
elsif ($ns == 4)
{my $a2 = $a * $a;
my $a3 = $a2 * $a;
my $a4 = $a3 * $a;
my $b2 = $b * $b;
my $b3 = $b2 * $b;
my $b4 = $b3 * $b;
my $c2 = $c * $c;
my $c3 = $c2 * $c;
my $c4 = $c3 * $c;
my $d2 = $d * $d;
my $d3 = $d2 * $d;
my $d4 = $d3 * $d;
my $bpd = $b + $d;
my $bpc = $b + $c;
my $cpd = $c + $d;
$C =
- ($a4 + $b4 + $c4 + $d4)
+ 4*(
+$a3*($b+$cpd)+$b3*($a+$cpd)+$c3*($a+$bpd)+$d3*($a+$bpc)
-$a2*($b *($cpd)+ $c*$d)
-$a *($b2*($cpd)+$d2*($bpc))
)
- 6*($a2*$b2+($a2+$b2)*($c2+$d2)+$c2*$d2)
- 4*$c*($b2*$d+$b*$d2)
- 4*$c2*($a*($bpd)+$b*$d)
+40*$c*$a*$b*$d
( run in 1.436 second using v1.01-cache-2.11-cpan-39bf76dae61 )