Skip to content

Instantly share code, notes, and snippets.

@jsoffer
Created December 3, 2010 23:47
Show Gist options
  • Save jsoffer/727735 to your computer and use it in GitHub Desktop.
Save jsoffer/727735 to your computer and use it in GitHub Desktop.
----------------- por estilo ---------------------
import Prelude hiding ((/))
infixl 7 /
(/) = quot
par = even
impar = odd
----------------- REFLEJOS ---------------
-- mx+b debe convertir de impar a par
type Nodo = (Integer,Integer)
type Nivel = [Nodo]
corrige :: Integer -> Integer -> Integer -> Integer
corrige m n x = x + m^n
-- hijo izquierdo de un nodo
rhi :: Integer -> Integer -> Nodo -> Nodo
rhi m b (n,x)
| par x = (n, x/2)
| impar x = (n, (corrige m n x)/2)
-- hijo derecho
rhd :: Integer -> Integer -> Nodo -> Nodo
rhd m b (n,x)
| par x = (n+1, (m*(corrige m n x) + b)/2)
| impar x = (n+1, (m*x + b)/2)
rnivel' :: Integer -> Integer -> Nivel -> Nivel
rnivel' m b = concatMap (\k -> [rhi m b k, rhd m b k])
rniveles :: Integer -> Integer -> [Nivel]
rniveles m b = iterate (rnivel' m b) [(0,0)]
rnivel :: Integer -> Integer -> Int -> Nivel
rnivel m b = (rniveles m b !!)
------------- CONGRUENCIAS ----------------
cnivel' :: Nivel -> Nivel -> Nivel
cnivel' rs cs = concat $ zipWith g rs cs where
g :: Nodo -> Nodo -> Nivel
g (_,x) (k,y)
| even x = [(k+1,y),(k+1,y+2^k)]
| odd x = [(k+1,y+2^k),(k+1,y)]
cniveles :: Integer -> Integer -> [Nivel] -- [([Nivel],Nivel)]
cniveles m b = map snd $ iterate g (xs,[(0,0)]) where
xs = rniveles m b
g :: ([Nivel],Nivel) -> ([Nivel],Nivel)
g ((x:xs),y) = (xs,cnivel' x y)
cnivel :: Integer -> Integer -> Int -> Nivel
cnivel m b = (cniveles m b !!)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment