/* -*- gp-script -*- */ \\% Basic manipulations of vectors (min, max, shifts, rotations, diff). \\ Author: Joerg Arndt \\ License: GPL version 3 or later \\ online at http://www.jjj.de/pari/ \\ version: 2014-October-16 (18:29) \\ ==== min and max: vecminmax_idx(v)= { /* Return [i,a] where i, a is the index of the minimum, maximum, respectively */ my(i,a, vi, va, n, t); n = length(v); i=1; a=1; vi=v[1]; va=v[1]; for (k=2, n, t = v[k]; if ( t>va, a=k; va=t ); if ( tn, s=n ); for (k=1, n-s, t[k]=v[k+s] ); for (k=n-s+1, n, t[k]=0 ); return( t ); } /* ----- */ vecshiftr(v, s=1)= { /* right shift vector by s positions */ my(n, t); n = length(v); t = vector(n); if ( s>n, s=n ); forstep (k=n, s+1, -1, t[k]=v[k-s] ); for (k=1, s, t[k]=0 ); return( t ); } /* ----- */ vecshift(v, s)= { /* shift vector by s positions */ if ( s>0, v = vecshiftr(v, s), v = vecshiftl(v, -s) ); return ( v ); } /* ----- */ \\ ==== rotating vectors: vecrotl(v, s=1)= { /* left rotate vector by s positions */ my(t, n); n = length(v); if ( s>n, s%=n ); if ( 1==s, t = v[1]; for (i=1, n-1, v[i]=v[i+1] ); v[n] = t; , /* else */ t = vector(n); for (k=1, n-s, t[k] = v[k+s] ); for (k=1, s, t[k+n-s] = v[k] ); v = t; ); return ( v ); } /* ----- */ vecrotr(v, s=1)= { /* right rotate vector by s positions */ my(t, n); n = length(v); if ( s>n, s%=n ); if ( 1==s, t = v[n]; forstep (i=n, 2, -1, v[i]=v[i-1] ); v[1] = t; , /* else */ t = vector(n); for (k=1, s, t[k] = v[n-s+k] ); for (k=1, n-s, t[k+s] = v[k] ); v = t; ); return ( v ); } /* ----- */ vecrot(v, s)= { /* rotate vector by s positions */ if ( s>0, v = vecrotr(v, s), v = vecrotl(v, -s) ); return ( v ); } /* ----- */ \\ ==== diff: vecdiff(v,s=1)= /* return vector f first differences with skip s */ { return( vector(#v-s,n, v[n+s]-v[n]) ); } /* ----- */ vecndiff(v,n,s=1)= /* return vector f first differences with skip s */ { for (k=1,n, v=vecdiff(v,s) ); return( v ); } /* ----- */ \\ ==== end of file ====