From 670e39d54645cb2fcfb754eb82318b73d2080c81 Mon Sep 17 00:00:00 2001 From: Dan Ballard Date: Mon, 7 Mar 2011 23:01:27 -0800 Subject: [PATCH] initial import of 1.02 --- ChangeLog | 12 + Makefile | 6 + README | 12 + autoTest.pl | 693 +++++++++++++++++++++++++++++++++++++++++++++++ languages | 73 +++++ primes.4.lua | 34 +++ primes.5.lua | 32 +++ primes.5c | 26 ++ primes.R | 4 + primes.adb | 44 +++ primes.alt.c | 43 +++ primes.alt2.c | 42 +++ primes.alt3.c | 49 ++++ primes.awk | 28 ++ primes.c | 41 +++ primes.cbl | 48 ++++ primes.cpp | 61 +++++ primes.cs | 42 +++ primes.e | 61 +++++ primes.erl | 23 ++ primes.f | 29 ++ primes.fasl | Bin 0 -> 4466 bytes primes.fe | 36 +++ primes.fs | 38 +++ primes.hs | 17 ++ primes.html | 95 +++++++ primes.java | 35 +++ primes.lisp | 18 ++ primes.m | 53 ++++ primes.m4 | 9 + primes.ml | 31 +++ primes.pas | 47 ++++ primes.perl.pl | 31 +++ primes.php | 25 ++ primes.pike | 38 +++ primes.prolog.pl | 34 +++ primes.py | 27 ++ primes.r | 28 ++ primes.rb | 36 +++ primes.rexx | 26 ++ primes.scm | 26 ++ primes.sh | 42 +++ primes.sieve.c | 72 +++++ primes.sml | 30 ++ primes.st | 29 ++ primes.tcl | 29 ++ primes.vb | 31 +++ primes.x86.s | 109 ++++++++ primes_prolog.pl | 28 ++ primesoc | Bin 0 -> 8305 bytes src/Main.m3 | 45 +++ src/m3makefile | 5 + 52 files changed, 2473 insertions(+) create mode 100644 ChangeLog create mode 100644 Makefile create mode 100644 README create mode 100755 autoTest.pl create mode 100644 languages create mode 100644 primes.4.lua create mode 100644 primes.5.lua create mode 100755 primes.5c create mode 100644 primes.R create mode 100644 primes.adb create mode 100644 primes.alt.c create mode 100644 primes.alt2.c create mode 100644 primes.alt3.c create mode 100755 primes.awk create mode 100644 primes.c create mode 100644 primes.cbl create mode 100644 primes.cpp create mode 100644 primes.cs create mode 100644 primes.e create mode 100644 primes.erl create mode 100644 primes.f create mode 100644 primes.fasl create mode 100755 primes.fe create mode 100644 primes.fs create mode 100644 primes.hs create mode 100644 primes.html create mode 100644 primes.java create mode 100644 primes.lisp create mode 100644 primes.m create mode 100644 primes.m4 create mode 100644 primes.ml create mode 100644 primes.pas create mode 100755 primes.perl.pl create mode 100755 primes.php create mode 100644 primes.pike create mode 100644 primes.prolog.pl create mode 100755 primes.py create mode 100644 primes.r create mode 100755 primes.rb create mode 100644 primes.rexx create mode 100644 primes.scm create mode 100755 primes.sh create mode 100644 primes.sieve.c create mode 100644 primes.sml create mode 100644 primes.st create mode 100755 primes.tcl create mode 100644 primes.vb create mode 100644 primes.x86.s create mode 100644 primes_prolog.pl create mode 100755 primesoc create mode 100644 src/Main.m3 create mode 100644 src/m3makefile diff --git a/ChangeLog b/ChangeLog new file mode 100644 index 0000000..cf50259 --- /dev/null +++ b/ChangeLog @@ -0,0 +1,12 @@ +1.2 (2011 03 08) +Poked autoTest.pl so lisp now runs on SBCL +Added imports to .cpp and .m so they compiled again +Other changes so things run on Ubuntu 10.04 + +1.1 (2004 10 08) +Added languages Smalltalk and Nickle and M4 +Fixes for autotest.pl +Added README and ChangeLog + +1.0 (2003 12 31) +Full release with 34 languages diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..1ac776f --- /dev/null +++ b/Makefile @@ -0,0 +1,6 @@ + +default: + ./autoTest.pl + +clean: + rm -f *.txt primesc primescpp primesaltc primes.class primespas primes*.exe primes.o primesobjc primes.ali primesada primesfor primese primes.h primes1.c primes1.o primes.id primes.make primescbl link.res ppas.sh primes.beam primesocaml primesasm primes.cmi primes.cmx luac.out primeshs primes_clisp.fas primes.lib Main.hi primes_clisp.lib primes_clisp.o primes.hi primescsieve gst.im primesalt2c primesalt3c diff --git a/README b/README new file mode 100644 index 0000000..17d37c1 --- /dev/null +++ b/README @@ -0,0 +1,12 @@ +http://www.mindstab.net/tags/primes/ +haplo@mindstab.net + +Mindstab.net Multi language prime number project: + Prime number finders in ~38 languages + and a test driver + +2011: Re-release +This project is still a terrible blunt way to see how different languages/implementation perform and compare at basic arithmatic and looping and crudly look at speed. And it's a small roseta stone too. Autotest.pl drives it all and it's appaling speghetti code I wrote half a decade ago and I probably still knew better. I've made a few quick updates since 1.01 from 2006 to make it run on Ubuntu 10.04 which is what I'm running. Your milage may vary, but it's on github now, so feel free to offer suggestions in code. + +2004-2006 +With this project I want to implement prime number finders in as many languages as I can. It's pretty much a way for me to learn a littlebit about a lot of languages. This project also comes with a test program (autoTest.pl) which can run and benchmark all the languages so I can see their various performances (part of learning about the languages). diff --git a/autoTest.pl b/autoTest.pl new file mode 100755 index 0000000..5436cd1 --- /dev/null +++ b/autoTest.pl @@ -0,0 +1,693 @@ +#!/usr/bin/env perl +# www.mindstab.net/primes +# Run prime number finders +# haplo@mindstab.net + +print "Mindstab Development Multi-language Prime Number Project v1.02\n(www.mindstab.net/tag/primes/)\nhaplo\@mindstab.net\n\n"; + +# results file +$RESULTS="results.txt"; +$TIME="time -p"; +$os = `uname`; + +$debug=0; + +@langs = ("c", +# Uncomment for alternat C algorithms +# "c2", "ca", "ca2", "ca3", + "objc", "cpp", "asm", "for", "pas", "ada", "hs", "e", "cbl", "oml", "java", "cs", "vb", "erl", "awk", "pl", "php", "py", "tcl", "rb1.8", "rb1.9", "cl", "scm", "st", "sml", "4th", "pro", "m3", "pike", "lua", "rexx", "r", "fe", "5c", "m4", "sh"); + +$llen = $#langs+1; + +print "Number of iterations to run tests [3]: "; +$itr = ; +chomp($itr); +print "\n"; +if($itr < 1) { $itr = 3; } + +print "Maximun number to search to [100000]: "; +$max = ; +chomp($max); +print "\n"; +if($max < 1) { $max = 100000; } + +#sources + +$data{'c'}{'name'} = "C"; +$data{'c'}{'src'}= "primes.c"; +$data{'c'}{'prog'} = "primesc"; +$data{'c'}{'compiler0'} = "gcc"; +$data{'c'}{'cflags0'} = "-lm -O3 -o " . $data{'c'}{'prog'}; + +$data{'c2'}{'name'} = "C Sieve"; +$data{'c2'}{'src'}= "primes.sieve.c"; +$data{'c2'}{'prog'} = "primescsieve"; +$data{'c2'}{'compiler0'} = "gcc"; +$data{'c2'}{'cflags0'} = "-lm -O3 -o " . $data{'c2'}{'prog'}; + +$data{'ca'}{'name'} = "C Alternate Algorithm (Variable sqrt monitoring)"; +$data{'ca'}{'src'}= "primes.alt.c"; +$data{'ca'}{'prog'} = "primesaltc"; +$data{'ca'}{'compiler0'} = "gcc"; +$data{'ca'}{'cflags0'} = "-lm -O3 -o " . $data{'ca'}{'prog'}; + +$data{'ca2'}{'name'} = "C Alternate2 Algorithm (Variable sqrt monitoring and c math modulus)"; +$data{'ca2'}{'src'}= "primes.alt2.c"; +$data{'ca2'}{'prog'} = "primesalt2c"; +$data{'ca2'}{'compiler0'} = "gcc"; +$data{'ca2'}{'cflags0'} = "-lm -O3 -o " . $data{'ca2'}{'prog'}; + +$data{'ca3'}{'name'} = "C Alternate3 Algorithm (Variable sqrt monitoring and recursion)"; +$data{'ca3'}{'src'}= "primes.alt3.c"; +$data{'ca3'}{'prog'} = "primesalt3c"; +$data{'ca3'}{'compiler0'} = "gcc"; +$data{'ca3'}{'cflags0'} = "-lm -O3 -o " . $data{'ca3'}{'prog'}; + + +$data{'asm'}{'name'} = "x86 Assembly"; +$data{'asm'}{'src'} = "primes.x86.s"; +$data{'asm'}{'prog'} = "primesasm"; +$data{'asm'}{'compiler0'} = "gcc"; +$data{'asm'}{'cflags0'} = "-O3 -o ". $data{'asm'}{'prog'}; +$data{'asm'}{'pre'} = "echo \"$max\" | "; +$data{'asm'}{'osfilter'} = "OpenBSD"; + +$data{'objc'}{'name'} = "Objective C"; +$data{'objc'}{'src'}= "primes.m"; +$data{'objc'}{'compiler0'} = "gcc"; +$data{'objc'}{'prog'} = "primesobjc"; +$data{'objc'}{'cflags0'} = "-lobjc -lm -O3 -o " . $data{'objc'}{'prog'}; +$data{'objc'}{'osfilter'} = "FreeBSD"; + +$data{'cpp'}{'name'} = "C++"; +$data{'cpp'}{'src'}= "primes.cpp"; +$data{'cpp'}{'compiler0'} = "g++"; +$data{'cpp'}{'prog'} = "primescpp"; +$data{'cpp'}{'cflags0'} = "-lm -O3 -o " . $data{'cpp'}{'prog'}; + +$data{'for'}{'name'} = "Fortran"; +$data{'for'}{'src'} = "primes.f"; +$data{'for'}{'compiler0'} = "g77"; +$data{'for'}{'prog'} = "primesfor"; +$data{'for'}{'cflags0'} = "-O3 -o $data{'for'}{'prog'}"; + +$data{'pas'}{'name'} = "Pascal"; +$data{'pas'}{'src'} = "primes.pas"; +$data{'pas'}{'compiler0'} = "fpc"; +$data{'pas'}{'prog'} = "primespas"; +$data{'pas'}{'cflags0'} = "-o$data{'pas'}{'prog'}"; + +$data{'ada'}{'name'} = "Ada"; +$data{'ada'}{'src'} = "primes.adb"; +$data{'ada'}{'compiler0'} = "gnatmake"; +$data{'ada'}{'prog'} = "primesada"; +$data{'ada'}{'cflags0'} = "-o $data{'ada'}{'prog'}"; +$data{'ada'}{'cflagspre0'} = "rm -f primes.ali primes.o && "; + +$data{'e'}{'name'} = "Eiffel"; +$data{'e'}{'src'}= "primes.e"; +$data{'e'}{'compiler0'} = "compile_to_c"; +$data{'e'}{'prog'} = "primese"; +$data{'e'}{'cflags0'} = "$data{'e'}{'src'} -boost -O3 -o " . $data{'e'}{'prog'}. " && sh primes.make"; +$data{'e'}{'cflagspre0'} = "rm -f primes1.o && "; + +$data{'awk'}{'name'} = "AWK"; +$data{'awk'}{'src'} = "primes.awk"; +$data{'awk'}{'pre0'} = "echo $max | "; +$data{'awk'}{'interp0'} = "awk"; +$data{'awk'}{'iflags0'} = "-f " . $data{'awk'}{'src'}; + +$data{'sml'}{'name'} = "SML"; +$data{'sml'}{'src'} = "primes.sml"; +#$data{'sml'}{'iflagspre0'} = "echo primes $max | "; +$data{'sml'}{'iflagspre0'} = "cat $data{'sml'}{'src'} | sed -e 's/.*autotest.*/primes $max/' |"; +$data{'sml'}{'interp0'} = "sml"; +$data{'sml'}{'filter0'} = "sed -e '/[a-zA-Z\\-\\=]/g'"; + +$data{'m4'}{'name'} = "M4"; +$data{'m4'}{'src'} = "primes.m4"; +$data{'m4'}{'iflagspre0'} = "cat $data{'m4'}{'src'} | sed -e 's/.*autotest.*/PRIMES(3,$max,2,4)/' |"; +$data{'m4'}{'interp0'} = "m4"; +$data{'m4'}{'noarg'} = 1; +$data{'m4'}{'warn'} = "Execution is approximately 20-30 times slower than perl."; +$data{'m4'}{'reprompt'} = 1; + +$data{'rexx'}{'name'} = "REXX"; +$data{'rexx'}{'interp0'} = "rexx"; +$data{'rexx'}{'prog'} = "primes.rexx"; + +$data{'r'}{'name'} = "REBOL"; +$data{'r'}{'src'} = "primes.r"; +$data{'r'}{'interp0'} = "rebol"; +$data{'r'}{'iflags0'} = "--quiet $data{'r'}{'src'} $max"; + +$data{'oml'}{'name'} = "OCaml"; +$data{'oml'}{'src'} = "primes.ml"; +$data{'oml'}{'prog'} = "primesocaml"; +$data{'oml'}{'compiler0'} = "ocamlopt"; +$data{'oml'}{'cflags0'} = "-o $data{'oml'}{'prog'}"; +$data{'oml'}{'cflagspre0'} = "rm -f primes.cmi primes.cmx && "; + +$data{'erl'}{'name'} = "Erlang"; +$data{'erl'}{'src'} = "primes.erl"; +$data{'erl'}{'compiler0'} = "erlc"; +$data{'erl'}{'interp0'} = "erl"; +$data{'erl'}{'iflags0'} = "-noshell -s primes primes '$max'"; + +$data{'4th'}{'name'} = "Fourth"; +$data{'4th'}{'src'} = "primes.fs"; +$data{'4th'}{'interp0'} = "gforth-fast"; +$data{'4th'}{'iflags0'} = "$data{'4th'}{'src'} -e '$max 2 4 primes bye'"; + +$data{'cbl'}{'name'} = "COBOL"; +$data{'cbl'}{'src'} = "primes.cbl"; +$data{'cbl'}{'prog'} = "primescbl"; +$data{'cbl'}{'compiler'} = 2; +$data{'cbl'}{'compiler0'} = "cobc"; +$data{'cbl'}{'cflags0'} = "-o $data{'cbl'}{'prog'} -O"; +$data{'cbl'}{'compiler1'} = "htcobolpp"; +$data{'cbl'}{'cflags1'} = "-o $data{'cbl'}{'prog'} -x "; +$data{'cbl'}{'pre'} = "echo \"$max\" | "; +$data{'cbl'}{'warn'} = "Execution is a slower than average, but nothing to worry about"; + +$data{'scm'}{'name'} = "Scheme"; +$data{'scm'}{'src'} = "primes.scm"; +$data{'scm'}{'interp'} = 3; +$data{'scm'}{'interp0'} = "scm"; +$data{'scm'}{'iflags0'} = "-f ". $data{'scm'}{'src'}." -e \\\\\\\"(primes 3 $max)\\\\\\\""; +$data{'scm'}{'interp1'} = "mzscheme"; +$data{'scm'}{'iflags1'} = "-m -f ". $data{'scm'}{'src'}." -e \\\\\\\"(and (primes 3 $max) (exit))\\\\\\\""; +$data{'scm'}{'interp2'} = "guile"; +$data{'scm'}{'iflags2'} = "-l $data{'scm'}{'src'} -c '(primes 3 $max)'"; + +$data{'cl'}{'name'} = "Common Lisp"; +$data{'cl'}{'src'} = "primes.lisp"; +#$data{'cl'}{'compiler'} = 1; +#$data{'cl'}{'compiler0'} = "clisp"; +#$data{'cl'}{'compiler0'} = "gcl"; +#$data{'cl'}{'cflagspre0'} = "rm -f primes_clisp.lib primes_clisp.fas && "; +#$data{'cl'}{'cflagspre0'} = "rm -f primes2.o && "; +#$data{'cl'}{'cflags0'} = "-c"; +#$data{'cl'}{'cflags0'} = "-compile"; +$data{'cl'}{'interp'} = 1;#2 +#$data{'cl'}{'interp0'} = "clisp"; +#$data{'cl'}{'interp0'} = "gcl"; +#$data{'cl'}{'iflags0'} = "-q -i primes2.fas -x '(primes $max)'"; +#$data{'cl'}{'iflags0'} = "-load primes2.o -eval '(progn (primes $max) (bye))'"; +$data{'cl'}{'interp0'} = "sbcl"; +#$data{'cl'}{'interp0'} = "lisp"; +$data{'cl'}{'iflags0'} = "--noinform --load primes.lisp --eval '(progn (primes $max) (quit))'"; +#$data{'cl'}{'iflags0'} = "-quiet -load primes2.cl -eval '(progn (primes $max) (quit))'"; +#"--noinform --load primes_clisp.cl --eval '(progn (primes $max) (quit))'"; +$data{'cl'}{'filter0'} = "sed -e '/[;N]/g'"; +#$data{'cl'}{'filter0'} = "sed -e '/[A-Z]/g'"; + +$data{'pro'}{'name'} = "Prolog"; +$data{'pro'}{'src'} = "primes.prolog.pl"; +$data{'pro'}{'interp'} = 2; +$data{'pro'}{'interp0'} = "pl"; +$data{'pro'}{'iflagspre0'} = "echo '[primes_prolog]. primes($max).' | "; +$data{'pro'}{'iflags0'} = "-q"; +$data{'pro'}{'filter0'} = "sed -e '/?/g'"; +$data{'pro'}{'interp1'} = "gprolog"; +$data{'pro'}{'iflags1'} = "--init-goal '[primes_prolog]' --entry-goal 'primes($max)' --query-goal 'halt(0)'"; +$data{'pro'}{'iflagspre1'} = "export GLOBALSZ=40000; "; +$data{'pro'}{'filter1'} = "sed -e '/[?A-Za-z]/g'"; + +$data{'pl'}{'name'} = "PERL"; +$data{'pl'}{'prog'} = "primes.perl.pl"; +$data{'pl'}{'interp0'} = "perl"; + +$data{'5c'}{'name'} = "Nickle"; +$data{'5c'}{'prog'} = "primes.5c"; +$data{'5c'}{'interp0'} = "nickle"; +$data{'5c'}{'warn'} = "Execution is approximately 20-30 times slower than perl."; +$data{'5c'}{'reprompt'} = 1; + +$data{'st'}{'name'} = "Smalltalk"; +$data{'st'}{'prog'} = "primes.st"; +$data{'st'}{'interp0'} = "gst"; +$data{'st'}{'iflags0'} = "-g $data{'st'}{'prog'} -a $max"; + +$data{'lua'}{'name'} = "Lua"; +$data{'lua'}{'src'} = "primes.#VERSION#.lua"; +#$data{'lua'}{'versionedsrc'} = 1; +$data{'lua'}{'versionfinder'} = "lua -v 2>&1 | awk '{print \$2}' | sed -e 's/[^54]//g'"; +$data{'lua'}{'interp0'} = "lua"; +$data{'lua'}{'iflagspre4'} = "echo $max | "; + +$data{'pike'}{'name'} = "Pike"; +$data{'pike'}{'prog'} = "primes.pike"; +$data{'pike'}{'interp0'} = "pike"; + +$data{'m3'}{'name'} = "Modula-3"; +$data{'m3'}{'compiler0'} = "m3build"; +$data{'m3'}{'prog'} = "`ls */primesm3`"; + +$data{'tcl'}{'name'} = "TCL"; +$data{'tcl'}{'src'} = "primes.tcl"; +$data{'tcl'}{'interp'} = 2; +$data{'tcl'}{'interp0'} = "tclsh"; +$data{'tcl'}{'iflags0'} = "$data{'tcl'}{'src'} $max"; +$data{'tcl'}{'interp1'} = "tclsh8.3"; +$data{'tcl'}{'iflags1'} = "$data{'tcl'}{'src'} $max"; +$data{'tcl'}{'warn'} = "Execution is slower than average, but nothing to worry about"; + +$data{'sh'}{'name'} = "Shell"; +$data{'sh'}{'prog'} = "primes.sh"; +$data{'sh'}{'reprompt'} = 1; +$data{'sh'}{'interp0'} = "sh"; +$data{'sh'}{'warn'} = "Execution is painfully slow.\n\t\t Do not try with numbers greater than a few thousand."; + +$data{'hs'}{'name'} = "Haskell"; +$data{'hs'}{'src'} = "primes.hs"; +$data{'hs'}{'prog'} = "primeshs"; +$data{'hs'}{'compiler'} = 2; +$data{'hs'}{'compiler0'} = "ghc"; +$data{'hs'}{'cflags0'} = "-O -o $data{'hs'}{'prog'}"; +$data{'hs'}{'filter0'} = "sed -e 's/\.\]/\ /g'"; +$data{'hs'}{'cflagspre0'} = "rm -f Main.hi primes.o && "; +$data{'hs'}{'warn'} = "Compiler is slow"; +$data{'hs'}{'compiler1'} = "interpB"; +# Uncomment for Hugs, appears to be crazy slow or broken? +#$data{'hs'}{'interpB'} = "hugs"; +#$data{'hs'}{'preB'} = "echo \'primes 3 $max 2 4\' | "; +#$data{'hs'}{'iflagsB'} = $data{'hs'}{'src'}; +#$data{'hs'}{'filterB'} = "sed -e 's/\.\]/\ /g' | sed -e 's/Main>/\ /g' | sed -e '/[a-zA-Z\/]/g' | sed -e '/ /g' "; +#$data{'hs'}{'warnB'} = "Haskell compiler (ghc) not found.\nFalling back to Haskell interpreter (hugs).\nThis method is very slow!"; + +$data{'py'}{'name'} = "Python"; +$data{'py'}{'prog'} = "primes.py"; +$data{'py'}{'interp0'} = "python"; + +$data{'php'}{'name'} = "PHP"; +$data{'php'}{'prog'} = "primes.php"; +$data{'php'}{'interp0'} = "php"; + +$data{'fe'}{'name'} = "Ferite"; +$data{'fe'}{'prog'} = "primes.fe"; +$data{'fe'}{'interp0'} = "ferite"; +$data{'fe'}{'pre0'} = "echo $max | "; + +$data{'rb1.8'}{'name'} = "Ruby 1.8"; +$data{'rb1.8'}{'prog'} = "primes.rb"; +$data{'rb1.8'}{'interp0'} = "ruby1.8"; + +$data{'rb1.9'}{'name'} = "Ruby 1.9.1"; +$data{'rb1.9'}{'prog'} = "primes.rb"; +$data{'rb1.9'}{'interp0'} = "ruby1.9.1"; + +$data{'java'}{'name'} = "Java"; +$data{'java'}{'src'} = "primes.java"; +$data{'java'}{'compiler0'} = "javac"; +$data{'java'}{'interp0'} = "java"; +$data{'java'}{'prog'} = "primes"; +$data{'java'}{'osfilter'} = "FreeBSD"; +$data{'java'}{'osreprompt'} = "OpenBSD"; +$data{'java'}{'oswarn'} = "OpenBSD"; +$data{'java'}{'oswarnmsg'} = "This language has been flagged as unstable on this operating system"; + +$data{'cs'}{'name'} = "C# (Mono)"; +$data{'cs'}{'src'} = "primes.cs"; +$data{'cs'}{'compiler0'} = "mcs"; +$data{'cs'}{'prog'} = "primescs.exe"; +$data{'cs'}{'cflags0'} = "-o $data{'cs'}{'prog'}"; +$data{'cs'}{'interp'} = 2; +$data{'cs'}{'interp0'} = "mono"; +$data{'cs'}{'interp1'} = "mint"; + +$data{'vb'}{'name'} = "Visual Basic .Net (Mono)"; +$data{'vb'}{'src'} = "primes.vb"; +$data{'vb'}{'compiler0'} = "mbas"; +$data{'vb'}{'prog'} = "primesvb.exe"; +$data{'vb'}{'cflags0'} = "-o $data{'vb'}{'prog'}"; +$data{'vb'}{'interp'} = 2; +$data{'vb'}{'interp0'} = "mono"; +$data{'vb'}{'interp1'} = "mint"; +$data{'vb'}{'osfilter'} = "FreeBSD"; + +sub checkValid +{ + print "Checking outputed results for validity...\n"; + local(@res) = `wc primes.*.txt`; + local($i); + for($i=0; $i < $#res; $i++) + { + $arr[$i][0] = `echo \"$res[$i]\" | awk '{print \$2}'`; + chomp($arr[$i][0]); + chomp($arr[$i][0]); + $arr[$i][1] = `echo \"$res[$i]\" | awk '{print \$4}'`; + chomp($arr[$i][1]); + chomp($arr[$i][1]); + } + + # scan all others for differencees, for each match add 1 to [i][2] + $pt = 0; + for($i=0; $i<=$#arr; $i++) + { + $arr[$i][2] = 0; + for($p=0; $p <= $#arr; $p++) + { + if($p==$i) { next; } + if($arr[$i][0] == $arr[$p][0]) { $arr[$i][2]++; } + } + if($arr[$i][2] > $pt) {$pt = $arr[$i][2];} + } + + print "Checked ". ($#arr+1)." ouput files of $execd executed languages for validity:\n"; + + if($pt != $#arr ) + { + print "Differences detected in ".(($#arr+1)-($pt+1)) ." output files:\n"; + for($i=0; $i<= $#arr; $i++) + { + if($arr[$i][2] < $pt || $pt == 0) { + print "\t". $arr[$i][1]."\n"; + } + } + } else { + print "All output appears to be valid!\n"; + } + print "View benchmark results in 'results.txt'\n"; +} + + +sub parseTimes +{ + if($debug) { + print "\n$cmd\n"; + } + for($i=0; $i< $itr; $i++) + { + if($rcmd ne "") { `$rcmd`; } + my $tstr = `$cmd`; + print "."; + ($tm[$i][0], $tm[$i][1], $tm[$i][2]) = $tstr =~ + /[^\d]*(\d*\.\d*)[^\d]*(\d*\.\d*)[^\d]*(\d*\.\d*).*/; + } + my $tr = $tu = $ts =0.0; + for($i=0; $i< $itr; $i++) + { + $tr += $tm[$i][0]; + $tu += $tm[$i][1]; + $ts += $tm[$i][2]; + } + $tr /= $itr; + $tu /= $itr; + $ts /= $itr; + $tr = substr($tr, 0,4); + $tu = substr($tu, 0,4); + $ts = substr($ts, 0,4); + #print results "$tr real\t$tu user\t$ts sys\n"; + if(length($tr) == 1) { $tr .= "."; } + if(length($tr) == 2) { $tr .= "0"; } + if(length($tr) == 3) { $tr .= "0"; } + print results "$tr seconds\n"; +} + +sub getByLocate +{ + local($where) = `locate $_[0] | grep bin | grep -v cgi | grep -v port | grep -v src`; + ($where) = $where =~ /(.*\/$_[0])\n.*$/; + #print "WHERE: '$where'\n"; + if($where eq "") { return ""; } else { return $where; } +} + + +sub getInterp +{ + local($where) = `/usr/bin/whereis $_[0] | grep -v port`; + if(! ($where =~ "\:")) { + if($where eq "") { return getByLocate($_[0]); } + else { return "/usr/bin/env $_[0]"; + } + } else + { + local($t1, $t2) = split(":", $where); + chomp($t2); + if($t2 ne "") { + return "/usr/bin/env $_[0]"; + } else { + return getByLocate($_[0]); + } + } +} + +# HEADER + +open(results, ">".$RESULTS) || die("Cannot open $RESULTS\n"); + +print results "Prime number benchmarks\n"; + +$mach = `uname -a`; +print results "Benchmark machine: " . $mach."\n"; + +# TESTS + +$yesall = 0; +$item = 0; +$execd = 0; +$compiler=""; +foreach $l (@langs) +{ + $item++; + $interpB = 0; + $compiler = ""; + $version = ""; + + if($data{$l}{'osreprompt'} && $os =~ $data{$l}{'osreprompt'}) { + $data{$l}{'reprompt'} = 1; + } + if($data{$l}{'osreprompt'} && $os =~ $data{$l}{'oswarn'}) { + $data{$l}{'warn'} = $data{$l}{'oswarnmsg'}; + } + + if($yesall == 0 || $data{$l}{'reprompt'}){ + print "($item/$llen) Run ".$data{$l}{"name"}." test\n"; + if($data{$l}{'warn'} && !$data{$l}{"reprompt"}) { print "WARNING: $data{$l}{'warn'}\n";} + + if($data{$l}{'reprompt'}) { + print "RE-PROMPT: WARNING: "; + if($data{$l}{"warn"}) { + print $data{$l}{'warn'}; + } else { + print "Execution is excessively slow."; + } + print "\n"; + } + + print "(Y)es yes(A)ll (Q)uit [N]o : "; + $query = ; + $query = substr($query,0,1); + } + if($query eq "a" || $query eq "A") + { + $yesall = 1; + } + if(($yesall == 1 && !$data{$l}{'reprompt'}) || $query eq "y" || $query eq "Y" ) + { + if($yesall == 1) { + if($query eq "n" || $query eq "N") { $query = "y";} + } + if($query eq "Y") {$query eq "y"; } + if($yesall == 1 && $query eq "y" && !$data{$l}{'reprompt'}) { + print "($item/$llen) "; + } + + print "Testing ". $data{$l}{"name"}.":\n"; + + if($data{$l}{'warn'} && $yesall && $query eq "y") { print "WARNING: $data{$l}{'warn'}\n";} + + if($query eq "A" || $query eq "a") {$query = "y";} + + print results "($item/$llen) ". $data{$l}{"name"}." results:\n"; + + if( $data{$l}{'osfilter'} and $os =~ $data{$l}{'osfilter'}) + { + print "ERROR: This language is flagged as incompatible with this operating system\n\n"; + print results "ERROR: This language is flagged as incompatible with this operating system\n\n"; + next; + } + + $cmd=""; + if( $data{$l}{"compiler0"}) + { + print "Compiling"; + print results "Compile"; + if($l ne "java" && $l ne "m3") {$rcmd = "rm -f $data{$l}{'prog'}";} + else { $rcmd = "";} + $cmd .= "sh "; + if(!$debug) { $cmd .= "2>&1 "; } + $cmd .= "-c \"" .$TIME . " sh -c \\\""; + + $cp = 0; + if(! $data{$l}{'compiler'}) + { + $data{$l}{'compiler'} = 1; + } + + for(; $cp < $data{$l}{'compiler'}; $cp++) + { + if($data{$l}{"compiler$cp"} eq "interpB") + { + $cp = $data{$l}{'compiler'}; + $interpB = 1; + last; + } + $comp = getInterp($data{$l}{"compiler$cp"}); + last if($comp ne ""); + } + if($cp == $data{$l}{'compiler'}) { + $clist = ""; + for($p=0;$p<$data{$l}{'compiler'};$p++) + { + last if($data{$l}{"compiler$p"} eq "interpB"); + $clist .= "\t\t\t($p) ". $data{$l}{"compiler$p"}."\n"; + } + print ":\tERROR - Unable to find one of the following compiler(s):\n$clist\n"; + print results ":\tERROR - Unable to find one of the following compiler(s):\n$clist\n"; + if(! $interpB) { next; } + } + if(!$interpB) { + $compiler = $data{$l}{"compiler$cp"}; + print " [$compiler] "; + print results " [$compiler]:\t"; + if(length($compiler) < 5) {print results "\t";} + if($data{$l}{"cflagspre$cp"}) { $cmd .= $data{$l}{"cflagspre$cp"};} + $cmd .= "$comp "; + if( $data{$l}{"cflags$cp"} ) + { + $cmd .= $data{$l}{"cflags$cp"}; + } + $cmd .= " ".$data{$l}{"src"}." "; + $cmd .= "\\\"\""; + + #printf "CMD: '$cmd'\n"; + parseTimes(); + $rcmd = ""; + print "\n"; + } + + } + + if($interpB && $data{$l}{'warnB'}) + { + print "WARNING: ".$data{$l}{'warnB'}."\n"; + } + + print "Executing"; + print results "Execute"; + + $filter = ""; + $interpreter = ""; + $cmd = "sh "; + if(!$debug) { $cmd .= "2>&1 "; } + $cmd .= "-c \"". $TIME . " sh -c \\\""; + if( $data{$l}{"interp0"} or $interpB) + { + $ip=0; + if(! $data{$l}{'interp'}) { + $data{$l}{'interp'} = 1; + } + + if($interpB) { + $interp = getInterp($data{$l}{'interpB'}); + if($interp eq "") { + $ip = $data{$l}{'interp'}; + } else { + $ip = "B"; + } + } + else { + for(; $ip < $data{$l}{'interp'}; $ip++) + { + + $interp = getInterp($data{$l}{"interp$ip"}); + + last if($interp ne ""); + } + } + if($ip == $data{$l}{'interp'}) + { + + $ilist = ""; + if($interpB) { + $ilist = "\t".$data{$l}{'interpB'}."\n"; + } else + { + for($p=0;$p<$data{$l}{'interp'};$p++) + { + $ilist .= "\t\t\t($p) " .$data{$l}{"interp$p"}."\n"; + } + } + print ":\tERROR - Unable to find one of the following interpreter(s):\n$ilist\n"; + print results ":\tERROR - Unable to find one of the following interpreter(s):\n$ilist\n"; + next; + } + + $interpreter = $data{$l}{"interp$ip"}; + print " [$interpreter]"; + print results " [$interpreter]"; + + $filter = $data{$l}{"filter$ip"}; + $cmd .= $data{$l}{"pre$ip"}; + $cmd .= $data{$l}{"iflagspre$ip"}; + $cmd .= "$interp "; + if(!$data{$l}{'noarg'}) + { + if( $data{$l}{"iflags$ip"}) + { + $cmd .= $data{$l}{"iflags$ip"}. " "; + } elsif( $data{$l}{"prog"} ) + { + $cmd .= $data{$l}{"prog"}." $max "; + } else + { + if($data{$l}{"versionfinder"}) { + $version = `$data{$l}{"versionfinder"}`; + chomp($version); + $data{$l}{'src'} =~ s/#VERSION#/$version/; + } + if($version) { + if($data{$l}{"iflagspre$version"}) + { + $cmd = $data{$l}{"iflagspre$version"} . $cmd; + } + } + $cmd .= $data{$l}{"src"}. " "; + $cmd .= "$max "; + } + } + } else + { + if($data{$l}{'pre'}) { $cmd .= $data{$l}{'pre'};} + $cmd .= "./" . $data{$l}{"prog"} . " $max"; + $filter = $data{$l}{"filter$cp"}; + } + if($filter) { $cmd .= " | $filter "; } + $cmd .= " > primes.$l.txt"; + $cmd .= "\\\"\""; + print " "; + print results ":\t"; + if(length($interpreter) < 5) { print results "\t";} + parseTimes(); + print "\n"; + + print results "\n"; + sleep 1; + $execd++; + } + elsif( $query eq "q" || $query eq "Q") + { + print "\n"; + checkValid(); + print "Quiting\n"; + close(results); + exit; + } + print "\n"; +} + +checkValid(); + +close(results); diff --git a/languages b/languages new file mode 100644 index 0000000..902d6e3 --- /dev/null +++ b/languages @@ -0,0 +1,73 @@ +LANGUAGES + +* = implemented +$ = implemented but no interpreter compatible with autotest + +Rankings from freashmeat late 2003 +number = number of projects on freshmeat.net (my crude ranking) + +C * 5631 +PERL * 2802 +C++ * 2545 +Java * 2473 +PHP * 2122 +Python * 1235 +Unix Shell * 565 +TCL * 360 +JavaScript $ 253 +Assmembly * 179 +Objctive C * 142 +Ruby * 133 +Lisp+CLisp * 98 +Pascal+Delphi * 88 +Scheme * 80 +C# * 47 +Fortran * 47 +Ada * 44 +Awk * 42 +VBasic+Basic * 32 +Haskell * 30 +ML * 26 +caml/OCaml * 23 +SmallTalk * 21 +Eiffel * 21 +Forth * 17 +Erlang * 11 +Prolog * 8 +Cobol * +Modula * +Pike * +Rexx * +lua * +REBOL * +Ferite * + +APL? 3 + + +Rankings from http://merd.net/pixel/language-study +Statistics on usenet 1999 and 2000 in 3 graphs + +java * +c++ * +c * +perl * +basic * +python * +javascript * +tcl * +ruby * +pascal * + +ruby * +lisp * +ada * +smalltalk * +cobol * + +fortran * +forth * +scheme * +eiffel * +prolog * +ml * diff --git a/primes.4.lua b/primes.4.lua new file mode 100644 index 0000000..6908dd2 --- /dev/null +++ b/primes.4.lua @@ -0,0 +1,34 @@ +-- Lua 4 version of a Prime Number Finder +-- haplo@mindstab.net + +function primes(max) + cnt = 3 + while cnt <= max do + sq = sqrt(cnt) + isp = 1 + i = 3 + while i <= sq and isp ~= 0 do + isp = mod(cnt, i) + i = i+2 + end + if isp ~= 0 then + print(cnt) + end + cnt = cnt + 2 + end +end + + +--argc = table.getn(arg) + +argc = read() +max = tonumber(argc) +if max < 1 then + print("Usage: echo [Max Num] | lua primes.lua") +else + if not max then + print("Invalid Max Num") + else + primes(max) + end +end diff --git a/primes.5.lua b/primes.5.lua new file mode 100644 index 0000000..fc4d486 --- /dev/null +++ b/primes.5.lua @@ -0,0 +1,32 @@ +-- Lua 5 version of a Prime Number Finder +-- haplo@mindstab.net + +function primes(max) + cnt = 3 + while cnt <= max do + sq = math.sqrt(cnt) + isp = 1 + i = 3 + while i <= sq and isp ~= 0 do + isp = math.mod(cnt, i) + i = i+2 + end + if isp ~= 0 then + print(cnt) + end + cnt = cnt + 2 + end +end + + +argc = table.getn(arg) +if argc < 1 then + print("Usage: primeslua [Max Num]") +else + max = tonumber(arg[1]) + if not max then + print("Invalid Max Num") + else + primes(max) + end +end diff --git a/primes.5c b/primes.5c new file mode 100755 index 0000000..c610291 --- /dev/null +++ b/primes.5c @@ -0,0 +1,26 @@ +#!/usr/bin/env nickle +# nickle version of a prime number finder +# haplo@mindstab.net + +if (dim(argv) <= 1) +{ + printf("Usage: primes.5c [Max]\n"); + exit(1); +} + +int max = atoi(argv[1]); + +for ( int number = 3; number <= max; number += 2) +{ + low_max = sqrt(number); + isPrime = true; + for ( int factor = 3; factor <= low_max; factor += 2) + { + if ( number % factor == 0) + { + isPrime = false; + break; + } + } + if (isPrime) printf("%d\n", number); +} diff --git a/primes.R b/primes.R new file mode 100644 index 0000000..57661ad --- /dev/null +++ b/primes.R @@ -0,0 +1,4 @@ +for ( number in 3:100 by 2) { + print (number) + number <- number + 1 +} diff --git a/primes.adb b/primes.adb new file mode 100644 index 0000000..09c82fe --- /dev/null +++ b/primes.adb @@ -0,0 +1,44 @@ +-- Ada version of a Prime Number Finder +-- Built with gnatmake 3.15p and gcc 3.2.3 +-- haplo@mindstab.net + +with Ada.Text_IO, Ada.Numerics.Elementary_Functions, Ada.Command_Line; +use Ada.Text_IO, Ada.Numerics.Elementary_Functions, Ada.Command_Line; + +procedure primes is + package int_io is new integer_io(integer); + use int_io; + cnt, i, isPrime, test, MAX : integer; +begin + if argument_count >= 1 then + MAX := integer'value( argument(1) ); + else + put_line("Useage: primesada [Max Num]"); + return; + end if; + + if MAX < 1 then + put_line("Max Num invalid"); + return; + end if; + + cnt := 3; + while cnt <= MAX loop + test := integer(sqrt(float(cnt))); + isPrime := 1; + i := 3; + while i <= test loop + if cnt mod i = 0 then + isPrime := 0; + exit; + end if; + i := i + 2; + end loop; + if isPrime /= 0 then + put(cnt, width=>0); + new_line(1); + end if; + cnt := cnt + 2; + end loop; + +end primes; diff --git a/primes.alt.c b/primes.alt.c new file mode 100644 index 0000000..c18b25a --- /dev/null +++ b/primes.alt.c @@ -0,0 +1,43 @@ +// C version of a Prime Number Finder +// Alternate Algorithm: Instead of using sqrt function, +// track it with two variables +// haplo@mindstab.net + +#include +#include + +int main(int argc, char **argv) +{ + unsigned int i, x, max=2, isP, sqr=4; + unsigned int MAX_NUM; + + if(argc < 2) { + printf("primesaltc \n"); + return -1; + } else { + MAX_NUM = atoi(argv[1]); + } + if(MAX_NUM < 1) + { + printf("Invalid MAX_NUM specified\n"); + return -1; + } + for(i=3; i<=MAX_NUM; i+=2) + { + isP=1; + for(x = 3; x<=max; x+=2) + { + if( ! (i%x)){ + isP=0; + break; + } + } + if(isP) printf("%d\n", i,max, sqr); + + if(i>=sqr) { + max++; + sqr = max*max -2; + } + + } +} diff --git a/primes.alt2.c b/primes.alt2.c new file mode 100644 index 0000000..decd8c4 --- /dev/null +++ b/primes.alt2.c @@ -0,0 +1,42 @@ +// C version of a Prime Number Finder +// Alternate Algorithm: Instead of using sqrt function, +// track it with two variables +// haplo@mindstab.net + +#include +#include + +int main(int argc, char **argv) +{ + unsigned int i, x, max=2, isP, sqr=4; + unsigned int MAX_NUM; + + if(argc < 2) { + printf("primesaltc \n"); + return -1; + } else { + MAX_NUM = atoi(argv[1]); + } + if(MAX_NUM < 1) + { + printf("Invalid MAX_NUM specified\n"); + return -1; + } + for(i=3; i<=MAX_NUM; i+=2) + { + isP=1; + for(x = 3; x<=max; x+=2) + { + isP = i - (x* (i/x)); + if(isP == 0) break; + + } + if(isP) printf("%d\n", i,max, sqr); + + if(i>=sqr) { + max++; + sqr = max*max -2; + } + + } +} diff --git a/primes.alt3.c b/primes.alt3.c new file mode 100644 index 0000000..036877f --- /dev/null +++ b/primes.alt3.c @@ -0,0 +1,49 @@ +// C version of a Prime Number Finder +// Alternate Algorithm: Instead of using sqrt function, +// track it with two variables +// haplo@mindstab.net + +#include +#include + +int check(int i, int cnt, int m) +{ + if(i > m) return 1; + else { + if( (cnt%i)==0) return 0; + return check(i+2,cnt, m); + } +} + +int primes(int c, int m, int sq, int sqm) +{ + if(c > m) return 1; else + { + if(check(3,c,sq)) + printf("%d\n", c); + if(c>=sqm) { + sq++; + sqm = sq*sq; + } + return primes(c+2, m, sq, sqm); + } +} + +int main(int argc, char **argv) +{ + unsigned int i, x, max=2, isP, sqr=4; + unsigned int MAX_NUM; + + if(argc < 2) { + printf("primesaltc \n"); + return -1; + } else { + MAX_NUM = atoi(argv[1]); + } + if(MAX_NUM < 1) + { + printf("Invalid MAX_NUM specified\n"); + return -1; + } + primes(3, MAX_NUM, 2,4); +} diff --git a/primes.awk b/primes.awk new file mode 100755 index 0000000..0b8720d --- /dev/null +++ b/primes.awk @@ -0,0 +1,28 @@ +#!/usr/bin/awk -f +# AWK version of a Prime Number Finder +# haplo@mindstab.net + +{ max = $1; } + +END { + if(max < 1) + { + print "primes.awk " + } else + for (i=3; i < max ; i+=2) + { + maxT = sqrt(i)+1 + isPrime = 1 + for (p=3; p < maxT; p+=2) + { + isPrime = i % p + if( isPrime == 0) + { + break + } + } + if(isPrime != 0) { + print i + } + } +} diff --git a/primes.c b/primes.c new file mode 100644 index 0000000..951c5b0 --- /dev/null +++ b/primes.c @@ -0,0 +1,41 @@ +// C version of a Prime Number Finder +// haplo@mindstab.net + +#include +#include +#include + +int main(int argc, char ** argv) +{ + unsigned int counter, max_test, tester; + char isPrime; + unsigned int MAX_NUM; + + if(argc < 2) { + printf("primesc \n"); + return 1; + } else { + MAX_NUM = atoi(argv[1]); + } + if(MAX_NUM < 1) + { + printf("Invalid MAX_NUM specified\n"); + return 1; + } + + for(counter =3; counter<= MAX_NUM; counter +=2) + { + max_test = (int) sqrt((double) counter); + isPrime = 1; + + for(tester =3; tester <= max_test; tester += 2) + { + if(! (counter % tester)) { + isPrime = 0; + break; + } + } + if(isPrime) printf("%d\n", counter); + } + return 0; +} diff --git a/primes.cbl b/primes.cbl new file mode 100644 index 0000000..d89dfb1 --- /dev/null +++ b/primes.cbl @@ -0,0 +1,48 @@ + IDENTIFICATION DIVISION. + PROGRAM-ID. primes. + AUTHOR. Dan Ballard. + + DATA DIVISION. + WORKING-STORAGE SECTION. + 01 Cnt PIC S9(10) VALUE 3. + 01 TMax PIC S9(10) VALUE 3. + 01 I PIC S9(10) VALUE 0. + 01 isp PIC S9(10) VALUE 1. + 01 tmp PIC S9(10) VALUE 1. + 01 break PIC 9 VALUE 0. + 01 MAX PIC S9(10) VALUE 20. + 01 SQT PIC S9(10) VALUE 4. + 01 SQ PIC S9(10) VALUE 2. + + PROCEDURE DIVISION. + Main. + ACCEPT MAX + IF MAX < 1 + DISPLAY "Invalid Max Num" + EXIT + END-IF + PERFORM UNTIL Cnt > MAX + MOVE 3 TO I + MOVE 0 TO break + MOVE 1 TO isp + + PERFORM UNTIL I > SQ OR break = 1 + MOVE Cnt TO isp + DIVIDE Cnt BY i GIVING tmp REMAINDER isp + IF isp = 0 + MOVE 1 TO break + END-IF + ADD 2 TO I + END-PERFORM + + IF NOT isp = 0 + DISPLAY Cnt + END-IF + + ADD 2 TO Cnt + IF Cnt > SQT + ADD 1 TO SQ + MULTIPLY SQ BY SQ GIVING SQT + END-IF + END-PERFORM + STOP RUN. diff --git a/primes.cpp b/primes.cpp new file mode 100644 index 0000000..f701911 --- /dev/null +++ b/primes.cpp @@ -0,0 +1,61 @@ +// C++ version of a Prime Number Finder +// haplo@mindstab.net + +#include +#include +#include +#include + +using namespace std; + +class CPrimes +{ + public: + void countPrimes(unsigned int MAX); +}; + + +void CPrimes::countPrimes(unsigned int MAX) +{ + for(unsigned int cnt = 3; cnt <= MAX; cnt+=2) + { + int test = (int)sqrt((double)cnt); + char isPrime=1; + for(int i = 3; i<= test; i+=2) + { + if(! (cnt % i)) + { + isPrime = 0; + break; + } + } + + if(isPrime) + { + cout << cnt << endl; + } + } +} + +int main(int argc, char **argv) +{ + + int MAX; + if(argc <= 1) { + cout << "Useage: primescpp [Max Num]" << endl; + return(1); + } else { + MAX = atoi(argv[1]); + } + + if(MAX < 1) { + cout << "Invalide Max Num" << endl; + return(1); + } + + CPrimes *primes = new CPrimes(); + primes->countPrimes(MAX); + delete primes; + + return(0); +} diff --git a/primes.cs b/primes.cs new file mode 100644 index 0000000..52ff4b4 --- /dev/null +++ b/primes.cs @@ -0,0 +1,42 @@ +// C# version of a Prime Number Finder +// Build under Mono .28 +// haplo@mindstab.net + +using System; + +class Primes { + private static void Main(String[] argv) + { + int MAX=0; + if(argv.Length >= 1) { + try { + MAX = (int)Convert.ToDouble(argv[0]); + } catch { + Console.WriteLine("Invalid Max Num"); + return; + } + + } else { + Console.WriteLine("Useage: primes.exe [Max Num]"); + return; + } + + for(int cnt = 3; cnt <= MAX; cnt+= 2) + { + int test = (int) Math.Sqrt(cnt); + int isPrime = 1; + for(int i=3; i <= test; i+=2) + { + isPrime = cnt % i; + if( isPrime == 0) { + break; + } + } + if(isPrime != 0) + { + Console.WriteLine(cnt); + } + } + } +} + diff --git a/primes.e b/primes.e new file mode 100644 index 0000000..8b71478 --- /dev/null +++ b/primes.e @@ -0,0 +1,61 @@ +-- Eiffel version of a Prime Number Finder +-- haplo@mindstab.net +-- Anyone know how to round off doubles? or cast them to integers please +-- email me. I should be able to speed this up then. + +class PRIMES + +creation make + +feature + + make is + local + max, i, cnt, isprime : INTEGER; + test: DOUBLE; + stop : BOOLEAN; + do + if argument_count < 1 or else not argument(1).is_integer then + io.put_string("Useage: primese [Max Num]%N"); + die_with_code(exit_failure_code); + else + max := argument(1).to_integer; + end; + + from + cnt := 3; + until + cnt > max + loop + test := cnt.sqrt; + isprime := 1; + stop := false; + + from + i := 3; + until + i > test or stop + loop + from + isprime := cnt; + until + isprime < i + loop + isprime := isprime-i; + end; + --isprime := cnt - (i* do_round_down(cnt/i)); + if isprime = 0 then + stop := true + end; + i := i + 2; + end; + + if isprime /= 0 then + io.put_integer(cnt); + io.put_string("%N"); + end; + cnt := cnt + 2; + end; + end; +end + diff --git a/primes.erl b/primes.erl new file mode 100644 index 0000000..9f9db21 --- /dev/null +++ b/primes.erl @@ -0,0 +1,23 @@ +% Erlang version of a Prime Number Finder +% haplo@mindstab.net +-module(primes). +-author('haplo@mindstab.net'). +-export([primes/1]). + +check(I, Cnt, Max) when I < Max, (Cnt rem I) == 0 -> 0; +check(I, Cnt, Max) when I < Max -> check(I+2, Cnt, Max); +check(I, Cnt, Max) -> 1. + +primes([Max]) -> primes(3, list_to_integer(atom_to_list(Max)), 2, 4); +primes(Max) -> primes(3, Max, 2, 4). + +primes(Cnt, Max, Sq, Sqm) when Cnt < Max, Cnt >= Sqm -> + primes(Cnt, Max, Sq+1, (Sq+1)*(Sq+1)); +primes(Cnt, Max, Sq, Sqm) when Cnt < Max -> + case check(3, Cnt, Sq) of + 0 -> 0; + C -> io:format("~p\n", [Cnt]) + end, + primes(Cnt+2, Max, Sq, Sqm) + ; +primes(Cnt, Max, Sq, Sqm) -> init:stop(). diff --git a/primes.f b/primes.f new file mode 100644 index 0000000..e018a91 --- /dev/null +++ b/primes.f @@ -0,0 +1,29 @@ +c Fortran version of a Prime Number Finder +c haplo@mindstab.net + + program primes + implicit none + real test, i; + integer isPrime, amax, cnt; + character *32 buff; + if (iargc() >= 1) then + call getarg(1, buff); + read(buff, *) amax; + else + print*, "Useage: primesf [Max Num]"; + return + endif + + do cnt = 3, amax, + 2 + test = sqrt(float(cnt)); + isPrime=1; + do test = 3, test, +2 + if (mod(cnt, test) == 0) then + isPrime=0; + exit; + endif + enddo + if(isPrime /= 0) print*,cnt +c if(isPrime /= 0) write(*,'(I3.1)'),cnt + enddo + end diff --git a/primes.fasl b/primes.fasl new file mode 100644 index 0000000000000000000000000000000000000000..ec0eecdf88b42626f4f380bc56554c39d325b87f GIT binary patch literal 4466 zcmb_f?N3u@6z|jL-cl$C_%h$-yuwv0N})^*0b~P2LEAzLb?W96p_@bstfg$svCT22 zc!RoR`?zFb*?+JsnO}_iuq~PHqo2&O#4nohfh=ZIW5RyFdwa3IRBHly`n;XdWL`g#Vdl8N4`_*m6&qCXx>rW@Zt ze{#4CQavMD_lZ;@+1E3+O$+vnX|>z5n(FFW&F`;!bw^#z4y`Gub?)v4>(HQI4yV zNkn)Yu8rvJ2DO6rfTExfC_Gcrf~EsRArkvsA{YS(NCgDs97Q=MR0Ko?PL(Ka=~?#o zgBlh5lurv77jSo@Pj*`~nVLYHCsc!!4FQE59C3xpXOxfe+XrI15hSE5;Nli&C)sJU z4b-4J%FjZdUZ&_$-yCw&P--9pH$@+?PeJxWc@*asxoZ249MrBm6kXSYx?X;sBfb0& zVq=8H>lU&g%e_t^SL)8R&QW(DB$9;k~;{Zv$-XX z1NocqONTH3D8nG&I5WmJxyl=SK3}7d8|B8;LT+NaR>;kWBrj+SytItxMnS50(P*;o z$HKLC7s62)Av1&5>Y(420TV^?%ykNWTkOM&uhpl zp8O9y=bG*{yi|N<7F{DcXN=DpHzsBa4Yd>#Ke_QUb@GAn_k5?C$h%A=~JSpi=I6K6Q8gmTT<>v|yW60%LofMh7s2EGzJPQl>y zIGqgmFld>Ofq*-+-ZQf8D`J-lRaL7E#v=8c@@SdKtrH7Cwt5CP2OEF?q+*{b96R>j&8wI7T?mBoV%AxfKVy7uq1sqQHuXfMGfOF0t!k=JJY7v$nvH*~ zS{uD{xe!Yk3 zqm}DxfryN966fD8_aTG^WKdPn#$^Xm!yp0!&tjwlGa(EiJy;`w^f1gwdM}+G66y4i zw9*6aqcrcsh;<)aS?|IqEYO3^X2|Ppnepz-jCbl9H3K~b>)yA5_XB+kzQeXWjB<)t z-(kpHV~R{!d>=B%PjP4l`A0&I*CT;eFp9GL*+H(PHXtgmr{i(q4VV#PFA`)m&<1yZ z0!!LUh5QuGMswQq^=I_8Q|E`?1QYM)Y0plkJ^O{_S*PvUGqtLsY?VMPaX5Z;Y{O^Q zS=~{l#(%l?JM!UFnc6(6v3E{JLyDadnc0|!kSz=CY{@FmENFiwX3LBjS#KIKflnZO h;GOs93wc4vi&w`1;RK<}RG;qp)7{q^zeMl#{{d`udo%z5 literal 0 HcmV?d00001 diff --git a/primes.fe b/primes.fe new file mode 100755 index 0000000..1784ada --- /dev/null +++ b/primes.fe @@ -0,0 +1,36 @@ +#!/usr/bin/env ferite +/* Ferite version of a Prime Number Finder + * haplo@mindstab.net */ + +uses "array", "console", "math"; + +array fncArgs; +number MAX, cnt, test, i, remainder; +string foo; + +MAX = 10; + +foo = Console.readln(); +foo = String.trim(foo, "\n"); +if(String.isNumber(foo)) +{ + MAX = String.toNumber(foo); +} else { + Console.println("Useage: primes.fe [Max Num]\n"); +} +if(MAX < 1) { Console.println("Invalid Max Num\n"); } + +i = 0; + +for(cnt = 3; cnt <= MAX; cnt +=2) +{ + test = Math.sqrt(cnt); + remainder=1; + for(i=3; i<= test; i+=2) + { + remainder = cnt%i; + if(! remainder) break; + } + if(remainder) + Console.println(cnt); +} diff --git a/primes.fs b/primes.fs new file mode 100644 index 0000000..8f324b5 --- /dev/null +++ b/primes.fs @@ -0,0 +1,38 @@ +( Forth version of a Prime Number Finder + haplo@mindstab.net ) + +: check ( m cnt -- b ) + { m cnt } + \ var i + -1 3 -1 + begin + over m <= and while + nip + dup 2 + swap cnt swap mod tuck ( # cnt+2 # ) + repeat + drop + ; + +: primes ( m sq sqm -- ) + { m sq sqm } + \ var i sq sqm + sqm sq 3 + begin + dup m <= while + over over \ sq(max) cnt + check ( max cnt -- b ) + if dup . CR then + 2 + + rot ( sq cnt sqm ) over over + > if + rot ( cnt sqm sq ) + 1 + nip ( cnt sq ) + dup dup * ( cnt sq sqm ) + rot swap ( sq cnt sqm ) + then + \ sqm sq 3 + rot rot + repeat + drop drop drop + ; + diff --git a/primes.hs b/primes.hs new file mode 100644 index 0000000..e20cd13 --- /dev/null +++ b/primes.hs @@ -0,0 +1,17 @@ +-- Haskell version of a Prime Number Finder +-- haplo@mindstab.net + +import System + +check i c m | i > m = [(show c) ++ " "] + | rem c i > 0 = check (i+2) c m + | otherwise = [] + +primes c m s t | c < m && c >= t = primes c m (s+1) ((s+1)*(s+1)) + | c < m = check 3 c s ++ primes (c+2) m s t + | otherwise = [] + +main = do + x <- getArgs + print (primes 3 (read (x!!0)::Int) 2 4) + diff --git a/primes.html b/primes.html new file mode 100644 index 0000000..e82f056 --- /dev/null +++ b/primes.html @@ -0,0 +1,95 @@ + + + + + + + Prime Number Finder in Java Script
+ haplo@mindstab.net


