[Haskell-cafe] puzzle: prove this floorSqrt correct
Henning Thielemann
iakd0 at clusterf.urz.uni-halle.de
Fri Aug 13 04:23:36 EDT 2004
On Thu, 12 Aug 2004, Remi Turk wrote:
> On Thu, Aug 12, 2004 at 09:01:03PM +0200, Henning Thielemann wrote:
> >
> > On Thu, 12 Aug 2004, Remi Turk wrote:
> > > I usually (each time I urgently need to calculate primes ;)) use
> > > a simple intSqrt = floor . sqrt . fromIntegral
> > > (which will indeed give wrong answers for big numbers)
> >
> > If I urgently need factors of an integer I check "factor*factor > n"
> > rather than "factor > intSqrt n". :-]
>
> but you'll have to (^2) once every "iteration".
> The following code only has to sqrt once.
Right. Hm, but if you get a 'div' for free for every 'mod' (e.g. divMod)
you could also check "factor > n `div` factor"
> Oh, the joy of premature optimization. Or even premature coding ;)
>
> -- Will lie when given stupid questions
> isPrime 1 = False
> isPrime 2 = True
> isPrime n = not $ any (n`isDivBy`) (2:[3,5..intSqrt n])
> where
> n `isDivBy` d = n `rem` d == 0
> intSqrt = floor . sqrt . fromIntegral
If the numbers become too big, will 'fromIntegral' round down or up? If it
rounds down, then intSqrt might lead to a too small result.
More information about the Haskell-Cafe
mailing list