summaryrefslogtreecommitdiff
path: root/misc/pascal/tests/src/104-primes.pas
diff options
context:
space:
mode:
authorpatacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3>2008-01-05 16:36:56 +0000
committerpatacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3>2008-01-05 16:36:56 +0000
commit4887a05481e143bfc4796230605d0a9ff7f2cb5a (patch)
tree495dce9e5a774e6826fa09f2651ae3c8c546822d /misc/pascal/tests/src/104-primes.pas
parent9684605c30d1f7f2f7120d8c1b5645e7ca4eb54f (diff)
downloadnuttx-4887a05481e143bfc4796230605d0a9ff7f2cb5a.tar.gz
nuttx-4887a05481e143bfc4796230605d0a9ff7f2cb5a.tar.bz2
nuttx-4887a05481e143bfc4796230605d0a9ff7f2cb5a.zip
Pascal Tests
git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@504 42af7a65-404d-4744-a932-0658087f49c3
Diffstat (limited to 'misc/pascal/tests/src/104-primes.pas')
-rw-r--r--misc/pascal/tests/src/104-primes.pas43
1 files changed, 43 insertions, 0 deletions
diff --git a/misc/pascal/tests/src/104-primes.pas b/misc/pascal/tests/src/104-primes.pas
new file mode 100644
index 000000000..15adaabf3
--- /dev/null
+++ b/misc/pascal/tests/src/104-primes.pas
@@ -0,0 +1,43 @@
+{ generate the primes between 3..10000 using a
+ sieve containing odd integers in this range. }
+
+program primes(output);
+
+const
+ wdlength = 59; {implementation dependent}
+ maxbit = 58;
+ w = 84; {w=n div wdlength div 2}
+
+var
+ sieve, primes : array[0..w] of set of 0..maxbit;
+ next : record word,bit : integer
+ end;
+ j,k,t,c : integer; empty:boolean;
+
+begin {initialize}
+ for t:=0 to w do
+ begin sieve[t] := [0..maxbit]; primes[t] := [] end;
+ sieve[0] := sieve[0]-[0]; next.word := 0;
+ next.bit := 1; empty := false;
+
+ with next do
+ repeat {find next prime}
+ while not(bit in sieve[word]) do bit := succ(bit);
+ primes[word] := primes[word] + [bit];
+ c := 2*bit + 1;
+ j := bit; k := word;
+ while k<=w do {eliminate}
+ begin sieve[k] := sieve[k] - [j];
+ k := k + word*2; j := j + c;
+ while j>maxbit do
+ begin k := k+1; j := j - wdlength
+ end
+ end;
+ if sieve[word]=[] then
+ begin empty := true; bit := 0
+ end;
+ while empty and (word<w) do
+ begin word := word+1; empty := sieve[word]=[]
+ end
+ until empty; {ends with}
+end.