module vec; import BigRational; private import std.math; private import std.c.math; private import std.string; alias std.math math; template VecMath(VALUE) { VALUE sqrt(VALUE x) { return math.sqrt(x); } } template VecMath(VALUE:BigRational.Rational) { VALUE sqrt(VALUE x) { VALUE ret; assert(0); return ret; } } template VecMath(VALUE:int) { int sqrt(int x) { return cast(int)(.01+math.sqrt(cast(float)x));//cast(int)floor((double)math.sqrt(cast(double)x)+.01); } } struct vec(VALUE, int tsize){ enum {nvalues=(tsize>0?tsize:1)} VALUE [nvalues]f; VALUE* getAt(uint ii) { return ii1) f[1]=i; return i; } VALUE z(VALUE i) { if (tsize>2) f[2]=i; return i; } VALUE w(VALUE i) { if (tsize>3) f[3]=i; return i; } VALUE i() { return f[0]; } VALUE j() { return f[11) f[1]=i; return i; } VALUE k(VALUE i) { if (tsize>2) f[2]=i; return i; } static VALUE dot (vec t, vec oth) { VALUE ret=t.f[0]*oth.f[0]; for (int ii=1;iiinp.f[ii]); } return ret; } .vec!(int,tsize) opGreater(VALUE inp) { .vec!(int,tsize) ret; for (int ii=0;iiinp); } return ret; } .vec!(int,tsize) opGEqual(vec inp) { .vec!(int,tsize) ret; for (int ii=0;ii=inp.f[ii]); } return ret; } .vec!(int,tsize) opGEqual(VALUE inp) { .vec!(int,tsize) ret; for (int ii=0;ii=inp); } return ret; } //disallow! int opEqual(vec o){ for (int ii=0;iioth) return 1; return 0; } int opEqual(VALUE o){ for (int ii=0;iio) return 1; return 0; } VALUE thus=dot(*this,*this); VALUE oth = o>=BigRational.Zero!(VALUE).zero()?o:-o; if (thusoth) return 1; return 0; } int any() { for (int ii=1;ii=0;--ii) { ret[ii]=v[ii]; } return ret; } static vec opCall(VALUE []v) { vec ret; for (int ii=v.length-1;ii>=0;--ii) { ret[ii]=v[ii]; } return ret; } static vec opCall(VALUE a) { vec ret; for (int ii=0;ii