Started by pk, Jan 17, 2025, 07:10 PM

Previous topic - Next topic

pk(OP)

I implemented a simple prime numbers sieve within a 4 bits arithmetic in Tau. Feel free to post any improvements or modifications here.
And now for the code, it has two sections - I called them modules.
First is the implementation of the arithmetic with binary addition and multiplication, followed by the prime numbers generator section. See below:

#### 4-bit arithmetic module ####
succb(u[15]()) := overflow(1)
succb(overflow(1)) := overflow(1)
succb(bin(b,c,d,e)) := bin(b+(cde),c+(de),d+e,e')
overflow(0) := 0
ovf0(overflow(1)) := 0
ovf0(bin(b,c,d,e)) := 1
cmp(x,overflow(1)) := 0
cmp(bin(b,c,d,e),bin(b,c,d,e)) := 1
cmp(bin(b,c,d,e),bin(n,o,p,q)) := 0
u[0]() := bin(0,0,0,0)
u[t]() := succb(u[t-1]())
addb(overflow(1),x) := overflow(1)
predb(bin(b,c,d,e)) := bin(b+(c|d|e)',c+(d|e)',d+e',e')
addb(bin(0,0,0,0),x) := x
addb(x,bin(0,0,0,0)) := x
addb(bin(b,c,d,e),bin(1,1,1,1)) := overflow(1)
addb(bin(b,c,d,e),bin(n,o,p,q)) := addb(predb(bin(b,c,d,e)),succb(bin(n,o,p,q)))
mulb(bin(0,0,0,0),x) := bin(0,0,0,0)
mulb(x,bin(0,0,0,0)) := bin(0,0,0,0)
mulb(bin(b,c,d,e),bin(n,o,p,q)) := addb(mulb(predb(bin(b,c,d,e)),bin(n,o,p,q)),bin(n,o,p,q))
#### ENDof 4-bit arithmetic module ####


#### prime numbers module ####
oksq(x) := succb(x) & ovf0(mulb(succb(x),succb(x)))
okmul(x,y) := succb(y) & ovf0(mulb(x,succb(y)))
notpr1(u,0) := 0
notpr1(u,bin(b,c,d,e)) := notpr2(u,bin(b,c,d,e),bin(b,c,d,e)) | notpr1(u,oksq(bin(b,c,d,e)))
notpr2(u,x,0) := 0
notpr2(u,x,bin(b,c,d,e)) := cmp(u,mulb(x,bin(b,c,d,e))) | notpr2(u,x,okmul(x,bin(b,c,d,e)))
fndprm(x,prm[1]()) := 0
fndprm(x,prm[t]()) := (notpr1(x,u[2]()))'&prm[t]() | fndprm(predb(x),prm[t-1]())
primes(max[t]()) := fndprm(u[t](),prm[t]())
#### ENDof prime numbers module ####

#### prime numbers demo ####

n primes(max[15]())


pk(OP)

Please see below a significantly quicker version due to the arithmetic update (addition is now performed on bits) and introduction of leq function:

overflow(0) := 0
succb(u[15]()) := overflow(1)
succb(overflow(1)) := overflow(1)
succb(bin(b,c,d,e)) := bin(b+(cde),c+(de),d+e,e')
u[0]() := bin(0,0,0,0)
u[t]() := succb(u[t-1]())
addb(x|overflow(1),y) := overflow(1)
addb(overflow(1),x) := overflow(1)
addb(bin(b,c,d,e),bin(n,o,p,q)) := bin(b+n+(co|(d|p)(c|o)eq|(c|o)dp),c+o+(dp|(d|p)eq),d+p+(eq),e+q) | overflow(1) & (bn|(c|o)(d|p)(b|n)eq|(b|n)(c|o)dp|(b|n)co)
predb(bin(b,c,d,e)) := bin(b+(c|d|e)',c+(d|e)',d+e',e')
mulb(bin(0,0,0,0),x) := bin(0,0,0,0)
mulb(x,bin(0,0,0,0)) := bin(0,0,0,0)
mulb(overflow(1),x) := overflow(1)
mulb(x,overflow(1)) := overflow(1)
mulb(bin(b,c,d,e),bin(n,o,p,q)) := addb(mulb(predb(bin(b,c,d,e)),bin(n,o,p,q)),bin(n,o,p,q))
cmp(x,overflow(1)) := 0
cmp(bin(b,c,d,e),bin(b,c,d,e)) := 1
cmp(bin(b,c,d,e),bin(n,o,p,q)) := 0
leq(x,overflow(1)) := 0
leq(overflow(1),x) := 0
leq(y|overflow(1),x) := 0
leq(bin(b,c,d,e),bin(n,o,p,q)) := (n'b|(o'c)(nb|n'b')|(p'd)(oc|o'c')(nb|n'b')|(q'e)(pd|p'd')(oc|o'c')(nb|n'b'))'
oksq(x,q) := succb(x) & leq(mulb(succb(x),succb(x)),q)
okmul(x,y,q) := succb(y) & leq(mulb(x,succb(y)),q)
notpr1(q,0) := 0
notpr1(q,bin(b,c,d,e)) := notpr2(q,bin(b,c,d,e),bin(b,c,d,e)) | notpr1(q,oksq(bin(b,c,d,e),q))
notpr2(q,x,0) := 0
notpr2(q,x,bin(b,c,d,e)) := cmp(q,mulb(x,bin(b,c,d,e))) | notpr2(q,x,okmul(x,bin(b,c,d,e),q))
fndprm(x,prm[1]()) := 0
fndprm(x,prm[t]()) := (notpr1(x,u[2]()))'&prm[t]() | fndprm(predb(x),prm[t-1]())
primes(max[t]()) := fndprm(u[t](),prm[t]())

n primes(max[15]())