Personal tools

Euler problems/181 to 190

From HaskellWiki

< Euler problems(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