Advertisement
Guest User

Qupla program

a guest
Jan 19th, 2019
118
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 0.93 KB | None | 0 0
  1. import Qupla
  2.  
  3. // seq23 calculates and prints sequence x(n+1) = isEven(x(n)) ? x(n)/2 : 3*x(n)+1
  4. // It is a proven fact (by experiment) that with any positive integer x(0) < 100.000.000
  5. // this sequence always reaches 1 after finite number of steps.
  6. // Maybe someone already proved it for any positive integer :)
  7. // E.g. starting with x(0) = 27 sequence comes to value 1 after 110 steps.
  8. // Run with -eval
  9. // (c) lunfardo
  10.  
  11. template seq23<T> {
  12. func T seq23<T>(T n){
  13. dummy = print<T>(n)
  14. is2 = equal<T>(n, as<T>(1))
  15. return is2 ? as<T>(2) : seq23do<T>(n)
  16. }
  17. func T seq23do<T>(T n){
  18. qr = divMod<T>(n, as<T>(2))
  19. return isZero[sign<T>(qr.remainder)]
  20. ? seq23<T>(qr.quotient)
  21. : seq23<T>(mul3add1(n))
  22. }
  23. func T mul3add1(T n){
  24. mul3 = rshift<T>(n)
  25. return add<T>(mul3, as<T>(1))
  26. }
  27. }
  28.  
  29. // 110 steps
  30. eval seq23<Int>(27)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement