Advertisement
Metalhead33

Eucledian Algorithm for Linear Congruence (Lua version)

Apr 25th, 2017
134
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 1.47 KB | None | 0 0
  1. function Reverse (arr)
  2.     local i, j = 1, #arr
  3.  
  4.     while i < j do
  5.         arr[i], arr[j] = arr[j], arr[i]
  6.  
  7.         i = i + 1
  8.         j = j - 1
  9.     end
  10. end
  11.  
  12. -- your code goes here
  13. function FindGreatestCommonDivisor(a,b)
  14.     local tmp = { }
  15.     tmp[1] = { }
  16.     tmp[1].a = a
  17.     tmp[1].b = b
  18.     tmp[1].a_per_b = math.floor(a/b)
  19.     local i = 2
  20.     --local exit_signal = false
  21.     repeat
  22.         tmp[i] = { }
  23.         tmp[i].a = tmp[i-1].b
  24.         tmp[i].b = tmp[i-1].a % tmp[i-1].b
  25.         if tmp[i].b == 0 then tmp[i].a_per_b = 1 else
  26.         tmp[i].a_per_b = math.floor(tmp[i].a / tmp[i].b) end
  27.         i = i + 1
  28.     until tmp[i-1].b == 0
  29.     local gcd = tmp[i-1].a
  30.     return tmp, gcd
  31. end
  32.  
  33. function Eucledian(a,b)
  34.     local tmp,gcd = FindGreatestCommonDivisor(a,b)
  35.     Reverse(tmp)
  36.     for k,v in pairs(tmp) do
  37.         if k == 1 then
  38.             tmp[k].x = gcd
  39.             tmp[k].y = 0
  40.         else
  41.             tmp[k].x = tmp[k-1].y
  42.             tmp[k].y = tmp[k-1].x - (tmp[k-1].y * tmp[k].a_per_b)
  43.         end
  44.     end
  45.     Reverse(tmp)
  46.     return tmp,gcd
  47. end
  48.  
  49. function LinearCongruence(x,modulo,divisor)
  50.     local tmp,gcd = Eucledian(divisor,x)
  51.     if modulo % gcd ~= 0 then
  52.         return false -- Unsolvable
  53.     else
  54.         local side_1 = ((tmp[1].a * tmp[1].x) + (tmp[1].b * tmp[1].y)) / gcd
  55.         local side_2 = divisor - modulo
  56.         return true, math.abs((side_2 / side_1) * (tmp[1].y / gcd)), tmp
  57.     end
  58. end
  59.  
  60. passable,final_solution,tempe = LinearCongruence(125,1210,2070)
  61. for k,v in pairs(tempe) do
  62.     print(v.a .. "\t" .. v.b .. "\t" .. v.a_per_b .. "\t" .. v.x .. "\t" .. v.y)
  63. end
  64. print("Final solution for X: " .. final_solution)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement