/* Deterministic Trinomial Sampler */ new; cls; i=3^10-2; nr=10; print/rz trisampler(i,nr)~trisampler2(i,nr); /* ** trisampler.txt - Deterministic Trinomial 0-1-2 Sampler. ** (C) Copyright 2005 Yosuke Amijima. All Rights Reserved. ** ** Purpose: Gets deterministic trinomial 0-1-2 index numbers for given i in a very easy way. ** ** Format: x=trisampler(i,nr); ** ** Input: i scalar, deterministic order (0,1,2,...,3^nr-1) ** ** nr scalar, number of rows ** ** ** Output: x vector, nr x 1 of resulting 0-1-2 index vector ** */ proc trisampler(i,nr); local x,j; if i<0 or i>(3^nr-1) or i-floor(i)/=0; errorlog "ERROR: Parameter i must be an integer(0,1,2,...,3^nn-1)."; retp("."); endif; x=zeros(nr,1); j=nr; do until j==1; x[j]=floor(i/(3^(j-1))); i=i-(x[j]*(3^(j-1))); j=j-1; endo; x[1]=i; retp(rev(x)); endp; /* or matrix version */ proc trisampler2(i,nr); local x,b,n,z,y; if i<0 or i>(3^nr-1) or i-floor(i)/=0; errorlog "ERROR: Parameter i must be an integer(0,1,2,...,3^nn-1)."; retp("."); endif; x=zeros(nr,1); if i==0; retp(x); endif; /* convert k(base 10) to k(base b) */ b=3; n=maxc(log(i)/log(b))+1; z=reshape(b,n,rows(i)); y=rev(recserrc(i,z)); /* impose it on (nr x 1) zero vector */ if cols(y)==nr; x=y; else; x[nr-rows(y)+1:nr]=y; endif; retp(x); endp;