- // cos(n*Pi) -> {+|-}1
- ex xOverPi=x/Pi;
- if (xOverPi.info(info_flags::even))
- return exONE();
- else if (xOverPi.info(info_flags::odd))
- return exMINUSONE();
-
- // cos((2n+1)*Pi/2) -> 0
- ex xOverPiMinusHalf=xOverPi-exHALF();
- if (xOverPiMinusHalf.info(info_flags::integer))
- return exZERO();
+ // cos(n*Pi/6) -> { 0 | +/-1/2 | +/-sqrt(3)/2 | +/-1 }
+ ex SixExOverPi = _ex6()*x/Pi;
+ if (SixExOverPi.info(info_flags::integer)) {
+ numeric z = smod(ex_to_numeric(SixExOverPi),_num12());
+ if (z.is_equal(_num_5())) // cos(7*Pi/6) -> -sqrt(3)/2
+ return _ex_1_2()*power(_ex3(),_ex1_2());
+ if (z.is_equal(_num_4())) // cos(8*Pi/6) -> -1/2
+ return _ex_1_2();
+ if (z.is_equal(_num_3())) // cos(9*Pi/6) -> 0
+ return _ex0();
+ if (z.is_equal(_num_2())) // cos(10*Pi/6) -> 1/2
+ return _ex1_2();
+ if (z.is_equal(_num_1())) // cos(11*Pi/6) -> sqrt(3)/2
+ return _ex1_2()*power(_ex3(),_ex1_2());
+ if (z.is_equal(_num0())) // cos(0) -> 1
+ return _ex1();
+ if (z.is_equal(_num1())) // cos(1*Pi/6) -> sqrt(3)/2
+ return _ex1_2()*power(_ex3(),_ex1_2());
+ if (z.is_equal(_num2())) // cos(2*Pi/6) -> 1/2
+ return _ex1_2();
+ if (z.is_equal(_num3())) // cos(3*Pi/6) -> 0
+ return _ex0();
+ if (z.is_equal(_num4())) // cos(4*Pi/6) -> -1/2
+ return _ex_1_2();
+ if (z.is_equal(_num5())) // cos(5*Pi/6) -> -sqrt(3)/2
+ return _ex_1_2()*power(_ex3(),_ex1_2());
+ if (z.is_equal(_num6())) // cos(6*Pi/6) -> -1
+ return _ex_1();
+ }