Skip to content

Instantly share code, notes, and snippets.

@jsoffer
Created February 7, 2010 19:05
Show Gist options
  • Save jsoffer/297598 to your computer and use it in GitHub Desktop.
Save jsoffer/297598 to your computer and use it in GitHub Desktop.
d n = div n 2
dd n = div (n-1) 2
du n = div (n+1) 2
dosportres :: Integer -> Integer
dosportres x = (3^k) * r where
(k,r) = descomp x
-- Reemplazar: no es tail recursive
dptdoble :: Integer -> Integer
dptdoble x = if (mod x 4 == 0) then 3 * (dptdoble (div x 4)) else x
ronda :: Integer -> Integer
ronda x
| mod x 8 == 1 = d.dd.du $ x
| mod x 8 == 3 = dd.(*3).d.du $ x
| mod x 8 == 5 = dd.dd.du $ x
| mod x 8 == 7 = dptdoble.du $ x
| ((even k) && (mod r 4 == 1)) ||
((odd k) && (mod r 4 == 3)) = d.dd.dosportres $ x
| ((odd k) && (mod r 4 == 1)) ||
((even k) && (mod r 4 == 3)) = dd.dd.dosportres $ x where
(k,r) = descomp x
-- 2^k r -> k, r
descomp :: Integer -> (Integer, Integer)
descomp x = descomp' (0,x) where
descomp' :: (Integer, Integer) -> (Integer, Integer)
descomp' (d,r) = if even r then descomp' (d+1,div r 2) else (d,r)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment