Personal tools

Euler problems/181 to 190

From HaskellWiki

(Difference between revisions)
Jump to: navigation, search
((183) If we must have a solution here, let's at least have a decent one.)
Line 27: Line 27:
Solution:
Solution:
<haskell>
<haskell>
-
pmax x a=a*(log x-log a)
+
-- Does the decimal expansion of p/q terminate?
-
tofloat x=encodeFloat x 0
+
terminating p q = 1 == reduce [2,5] (q `div` gcd p q)
-
fun x=
+
where reduce [] n = n
-
div n1 $gcd n1 x
+
reduce (x:xs) n | n `mod` x == 0 = reduce (x:xs) (n `div` x)
-
where
+
| otherwise = reduce xs n
-
e=exp 1
+
 
-
n=floor(fromInteger x/e)
+
-- The expression (round $ fromIntegral n / e) computes the integer k
-
n1=snd.maximum$[(b,a)|a<-[n..n+1],let b=pmax (tofloat x) (tofloat a)]
+
-- for which (n/k)^k is at a maximum.
-
n `splitWith` p = doSplitWith 0 n
+
answer = sum [if terminating n (round $ fromIntegral n / e) then -n else n
-
where doSplitWith s t
+
| n <- [5 .. 10^4]]
-
| p `divides` t = doSplitWith (s+1) (t `div` p)
+
where e = exp 1
-
| otherwise = (s, t)
+
 
-
d `divides` n = n `mod` d == 0
+
main = print answer
-
funD x
+
-
|is25 k=(-x)
+
-
|otherwise =x
+
-
where
+
-
k=fun x
+
-
is25 x
+
-
|s==1=True
+
-
|otherwise=False
+
-
where
+
-
s=snd(splitWith (snd (splitWith x 2)) 5)
+
-
problem_183 =sum[funD a|a<- [5..10000]]
+
</haskell>
</haskell>

Revision as of 20:27, 24 February 2008

1 Problem 181

Investigating in how many ways objects of two different colours can be grouped.

Solution: This was my code, published here without my permission nor any attribution, shame on whoever put it here. Daniel.is.fischer

2 Problem 182

RSA encryption.

Solution:

fun a1 b1 =
    sum [ e |
    e <- [2..a*b-1],
    gcd e (a*b) == 1,
    gcd (e-1) a == 2,
    gcd (e-1) b == 2
    ]
    where
    a=a1-1
    b=b1-1
problem_182=fun 1009 3643

3 Problem 183

Maximum product of parts.

Solution:

-- Does the decimal expansion of p/q terminate?
terminating p q = 1 == reduce [2,5] (q `div` gcd p q)
        where reduce   []   n = n
              reduce (x:xs) n | n `mod` x == 0 = reduce (x:xs) (n `div` x)
                              | otherwise      = reduce xs n
 
-- The expression (round $ fromIntegral n / e) computes the integer k
-- for which (n/k)^k is at a maximum.
answer = sum [if terminating n (round $ fromIntegral n / e) then -n else n
                | n <- [5 .. 10^4]]
        where e = exp 1
 
main = print answer