Skip to content

Instantly share code, notes, and snippets.

@sushant-hiray
Last active August 29, 2015 14:01
Show Gist options
  • Save sushant-hiray/b7cc24e7874154560aaa to your computer and use it in GitHub Desktop.
Save sushant-hiray/b7cc24e7874154560aaa to your computer and use it in GitHub Desktop.
const RCP<const Basic> handle_minus(const RCP<const Basic> &arg, bool odd)
{
if(could_extract_minus(r)) {
if(odd)
return mul(minus_one, r);
else
return r;
}
}
// \return true of conjugate has to be returned finally else false
bool eval(const RCP<const Basic> &arg, int period, bool odd, //input
const Ptr<RCP<const Basic>> arg&,int& index, int& sign) //output
{
if (eq(arg, zero)) return zero;
bool check;
RCP<const Integer> n;
RCP<const Basic> r;
check = get_pi_shift(arg, outArg(n), outArg(r));
if (check) {
int m = n->as_int();
m = m % (12*period);
sign = 1;
if (eq(r, zero)) {
index = m;
*arg = zero;
return false;
}
else if ((m % (12*period)) == 0) {
index = 0;
*arg = handle_minus(r, odd);
if (!odd)
sign = -1;
return false;
}
else if ((m % 6) == 0)) {
if (m == 6)
sign = 1;
else
sign = -1;
*arg = r;
return true;
}
}
else {
*arg = r;
index = -1;
return false;
}
}
RCP<const Basic> sin(const RCP<const Basic> &arg)
{
RCP<const Basic>>& ret_arg;
int index;
int sign;
bool conjugate = eval(arg, 2, 1, //input
outArg(ret_arg), index, sign); //output
if (conjugate) {
// cos has to be returned
if (sign == 1)
return rcp(new Cos(ret_arg));
else
return mul(minus_one, rcp(new Cos(ret_arg)));
}
else {
if (eq(ret_arg, zero)) {
return sign*sin_table[index];
}
else {
if (sign == 1)
return rcp(new Sin(ret_arg));
else
return mul(minus_one, rcp(new Sin(ret_arg)));
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment