Collatz conjecture in PL/SQL

March 27, 2010

Collatz, fun, pipelined, pl/sql

A simple implementation of Collatz conjecture in PL/SQL:

  
create or replace type int_tab_typ is table of integer;  
/  
  
create or replace function collatz(p_n in integer)   
   RETURN int_tab_typ PIPELINED as  
   n integer;  
BEGIN  
  if p_n < 1 or mod(p_n,1)>0 then   
    RETURN ;  
  end if;  
  n:=p_n;  
  while n > 1   
  loop  
    pipe row (n);  
    if mod(n,2)=1 then   
      n:=3*n+1;  
    else   
      n:=n / 2;  
    end if;  
  end loop;  
  pipe row(n);  
end;  
/  
  
select * from table(collatz(101));  

More on Collatz Conjecture (Wikipedia).

The point? Just for fun. Showed it to my 11 years old kid and asked him to figure out the 17 steps sequence of collatz(7) in his head. “Is this going to stop?”, he asked half through. “That is what we are going to find out, nobody really knows”, I told him.

If you have absolutely nothing useful to do, but have CPU and storage to waste, you may create a table containing n and the number of steps for collatz(n), with values of n ranging from 1 to 231-1 or until storage is exhausted, whichever comes first. Before doing so you may consider changing the function above to just count the steps and look up previous calculations from the table.