+ + Warning: JavaScript prime number finding process is very slow, and locks browser while working, so don't set maximum too high.

+ +
+ + + + + + + + + + + + + +
+ Maximum:
+
+ +
+   + + Time:
+ +
+   +
+ Primes:
+ +
+   + + Last Prime Number:
+ +
+ +
+ + + + diff --git a/primes.java b/primes.java new file mode 100644 index 0000000..028c433 --- /dev/null +++ b/primes.java @@ -0,0 +1,35 @@ +// Java version of a Prime Number Finder +// haplo@mindstab.net + +class primes { + public static void main(String[] s) + { + if(s.length < 1) { + System.out.println("Useage: java primes [Max Num]\n"); + System.exit(1); + } + + int max = Integer.valueOf(s[0]).intValue(); + if(max < 1) { + System.out.println("Invalid Max Num\n"); + System.exit(1); + } + for(int i =3; i<=max; i+=2) + { + int maxTest = (int)Math.sqrt(i); + boolean isPrime = true; + for(int p = 3; p<= maxTest; p+=2) + { + if( (i%p) == 0) + { + isPrime = false; + break; + } + } + if(isPrime) + { + System.out.println(i); + } + } + } +} diff --git a/primes.lisp b/primes.lisp new file mode 100644 index 0000000..ba10962 --- /dev/null +++ b/primes.lisp @@ -0,0 +1,18 @@ +; Common Lisp version of a Prime Number Finder +; haplo@mindstab.net + +(defun check (max i sq) + (if (> i sq) + (format t "~d~%" max) + (if (not (= (mod max i) 0)) + (check max (+ i 2) sq)))) + +(defun _primes (max i) + (if (< i max) + (progn + (check i 3 (sqrt i)) + (_primes max (+ i 2))))) + +(defun primes (max) + (_primes max 3)) + diff --git a/primes.m b/primes.m new file mode 100644 index 0000000..b5cf968 --- /dev/null +++ b/primes.m @@ -0,0 +1,53 @@ +// Objective C version of a Prime Number Finder +// haplo@mindstab.net + +#include +#include "math.h" + +@interface Primes: Object +{ +} +- print:(unsigned int)MAX; +@end + +@implementation Primes +- print:(unsigned int)MAX +{ + unsigned int cnt, test, i; + char isPrime; + for( cnt = 3; cnt <= MAX; cnt +=2) + { + test = (unsigned int)sqrt(cnt); + isPrime = 1; + for(i=3; i<= test; i+=2) + { + if( !(cnt%i)) + { + isPrime=0; + break; + } + } + if(isPrime) { + printf("%d\n", cnt); + } + } + +} +@end + +int main(int argc, char **argv) +{ + unsigned int max; + Primes *primes; + if(argc <= 1) { + printf("Useage: primesobjc [Max Num]\n"); + return(1); + } + max = atoi(argv[1]); + if(max<1) { + printf("Invalid Max Num\n"); + return(1); + } + primes = [Primes alloc]; + [primes print:max]; +} diff --git a/primes.m4 b/primes.m4 new file mode 100644 index 0000000..7cabe29 --- /dev/null +++ b/primes.m4 @@ -0,0 +1,9 @@ +dnl M4 version of a prime number finder +dnl haplo@mindstab.net +dnl +dnl ARGS: CNT, I, MAX +define(CHECK, `ifelse(eval($2>$3),1,1, eval($1 % $2),0,0, `CHECK($1,eval($2+2),$3)')')dnl +dnl ARGS: CNT MAX SQ SQTOP +define(PRIMES,`ifelse(eval($1 < $2),1, `ifelse(eval($1>$4),1, `PRIMES($1,$2,eval($3+1),eval(($3+1)**2))', `ifelse(eval(CHECK($1,3,$3) != 0), 1, $1) +PRIMES(eval($1+2),$2,$3,$4)')')')dnl +dnl autotest call will be inserted here via sed diff --git a/primes.ml b/primes.ml new file mode 100644 index 0000000..e7540cb --- /dev/null +++ b/primes.ml @@ -0,0 +1,31 @@ +(* OCaml version of a prime number finder + haplo@mindstab.net *) + +let primes max = +let sq = ref 2 in +let sqm = ref 4 in +let cnt = ref 3 in +let m = ref 0 in +while !cnt <= !max do + let i = ref 3 in + let stop = ref false in + m := 1; + while !i <= !sq && not !stop do + m := (!cnt mod !i); + if !m = 0 then + stop := true; + i := !i + 2 + done; + if not (!m = 0) then + (print_int(!cnt); + print_newline()); + + if !cnt >= !sqm then + (sq := !sq+1; sqm := !sq * !sq); + + cnt := !cnt + 2 +done;; + +let max = ref (int_of_string Sys.argv.(1)) in +if !max < 1 then (print_string("Invalid Max Num\n"); exit(1);); +primes(max); diff --git a/primes.pas b/primes.pas new file mode 100644 index 0000000..011e72e --- /dev/null +++ b/primes.pas @@ -0,0 +1,47 @@ +{ Pascal version of a Prime Number Finder + Built with fpc (Free Pascal) www.freepascal.org + haplo@mindstab.net } + +program primes; + +var isPrime : Integer; +var test : Real; +var MAX, cnt, i : LongInt; + +begin + if ARGC <= 1 then begin + WriteLn('Useage: primespas [Max Num]'); + exit; + end; + + {MAX := Str2Int(ARGV[1]);} + Val(ARGV[1], MAX, cnt); + if MAX < 1 then begin + WriteLn('Invalid Max Num'); + exit; + end; + + cnt := 3; + while cnt <= MAX do + begin + test := sqrt(cnt); + isPrime := 1; + i := 3; + while i <= test do + begin + if (cnt mod i) = 0 then begin + isPrime := 0; + break; + end; + i := i + 2; + end; + + if not (isPrime = 0) then + begin + WriteLn(cnt); + end; + + cnt := cnt +2; + end; + +end. diff --git a/primes.perl.pl b/primes.perl.pl new file mode 100755 index 0000000..e491452 --- /dev/null +++ b/primes.perl.pl @@ -0,0 +1,31 @@ +#!/usr/bin/perl +# PERL version of a Prime Number Finder +# haplo@mindstab.net + +if(@ARGV > 0) +{ + $max = $ARGV[0]; +} else +{ + print "primes.pl \n"; + exit; +} +if($max < 1) +{ + print "Invalid MAX NUM\n"; + exit; +} + +for($counter =3; $counter < $max; $counter +=2) +{ + $max_test = sqrt($counter); + $isPrime = 1; + + for($tester=3; $tester <= $max_test; $tester+=2) { + if(!($counter % $tester)) { + $isPrime = 0; + last; + } + } + if($isPrime == 1) {print "$counter\n";} +} diff --git a/primes.php b/primes.php new file mode 100755 index 0000000..e918739 --- /dev/null +++ b/primes.php @@ -0,0 +1,25 @@ +#!/usr/bin/env php +\n"; + exit; +} +for($num=3; $num<= $MAX; $num+=2) +{ + $max = sqrt($num); + $isPrime = true; + for($test=3;$test <= $max; $test+=2) + { + if(! ($num % $test)) { + $isPrime= false; + break; + } + } + if($isPrime) print "$num\n"; +} +?> diff --git a/primes.pike b/primes.pike new file mode 100644 index 0000000..939d3eb --- /dev/null +++ b/primes.pike @@ -0,0 +1,38 @@ +// Pike version of a Prime Number Finder +// haplo@mindstab.net + +int main(int argc, array(string) argv) +{ + int max; + if(argc >= 2) { + max = (int)argv[1]; + } else { + write("USEAGE: primes.pike [ Max Num ]"); + return 0; + } + + if(max < 2) + { + write("Invalid Max Num\n"); + return 0; + } + + for(int cnt=3;cnt<=max; cnt+=2) + { + int sq = sqrt(cnt); + int isp = 1; + for(int i = 3; i<=sq;i+=2) + { + if(cnt % i == 0) + { + isp = 0; + break; + } + } + if(isp) { + write(cnt + "\n"); + } + + } + return 0; +} diff --git a/primes.prolog.pl b/primes.prolog.pl new file mode 100644 index 0000000..8f1f3fc --- /dev/null +++ b/primes.prolog.pl @@ -0,0 +1,34 @@ +% prolog + +check(I,C,M,P) :- + P \= 0, + I > M, + write(C), nl. + +check(I,C,M,P) :- + I =< M, + P \= 0, + NP is C mod I, + NI is I + 2, + check(NI,C,M,NP). + +check(I,C,M,0). + +primes(M) :- + nl, primes(3,M,2,4). + +primes(C,M,S,T) :- + C =< M, + C > T, + NS is S + 1, + NT is NS * NS, + check(3,C,NS,1), + NC is C + 2, + primes(NC,M,NS,NT). + +primes(C,M,S,T) :- + C =< M, + C =< T, + check(3,C,S,1), + NC is C + 2, + primes(NC,M,S,T). diff --git a/primes.py b/primes.py new file mode 100755 index 0000000..e3cdf36 --- /dev/null +++ b/primes.py @@ -0,0 +1,27 @@ +#!/usr/bin/env python +# Python version of a Prime Number Finder +# haplo@mindstab.net + +import sys +import math + +try: max = int(sys.argv[1]); +except: + print "primes.py " + sys.exit() + +if max < 1: + print "Invalide MAX NUM" + sys.exit() + +for cnt in range(3, max, 2) : + testMax = math.sqrt(cnt)+1 + isPrime = 1 + for test in range(3, testMax, 2): + isPrime = cnt % test + if isPrime == 0: + break + + if isPrime != 0 : + print cnt + diff --git a/primes.r b/primes.r new file mode 100644 index 0000000..7703848 --- /dev/null +++ b/primes.r @@ -0,0 +1,28 @@ +REBOL [ + Title: "Rebol Prime Number Finder" + Date: 02-Dec-2003 + Author: haplo@mindstab.net + Version: 1.0 + File: %primes.r + Home: http://www.mindstab.net/primes +] + +; Command line argument getting code borrowed from +; http://www.melbpc.org.au/pcupdate/2305/2305article6.htm +cl_args: make block! system/script/args +max: either none? cl_args/1 [""] [to-integer cl_args/1] + + +for cnt 3 max +2 [ + sq: to-integer(square-root(cnt)) + isp: 1 + for i 3 sq +2 [ + isp: cnt // i + if isp = 0 [ + break + ] + + ] + if isp <> 0 [ print cnt ] + +] diff --git a/primes.rb b/primes.rb new file mode 100755 index 0000000..7de48a6 --- /dev/null +++ b/primes.rb @@ -0,0 +1,36 @@ +#!/usr/bin/env ruby +# Ruby version of a Prime Number Finder +# haplo@mindstab.net + +include Math + +class Primes + def findPrimes(cmax) + 3.step(cmax,2) { |i| + max = sqrt(i) + isPrime = 1 + 3.step(max, 2) { |x| + isPrime = i % x + if isPrime == 0 + break + end + } + if isPrime != 0 + print i, "\n" + end + } + end +end + + +MAX = ARGV[0].to_i; +if ! MAX + print "primes.rb \n" + exit(1) +elsif MAX < 1 + print "Invalid MAX Input\n" + exit(1) +end + +prime = Primes.new(); +prime.findPrimes(MAX); diff --git a/primes.rexx b/primes.rexx new file mode 100644 index 0000000..05c171e --- /dev/null +++ b/primes.rexx @@ -0,0 +1,26 @@ +/* REXX version of a Prime Number Finder + haplo@mindstab.net */ + +max=arg(1) +sq=2 +sqm=4 +do cnt = 3 to max by +2 + isp = 1 + i = 3 + do while i <= sq & isp = 1 + if cnt // i = 0 then + do + isp = 0 + end + i = i + 2 + end + if isp \= 0 then + say cnt + + if cnt >= sqm then + do + sq = sq+1 + sqm = sq*sq + end + +end diff --git a/primes.scm b/primes.scm new file mode 100644 index 0000000..13c1a2a --- /dev/null +++ b/primes.scm @@ -0,0 +1,26 @@ +;; Scheme version of a Prime Number Finder +;; haplo@mindstab.net + +(define (check cnt i MAX) + (if (> i MAX) + 1 + (if (= (modulo cnt i) 0) + 0 + (check cnt (+ i 2) MAX) + ) + ) +) + + +(define (primes cnt MAX) + (if (<= cnt MAX) + (and + + (if (not (= (check cnt 3 (sqrt cnt)) 0)) + (and (display cnt) (display "\n")) + ) + (primes (+ cnt 2) MAX) + ) + ) +) + diff --git a/primes.sh b/primes.sh new file mode 100755 index 0000000..cbc4310 --- /dev/null +++ b/primes.sh @@ -0,0 +1,42 @@ +#!/bin/sh +# Unix Shell version of a Prime Number Finder +# haplo@mindstab.net + +odd=3 +sqr=4 +max=2 +i=3 +if [ ! $1 ] ; then + echo "primes.sh [Max number]" + exit +fi + +MAX=$1 +if [ $MAX -le 0 ] ; then + echo "Max must be a valid number" + exit +fi + +while [ $i -lt $MAX ] ; +do + isP=1 + x=3 + while [ $x -le $max -a $isP != 0 ] ; + do + isP=`expr $i % $x` + x=`expr $x + 2` + + done + if [ $isP != 0 ] ; + then + echo "$i" + fi + if [ $i -ge $sqr ] ; + then + max=`expr $max + 1` + odd=`expr $odd + 2` + sqr=`expr $odd + $sqr - 2` + fi + + i=`expr $i + 2`; +done diff --git a/primes.sieve.c b/primes.sieve.c new file mode 100644 index 0000000..f676016 --- /dev/null +++ b/primes.sieve.c @@ -0,0 +1,72 @@ +#include +#include +#include + +int *SieveArray; + +void InitSieve(unsigned int Max) +{ + unsigned int i; + for (i=0; i <= Max; i++) + { + SieveArray[i] = 1; + } +} + +void Sieve(unsigned int Max) +{ + unsigned int i,j; + unsigned int low_max = sqrt(Max); + for( i = 2; i <= low_max; i++) + { + for ( j = i*2; j <= Max; j += i) + { + SieveArray[j] = 0; + } + } +} + +void ShowResults(unsigned int Max) +{ + unsigned int i; + for (i =3; i <= Max; i++) + { + if (SieveArray[i]) + { + printf("%d\n", i); + } + } +} + +int main(int argc ,char **argv) +{ + unsigned int Max; + + if(argc < 2) { + printf("primes.sieve.c \n"); + return 1; + } else { + Max = atoi(argv[1]); + } + + if(Max < 1) + { + printf("Invalid Max specified\n"); + return 1; + } + + SieveArray = (int*) malloc(sizeof(int)*Max); + if(!SieveArray) + { + printf("Error: could not allocate SieveArray at Max:%d\n", Max); + return 1; + } + + InitSieve(Max); + Sieve(Max); + ShowResults(Max); + + free(SieveArray); + + return 0; +} diff --git a/primes.sml b/primes.sml new file mode 100644 index 0000000..35c3920 --- /dev/null +++ b/primes.sml @@ -0,0 +1,30 @@ +(* Standard ML version of a Prime Number Finder + haplo@mindstab.net *) + +fun check i cnt max = if i > max + then + 1 + else + if cnt mod i = 0 then + 0 + else + check (i+2) cnt max + +fun ploop cnt max sq sqm = + if cnt > max then + print "" + else + if cnt >= sqm then + ploop cnt max (sq+1) ((sq+1)*(sq+1)) + else + (if ((check 3 cnt sq) <> 0) then + (print (Int.toString(cnt)); + print("\n") ) + else + print "" + ; ploop (cnt+2) max sq sqm) + +fun primes max = + (print "\n"; ploop 3 max 2 4); + +(* autotest call will be inserted here via sed *) diff --git a/primes.st b/primes.st new file mode 100644 index 0000000..4df5bf6 --- /dev/null +++ b/primes.st @@ -0,0 +1,29 @@ +" Smalltalk version of a prime number finder + " + +| Max | + +Smalltalk arguments size < 1 + ifTrue: [ + 'Usage: primes.st [Max]' printNl. + ] + ifFalse: [ + + Max := (Smalltalk arguments at: 1) asInteger. + 3 to: Max by: 2 do: [ :number | + LowMax := (number sqrt) rounded. + IsPrime := true. + 3 to: LowMax by: 2 do: [ :factor | + ((number rem: factor) == 0) + ifTrue: [ + IsPrime := false + ] + ]. + + IsPrime + ifTrue: [ + number printNl + ] + ] + ]. + ! diff --git a/primes.tcl b/primes.tcl new file mode 100755 index 0000000..039debf --- /dev/null +++ b/primes.tcl @@ -0,0 +1,29 @@ +#!/usr/bin/env tclsh +# TCL version of a Prime Number Finder +# haplo@mindstab.net + +if { $argc == 0 } { + puts "Useage: primes.tcl \[Max Num\]" + exit +} + +set MAX [lindex $argv 0] +if { $MAX < 1 } { + puts "Max Num must be greater than 1" + exit +} + +for { set cnt 3} {$cnt <= $MAX} {incr cnt 2} { + set max_test [expr sqrt($cnt)] + set isPrime 1 + for {set test 3} {$test <= $max_test} {incr test 2} { + if { [expr $cnt % $test] == 0 } { + set isPrime 0; + break + } + } + if { $isPrime == 1 } { + puts $cnt + } +} + diff --git a/primes.vb b/primes.vb new file mode 100644 index 0000000..de5544f --- /dev/null +++ b/primes.vb @@ -0,0 +1,31 @@ +' Visual Basic version of a Prime Number Finder +' haplo@mindstab.net + +Imports System +Imports Math + +Module Prime + Sub Main(ByVal CmdArgs() As String) + Dim cnt As Long, max As Long + Dim test As Double, isPrime As Byte, i as Long + If CmdArgs.Length < 1 then + Console.WriteLine("Usage: primesvb [Max Num]") + Return + Else + max = Convert.ToInt32(CmdArgs(0)) + End If + For cnt = 3 to max Step +2 + test = Math.Sqrt(cnt) + isPrime = 1 + For i = 3 to test Step +2 + If (cnt mod i) = 0 then + isPrime = 0 + Exit For + End If + Next + If isPrime <> 0 Then + Console.WriteLine(cnt) + End If + Next + End Sub +End Module diff --git a/primes.x86.s b/primes.x86.s new file mode 100644 index 0000000..7d08a29 --- /dev/null +++ b/primes.x86.s @@ -0,0 +1,109 @@ +/* x86 Assembly (AT&T style) version of a Prime Number Finder + haplo@mindstab.net */ + +.data +numstr: .asciz "%d\n" +max = 100000 +scanformat : .asciz "%d" + +int = 0 + +.text +.extern printf +.extern scanf +.extern exit + +.global main + + printnum: + pushl %ebx + pushl $numstr + call printf + pop %eax + pop %ecx + ret + +main: + + # scanf code from http://www.linuxgazette.com/issue71/joshi.html + + pushl %ebp # save EBP on stack + movl %esp,%ebp # EBP = ESP + subl $4,%esp # create space for x on the stack + leal -4(%ebp),%eax + pushl %eax + pushl $scanformat + call scanf + addl $12, %esp + + movl -4(%ebp),%eax + movl %eax, -12(%ebp) + + # END scanf code + + + # The rest is all my code + + pushl %eax + + movl $3, %ebx + movl $2, %ecx + movl $4, %edx + + toploop: + + popl %eax + cmp %eax, %ebx + jg end + pushl %eax + + pushl %edx + pushl %ecx + pushl %ebx + movl $3, %ecx + + checkloop: + + popl %ebx + popl %edx + cmp %edx, %ecx + pushl %edx + pushl %ebx + jge showprime + + movl $0, %edx + movl %ebx, %eax + divl %ecx + + addl $2, %ecx + + cmp $0, %edx + je doneloop + + jmp checkloop + + showprime: + call printnum + + doneloop: + + popl %ebx + popl %ecx + popl %edx + + addl $2, %ebx + + cmp %edx, %ebx + jl toploop + + addl $1, %ecx + movl %ecx, %eax + mull %eax + movl %eax, %edx + + jmp toploop + + end: + pushl $0 + call exit + diff --git a/primes_prolog.pl b/primes_prolog.pl new file mode 100644 index 0000000..b07219b --- /dev/null +++ b/primes_prolog.pl @@ -0,0 +1,28 @@ +% Prolog version of a Prime Number Finder +% haplo@mindstab.net + +check(I,C,M,P) :- + P \= 0, + I > M. + +check(I,C,M,P) :- + P \= 0, + NP is C mod I, + NI is I + 2, + check(NI,C,M,NP). + +primes(M) :- + nl, primes(3,M,2). + +primes(C,M,S) :- C > M. +primes(C,M,S) :- + check(3,C,S,1), + write(C), nl, + NC is C + 2, + NS is sqrt(NC), + primes(NC,M,NS). + +primes(C,M,S) :- + NC is C + 2, + NS is sqrt(NC), + primes(NC,M,NS). diff --git a/primesoc b/primesoc new file mode 100755 index 0000000000000000000000000000000000000000..38db49586628be49a5e1e2594ce47a97d89ef43c GIT binary patch literal 8305 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

