160 likes | 411 Views
Sieve of Eratosthenes. Lecture L7.2. Sieve of Eratosthenes in Java. package com.research.hanna; import com.ajile.drivers.gptc.TimerCounter; /** * @author Darrin Hanna */ public class Sieve { private static int j, a, b; private static int primeCount;
E N D
Sieve of Eratosthenes Lecture L7.2
Sieve of Eratosthenes in Java package com.research.hanna; import com.ajile.drivers.gptc.TimerCounter; /** * @author Darrin Hanna */ public class Sieve { private static int j, a, b; private static int primeCount; private static int flags[] = new int[1024]; private static int size; private static TimerCounter tc; public static void main(String[] args) { int count2; size = 1024;
TimerCounter.setPrescalerClockSource( TimerCounter.INTERNAL_PERIPHERAL_CLOCK ); // Assuming Internal Peripheral clock is 50MHz, // then Prescaler clock out is 1MHz TimerCounter.setPrescalerReloadRegisterValue( 50 ); TimerCounter.setPrescalerEnabled( true ); // setup timer 0 tc = new TimerCounter( 0 ); //tc.setMode_IO_Line_B( TimerCounter.TIMER_0_OUTPUT_DIVIDE_BY_2 ); tc.setExternalTimerEnableMode( TimerCounter.TIMER_ENABLED_ONLY_VIA_MTEN_AND_TRIGGER ); System.out.println("timer start at: " + tc.getCurrentTimeRegisterValue()); tc.setReloadRegisterValue( 5000000 ); tc.setMasterTimerEnabled( true );
// first create an array of flags, where // each member of the array stands for a odd number // starting with 3. for (j = 0; j < size; j++) { flags[j] = 1; } primeCount = 0; for (j = 0; j < size; j++) { if (flags[j] == 1) { // found a prime, count it primeCount++; // now set all of the multiples of // the current prime number to false // because they couldn't possibly be // prime a = 2*j + 3; // odd numbers starting with 3 b = a + j; while(b < size) { flags[b] = 0; b = b + a; } } }
count2 = tc.getCurrentTimeRegisterValue(); // output the number of primes System.out.println("Number of primes = " + primeCount); System.out.println("count2: " + count2); //Processor clock is 73.728MHz } }
Sieve of Eratosthenes in Forth : FILL ( b u c -- ) \ fill u bytes at addr b with char c -ROT \ c b u FOR \ c b OVER OVER \ c b c b C! 1+ \ c b+1 NEXT DROP DROP ;
: sieve ( -- n ) \ n = no. of prime #s 0 1024 1 FILL \ fill flags array 0 \ cnt 1024 FOR \ cnt 1024 R@ - \ cnt j DUP C@ \ cnt j flags[j] IF \ cnt j DUP 2* 3 + \ cnt j a = (2*j + 3) TUCK + \ cnt a b = (a + j) BEGIN \ cnt a b DUP 1024 < \ cnt a b f WHILE \ cnt a b 0 OVER C! \ store 0 at flags[b] OVER + \ cnt a b = (a + b) REPEAT 2DROP 1+ \ cnt = cnt+1 ELSE DROP \ cnt THEN NEXT ;
Flowpath datapath : sieve ( -- n ) \ n = no. of prime #s 0 1024 1 FILL \ fill flags array 0 \ cnt 1024 FOR \ cnt 1024 R@ - \ cnt j DUP C@ \ cnt j flags[j] IF \ cnt j DUP 2* 3 + \ cnt j a = (2*j + 3) TUCK + \ cnt a b = (a + j) BEGIN \ cnt a b DUP 1024 < \ cnt a b f WHILE \ cnt a b 0 OVER C! \ store 0 at flags[b] OVER + \ cnt a b = (a + b) REPEAT 2DROP 1+ \ cnt = cnt+1 ELSE DROP \ cnt THEN NEXT ;
Flowpath controller : sieve ( -- n ) \ n = no. of prime #s 0 1024 1 FILL \ fill flags array 0 \ cnt 1024 FOR \ cnt 1024 R@ - \ cnt j DUP C@ \ cnt j flags[j] IF \ cnt j DUP 2* 3 + \ cnt j a = (2*j + 3) TUCK + \ cnt a b = (a + j) BEGIN \ cnt a b DUP 1024 < \ cnt a b f WHILE \ cnt a b 0 OVER C! \ store 0 at flags[b] OVER + \ cnt a b = (a + b) REPEAT 2DROP 1+ \ cnt = cnt+1 ELSE DROP \ cnt THEN NEXT ;