#help_index "Math" public U0 R2P(F64 *_mag=NULL,F64 *_arg=NULL,F64 x,F64 y) {//Rect to polar //Returns angle in range (-pi,pi] if (_arg) *_arg=Arg(x,y); if (_mag) *_mag=Sqrt(x*x+y*y); } public U0 P2R(F64 *_x=NULL,F64 *_y=NULL,F64 mag,F64 arg) {//Polar to Rect if (_x) *_x=mag*Cos(arg); if (_y) *_y=mag*Sin(arg); } public F64 Wrap(F64 theta,F64 base=-pi) {//Returns angle in range [base,base+2*pi) F64 res=theta%(2*pi); if (res>=base+2*pi) res-=2*pi; else if (res<base) res+=2*pi; return res; } public I64 DistSqrI64(I64 x1,I64 y1,I64 x2,I64 y2) {//Distance-squared between 2 points. I64 dx=x1-x2,dy=y1-y2; return dx*dx+dy*dy; } public F64 ASin(F64 s) {//Arc Sin (Inverse Sin). F64 c; c=s*s; if (c>=1.0) return pi/2.0; c=Sqrt(1.0-c); return ATan(s/c); } public F64 ACos(F64 c) {//Arc Cos (Inverse Cos). F64 s; if (!c) return pi/2.0; s=c*c; if (s>=1.0) return 0.0; s=Sqrt(1.0-s); return ATan(s/c); } public F64 Sinh(F64 x) {//Hyperbolic Sine. return 0.5*(Exp(x)-Exp(-x)); } public F64 Cosh(F64 x) {//Hyperbolic Cosine. return 0.5*(Exp(x)+Exp(-x)); } #help_index "Math/Complex;Data Types/Complex" public Complex *CAdd(Complex *sum,Complex *n1,Complex *n2) {//sum=n1+n2 sum->x=n1->x+n2->x; sum->y=n1->y+n2->y; return sum; } public Complex *CSub(Complex *diff,Complex *n1,Complex *n2) {//diff=n1-n2 diff->x=n1->x-n2->x; diff->y=n1->y-n2->y; return diff; } public Complex *CMul(Complex *prod,Complex *n1,Complex *n2) {//prod=n1*n2 prod->x=n1->x*n2->x-n1->y*n2->y; prod->y=n1->x*n2->y+n1->y*n2->x; return prod; } public Complex *CDiv(Complex *quot,Complex *n1,Complex *n2) {//quot=n1/n2 F64 m1,arg1,m2,arg2; R2P(&m1,&arg1,n1->x,n1->y); R2P(&m2,&arg2,n2->x,n2->y); m1/=m2; arg1-=arg2; quot->x=m1*Cos(arg1); quot->y=m1*Sin(arg1); return quot; } public Complex *CScale(Complex *dst,F64 s) {//dst*=s dst->x*=s; dst->y*=s; return dst; } public Complex *CCopy(Complex *dst,Complex *src) {//dst=src dst->x=src->x; dst->y=src->y; return dst; } public Complex *CEqu(Complex *dst,F64 x,F64 y) {//dst=(x,y) dst->x=x; dst->y=y; return dst; } public Complex *CPoly(Complex *dst,I64 n,Complex *zeros,Complex *x) {//Eval complex polynomial I64 i; Complex n1,n2; if (n>0) { CSub(dst,x,&zeros[0]); for (i=1; i<n; i++) { CCopy(&n1,dst); CMul(dst,&n1,CSub(&n2,x,&zeros[i])); } } else CEqu(dst,1.0,0.0); return dst; } public U64 NextPow2(U64 x) {// Get next power of 2 >= input x--; x |= x >> 1; x |= x >> 2; x |= x >> 4; x |= x >> 8; x |= x >> 16; x |= x >> 32; x++; return x; }