-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 RW;C1J;_K=c>d8@B`X6i4H17Za literal 0 HcmV?d00001 diff --git a/src/Main.m3 b/src/Main.m3 new file mode 100644 index 0000000..b7aa83b --- /dev/null +++ b/src/Main.m3 @@ -0,0 +1,45 @@ +(* Modula-3 version of a Prime Number Finder + haplo@mindstab.net *) + +MODULE Main; +IMPORT IO; +IMPORT Math; +IMPORT Params; +IMPORT Scan; + +PROCEDURE Main() = + +VAR i, cnt, max, sq, isp : INTEGER; + +BEGIN + IF Params.Count < 2 THEN + IO.Put("Useage: primesm3 [Max Num]\n"); + RETURN + END; + + max := Scan.Int(Params.Get(Params.Count-1)); + + FOR cnt := 3 TO max BY +2 DO + sq := ROUND(Math.sqrt(FLOAT(cnt, LONGREAL))); + isp := 1; + FOR i := 3 TO sq BY +2 DO + IF cnt MOD i = 0 THEN + isp := 0; + EXIT; + END; + END; + + IF isp = 1 THEN + IO.PutInt(cnt); + IO.Put("\n"); + END; + + END; + + + +END Main; + +BEGIN + Main(); +END Main. diff --git a/src/m3makefile b/src/m3makefile new file mode 100644 index 0000000..1c005de --- /dev/null +++ b/src/m3makefile @@ -0,0 +1,5 @@ +% Makefile for Modula-3 program 'primesm3' + +import("libm3") +implementation("Main") +program("primesm3")