Today over dinner Will Byrd mentioned the Collatz function to Michael Adams and me. The Collatz function is a simple little function that on receiving any natural number seems to always terminate with the result 1. However the strange thing is that no one has been able to prove this property of the function. As a matter of fact one rather famous mathematician is quoted to have said that mathematics isn’t ready to prove the Collatz conjecture and such problems.
So what is Collatz function?
collatz :: Integer -> Integer
collatz 1 = 1
collatz n | n `mod` 2 == 0 = collatz (n `div` 2)
collatz n = collatz (3 * n + 1)
Let me translate that into a C* style syntax:
int collatz(int n)
{
if(n == 1)
return n;
else if (n % 2 == 0)
return collatz(n/2);
else
return collatz(n*3+1);
}
Here is a wikipedia page about it:
http://en.wikipedia.org/wiki/Collatz_conjecture
If you look at it hard enough certain patterns emerge and we took some shots at what a proof might entail. In summary its sufficient to say that we didn’t get very far. The interesting consequence though is that enough information about the nature of the function emerged that we were able to create another one:
Hence is our new function that we call collatz’ (read as collatz-prime)
collatz' :: Integer -> Integer
collatz' 1 = 1
collatz' n | n `mod` 3 == 0 = collatz' (n `div` 3)
collatz' n | n `mod` 3 == 1 = collatz' (4 * n - 1)
collatz' n = collatz' (4 * n + 1)
Cute?
Later in the evening I found this one which I call collatz’’ (read collatz-double-prime)
collatz'' :: Integer -> Integer
collatz'' 1 = 1
collatz'' n | n `mod` 5 == 0 = collatz'' (n `div` 5)
collatz'' n | n `mod` 5 == 1 = collatz'' (6 * n + 4)
collatz'' n | n `mod` 5 == 2 = collatz'' (6 * n + 3)
collatz'' n | n `mod` 5 == 3 = collatz'' (6 * n + 2)
collatz'' n = collatz'' (6 * n + 1)
Like the original collatz function, both collatz’ and collatz’’ seem to terminate on all inputs with the result 1. Again there is no proof that it will do so. I have (at the time of this writing) verified termination of both of these till for all numbers 1 to100,000.
Here is a little verifier:
verify :: (Integer -> Integer) -> Int -> Bool
verify f n = foldl isOne True (map f (take n [1..]))
where
isOne :: Bool -> Integer -> Bool
isOne b x = (x == 1) && b
verify collatz’ 100000 returns True.
Here is collatz in Scheme:
(define C
(lambda (n)
(cond
((zero? (sub1 n)) 1)
((even? n) (C (quotient n 2)))
(else (C (+ 1 (* 3 n)))))))
And Collatz’
((= n 1) 1)
((= 0 (modulo n 3)) (C (quotient n 3)))
((= 1 (modulo n 3)) (C (- (* n 4) 1)))
(else (C (+ (* n 4) 1))))))
Here is a good time to make a potential conjecture: Is it true that there are infinitely many such functions?
Remember Me
a@href@title, strike
Powered by: newtelligence dasBlog 2.0.7226.0
Disclaimer The opinions expressed herein are my own personal opinions and do not represent my employer's view in any way.
© Copyright 2008, Roshan James
E-mail