#!perl -w -I..
#______________________________________________________________________
# Symbolic algebra.
# PhilipRBrenan@yahoo.com, 2004, Perl License.
#______________________________________________________________________
use Math::Algebra::Symbols trig=>1;
use Test::More tests => 64;
($x, $y, $pi) = symbols(qw(x y pi));
# Reciprocals
ok( sin($x) == 1/csc($x));
ok( cos($x) == 1/sec($x));
ok( tan($x) == 1/cot($x));
ok( csc($x) == 1/sin($x));
ok( sec($x) == 1/cos($x));
ok( cot($x) == 1/tan($x));
# Pythagoras
ok( sin($x)**2 + cos($x)**2 == 1);
ok( sec($x)**2 - tan($x)**2 == 1);
ok( csc($x)**2 - cot($x)**2 == 1);
# Quotient
ok( tan($x) == sin($x)/cos($x));
ok( cot($x) == cos($x)/sin($x));
# Co-Function Identities
ok( sin($x) == cos($pi/2-$x));
ok( cos($x) == sin($pi/2-$x));
ok( cot($x) == tan($pi/2-$x));
ok( sec($x) == csc($pi/2-$x));
ok( csc($x) == sec($pi/2-$x));
ok( tan($x) == cot($pi/2-$x));
# Even-Odd Identities
ok( cos($x) == cos(-$x));
ok( sin($x) == -sin(-$x));
ok( tan($x) == -tan(-$x));
ok( cot($x) == -cot(-$x));
ok( csc($x) == -csc(-$x));
ok( sec($x) == sec(-$x));
# Values of sin, cos at well known points
ok( cos(symbols(0))== 1);
ok( cos($pi/2) == 0);
ok( cos($pi) == -1);
ok( cos(3*$pi/2) == 0);
ok( cos(4*$pi/2) == 1);
ok( sin(symbols(0))== 0);
ok( sin($pi/2) == 1);
ok( sin($pi) == 0);
ok( sin(3*$pi/2) == -1);
ok( sin(4*$pi/2) == 0);
# Sums and Differences
ok( sin($x+$y) == sin($x)*cos($y)+cos($x)*sin($y));
ok( sin($x-$y) == sin($x)*cos($y)-cos($x)*sin($y));
ok( cos($x+$y) == cos($x)*cos($y)-sin($x)*sin($y));
ok( cos($x-$y) == cos($x)*cos($y)+sin($x)*sin($y));
ok( tan($x+$y) == (tan($x)+tan($y))/(1-tan($x)*tan($y)));
ok( tan($x-$y) == (tan($x)-tan($y))/(1+tan($x)*tan($y)));
# Double angles
ok( sin(2*$x) == 2*sin($x)*cos($x));
ok( cos(2*$x) == cos($x)**2-sin($x)**2);
ok( cos(2*$x) == 2*cos($x)**2-1);
ok( cos(2*$x) == 1-2*sin($x)**2);
ok( tan(2*$x) == 2*tan($x)/(1-tan($x)**2));
# Power-Reducing/Half Angle Formulas
ok( sin($x)**2 == (1-cos(2*$x))/2);
ok( cos($x)**2 == (1+cos(2*$x))/2);
ok( tan($x)**2 == (1-cos(2*$x))/(1+cos(2*$x)));
# Sum-to-Product Formulas
ok( sin($x)+sin($y) == 2*sin(($x+$y)/2)*cos(($x-$y)/2));
ok( sin($x)-sin($y) == 2*cos(($x+$y)/2)*sin(($x-$y)/2));
ok( cos($x)+cos($y) == 2*cos(($x+$y)/2)*cos(($x-$y)/2));
ok( cos($x)-cos($y) == -2*sin(($x+$y)/2)*sin(($x-$y)/2));
# Product-to-Sum Formulas
ok( sin($x)*sin($y) == cos($x-$y)/2-cos($x+$y)/2);
ok( cos($x)*cos($y) == cos($x-$y)/2+cos($x+$y)/2);
ok( sin($x)*cos($y) == sin($x+$y)/2+sin($x-$y)/2);
ok( cos($x)*sin($y) == sin($x+$y)/2-sin($x-$y)/2);
# Differentials.
ok( cos($x) == -cos($x)->d->d);
ok( sin($x) == -sin($x)->d->d);
ok( sin($x)->d == cos($x));
ok( cos($x)->d == -sin($x));
ok( tan($x)->d == tan($x)**2 + 1);
ok( tan($x)->d == sec($x)**2);
ok( cot($x)->d == -csc($x)**2);
ok( sec($x)->d == sec($x)*tan($x));
ok( csc($x)->d == -csc($x)*cot($x));
syntax highlighted by Code2HTML, v. 0.9.1