lucas_sequences_U_V.sf 848 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. #!/usr/bin/ruby
  2. # Algorithm due to Aleksey Koval for computing the Lucas U and V sequences.
  3. # See also:
  4. # https://en.wikipedia.org/wiki/Lucas_sequence
  5. func lucasUV(n, P, Q) {
  6. var(V1 = 2, V2 = P)
  7. var(Q1 = 1, Q2 = 1)
  8. for j in (n.ilog2 `downto` 0) {
  9. Q1 *= Q2
  10. if (n.getbit(j)) {
  11. Q2 = (Q1 * Q)
  12. V1 = (V2*V1 - P*Q1)
  13. V2 = (V2*V2 - 2*Q2)
  14. }
  15. else {
  16. Q2 = Q1
  17. V2 = (V2*V1 - P*Q1)
  18. V1 = (V1*V1 - 2*Q2)
  19. }
  20. }
  21. var Uk = (2*V2 - P*V1)/(P*P - 4*Q)
  22. return [Uk, V1]
  23. }
  24. for n in (1..20) {
  25. say lucasUV(n, 1, -1)
  26. }
  27. __END__
  28. [1, 1]
  29. [1, 3]
  30. [2, 4]
  31. [3, 7]
  32. [5, 11]
  33. [8, 18]
  34. [13, 29]
  35. [21, 47]
  36. [34, 76]
  37. [55, 123]
  38. [89, 199]
  39. [144, 322]
  40. [233, 521]
  41. [377, 843]
  42. [610, 1364]
  43. [987, 2207]
  44. [1597, 3571]
  45. [2584, 5778]
  46. [4181, 9349]
  47. [6765, 15127]