
I forgot to add, I'm on 32-bit GHC and the sum will overflow there, so
I changed main:
main = putStrLn . show . sum $ ([ if and [ pList ! i , divPrime .
pred $ i ] then (fromIntegral $ pred i) else 0 | i <- [ 2 .. 10 ^ 8 ]
] :: [Integer])
On Tue, Nov 8, 2011 at 8:19 AM, Ryan Yates
If I compile with optimizations:
ghc --make -O3 primes.hs
I get an answer that is off by one from the C++ program in a few seconds.
On Tue, Nov 8, 2011 at 7:46 AM, mukesh tiwari
wrote: In that loop , I am collecting all the primes in vector how ever I changed the c++ code and now it resembles to Haskell code. This code still gives the answer within a second.
#include<cstdio> #include<iostream> #include<vector> #define Lim 100000001 using namespace std;
bool prime [Lim]; vector<int> v ;
void isPrime () { for( int i = 2 ; i * i <= Lim ; i++) if ( !prime [i]) for ( int j = i * i ; j <= Lim ; j += i ) prime [j] = 1 ;
//for( int i = 2 ; i <= Lim ; i++) if ( ! prime[i] ) v.push_back( i ) ; //cout<
}
int main() { isPrime(); int n = v.size(); long long sum = 0; for(int i = 0 ; i < Lim ; i ++) if ( ! prime [i]) { int k = i-1; bool f = 0; for(int i = 1 ; i*i<= k ; i++) if ( k % i == 0 && prime[ i + ( k / i ) ] ) { f=1 ; break ; }
if ( !f ) sum += k; } cout<
Regards Mukesh Tiwari
On Tue, Nov 8, 2011 at 6:03 PM, Ivan Lazar Miljenovic
wrote: On 8 November 2011 23:29, mukesh tiwari
wrote: Also, I'm not sure if the logic in the two versions is the same: I'm not sure about how you handle the boolean aspect in C++, but you have a third for-loop there that doesn't seem to correspond to anything in the Haskell version.
Which loop ?
for( int i = 2 ; i <= Lim ; i++) if ( ! prime[i] ) v.push_back( i ) ;
-- Ivan Lazar Miljenovic Ivan.Miljenovic@gmail.com IvanMiljenovic.wordpress.com
_______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe