os

pseudo-base-prime part...5?

Feb 23, 2014 21:37


More base-prime stuff. I extended the bc code; there are function names matching the HP User-RPL programs, and the size of the array is stored as element 0 (Excluding a row/column pair; then it's the row in element 0 and the column in element 1) The num2p and p2num routines are as before. ---snip--- /* example usage: */ /* j=num2p(200,f[]) --> 3 0 2 in f[] */ /* n=p2num(f[],j) returns 200 */ define num2p(n, *f[]) { auto i, j, l, s[], z; z = scale; scale = 0; l = n; for(i = 2; i <= l; ++i) { s[i - 2] = 1; } for(i = 2; i <= l; ++i) { for(j = 2; i*j <= l; ++j) { s[i*j - 2] = 0; } } for(i = 2; i <= l; ++i) { print i, ": ", s[i - 2], "\n"; } j = 0; for(i = 2; i <= l; ++i) { if(s[i - 2]) { f[j] = 0; print n, " % ", i, " == ", n % i; while(n % i == 0) { ++f[j]; n = n / i; print "for ", i, " (p#", j, "): n -> ", n, "; f -> ", f[j], "\n"; } ++j; } } for(i = 0; i < j; ++i) { print f[i], " " } print "\n" scale = z; return j; } define void basep(n, *f[]) { auto j, g[], i; j = num2p(n,g[]); for(i = 0; i < j; ++i) { f[i+1] = g[i]; } f[0] = j; bpnorm(f[]); } define bp2num(f[]) { auto i, p[], r, n; r=f[0]; for(i = 0; i < r; ++i) { p[i] = f[i + 1]; } n = p2num(p[],r); return n; } define p2num(p[], r) { auto i, j, l, s[], z, o, k; z = scale; scale = 0; l = r; k = 0; while(k < r) { l = l * 2; for(i = 2; i <= l; ++i) { s[i - 2] = 1; } for(i = 2; i <= l; ++i) { for(j = 2; i*j <= l; ++j) { s[i*j - 2] = 0; } } k = 0; for(i = 2; i <= l; ++i) { if(s[i - 2]) { ++k; } } } print "l=", l, " k=", k, "\n"; for(i = 2; i <= l; ++i) { print i, ": ", s[i - 2], "\n"; } o = 1; j = 0; for(i = 2; i <= l; ++i) { if(s[i - 2]) { if(p[j]) { o = o * i^p[j]; print "after ", i, " (p#", j, "): o -> ", o, " from p:", p[j], "\n"; } ++j; } } scale = z; return o; } define squid(a,b) { auto m, n, p[], q[], r[], j, k, l; j = num2p(a,p[]); k = num2p(b,q[]); l = j + k; print "j:", j, " k:", k, " -> l:", l, "\n"; for(m = 0; m < l; ++m) { r[m] = 0; } for(m = 0; m < j; ++m) { for(n = 0; n < k; ++n) { r[m + n] = r[m + n] + p[m]*q[n]; print "@", m, ",", n, " r->", r[m+n], " from ", p[m], ",", q[n], "\n"; } } return p2num(r[],l); } define void bpconj(p[],*q[]) { auto i; if(p[0] == 0) { q[0] = 1; q[1] = 1; return; } if(p[1] == 0) { for(i = 2; i <= p[0]; ++i) { q[i - 1] = p[i]; } q[0] = p[0] - 1; q[1] = q[1] + 1; } else { for(i = 1; i <= p[0]; ++i) { q[i + 1] = p[i]; } q[1] = 0; q[0] = p[0] + 1; q[2] = q[2] - 1; } } define void bpnorm(*p[]) { auto i, c, b; b=0; for(i = p[0]; i > 0; --i) { if(b == 0) { if(p[i] == 0) { c++; } else { b++; } } } p[0] = p[0] - c; } define void disp(p[]) { auto i; print "{"; for(i = 1; i <= p[0]; ++i) { print p[i]; if(i < p[0]) { print ","; } } print "}\n"; } define void bptree(r,c,*p[]) { auto i, j, s, m, o[], z; s = scale; scale = 0; p[0] = 1; p[1] = 0; for(i = 0; i < r; ++i) { print "@r", i, ":"; m = c / 2; m = m * 2; m = c - m; if(m > 0) { print "R"; o[r - i - 1] = 0; c = (c - 1) / 2; } else { print "L"; o[r - i - 1] = 1; c = c / 2; } print ",c:=", c, "\n"; disp(p[]); } for(i = 0; i < r; ++i) { print "op", i, ":", o[i], "\n"; if(o[i] > 0) { p[1] = p[1] + 1; } else { print "n=", p[0], ":"; disp(p[]); for(j = p[0]; j >= 1; --j) { print "j.", j, ".", p[j], "\n"; p[j + 1] = p[j]; } p[1] = 0; p[0] = p[0] + 1; } disp(p[]); } scale = s; } define void inbptree(p[],*rc[]) { auto g, r, c, i, o[], n; g = 1; n = 0; while(g > 0) { disp(p[]); if(p[0] == 1) { if(p[1] == 0) { p[0] = 0; } } if(p[0] > 0) { if(p[1] > 0) { p[1] = p[1] - 1; o[n++] = 1; print "L\n"; } else { for(i = 1; i < p[0]; ++i) { p[i] = p[i + 1]; } p[0] = p[0] - 1; o[n++] = 0; print "R\n"; } } else { g = 0; } } r = 0; c = 0; for(i = n - 1; i >= 0; --i) { if(o[i] > 0) { r++; c = c * 2; print "op1\n"; } else { r++; c = c * 2 + 1; print "op0\n"; } } rc[0] = r; rc[1] = c; print "(",r,",",c,")\n"; } define void bpseq(n,*p[]) { auto s, r, c, w; s = scale; scale = 0; w = 1; r = 0; c = 0; if(n == 0) { p[0] = 0; return; } while(n >= w) { w = w * 2; ++r; } print "2^",w,">n@r=",r,"\n"; c = n - w / 2; bptree(r,c,p[]); scale = s; } define void nbpord(n,*s[]) { auto i, p[]; for(i = 0; i < n; ++i) { bpseq(i,p[]); print "seq#",i,":"; disp(p[]); s[i + 1] = bp2num(p[]); } s[0] = n; } define void bpordnth(n,*s[]) { auto p[], i, rc[], w, j; for(i = 1; i <= n; ++i) { basep(i,p[]); inbptree(p[],rc[]); if(rc[0] > 0) { w = rc[0] - 1; print "2^",w,"+",rc[1],"="; s[i] = 2^w + rc[1]; } else { s[i] = 0; } print s[i],"\n"; } s[0] = n; } ---snip--- Some new developments, too... run-length encoding, and converting a base-prime number to a binary string (which can in turn be evaluated as a normal number, for further pattern-finding) BP2RLE: << 0 0 0 -> DAT LST CNT RLE << DAT DUP IF SIZE 0 =/= THEN 1 << DUP IF LST == THEN 1 CNT + 'CNT' STO DROP ELSE IF CNT 0 > THEN LST CNT 2 ->ARRY 1 RLE + 'RLE' STO 0 'CNT' STO SWAP END 'LST' STO 1 'CNT' STO END >> DOSUBS IF CNT 0 > THEN IF RLE 0 =/= THEN OBJ-> DROP END LST CNT 2 ->ARRY 1 RLE + 'RLE' STO RLE ->LIST END END >> >> BP2BINSTR: << IF DUP SIZE 0 == THEN DROP 0 ELSE 1 << "0" SWAP IF DUP 0 > THEN 1 SWAP START "1" + NEXT ELSE DROP END >> DOSUBS REVLIST OBJ-> DUP 1 + ROLL TAIL 2 PICK 1 + ROLLD ->LIST << + >> STREAM "#" SWAP + "b" + OBJ-> B->R END >> RLE2BP: << LIST-> IF DUP 0 =/= THEN { } -> B << 1 SWAP FOR X OBJ-> DROP DUP 1 SWAP FOR Y 2 PICK Y 2 + ROLLD NEXT SWAP DROP ->LIST B SWAP + 'B' STO NEXT B >> ELSE { } END >> BINSTR2BP: << 0 R->B ->STR SWAP BIN R->B ->STR DUP SIZE DUP 3 ROLLD 1 - 3 SWAP SUB "0" + SWAP 0 { } -> S L << 3 - 1 SWAP FOR X DUP X X SUB "0" IF =/= THEN S 1 + 'S' STO ELSE S 1 ->LIST L + 'L' STO 0 'S' STO END NEXT DROP S 1 ->LIST L + >> SWAP DUP SIZE DUP SUB IF DUP "h" == THEN HEX END IF DUP "o" == THEN OCT END IF DUP "d" == THEN DEC END DROP >> And two functions for generating the increments along a sequence (the second program is only the increments, whereas the first program includes the first element at the beginning of the output sequence)... DELTAS0: << DUP 0 SWAP LIST-> DROP ->LIST - >> DELTAS1: << DELTAS0 TAIL >> Don't forget that MOD, -, *, +, GCD, and LCM are all interesting routines to pass two lists of equal length into (and the first four of those can be a list and a scalar)

math, primes, baseprime

Previous post Next post
Up