- --To use this, simply write the following at the very end: 'Solve(a,b,c)' [where a,b,c are Integers.]
- --Example: Solve(1,-2,3)
- --It solves the following equation: ax^2 + bx + c = 0.
- --After writing, execute the code.
- --It outputs the answers in the form of square roots and fractions, instead of decimals.
- --It also gives other information about the equation made from the input.
- function FP(numbers)
- if #numbers>0 then
- local F = {}
- for k=1, #numbers do
- local n = numbers[k]
- local n2 = math.abs(n)
- local f = {{1,1}}
- if n2 ~= 1 then
- while n2>1 do
- for i=2, math.abs(n) do
- if n2>1 then
- if math.floor(n2/i)==n2/i then
- local lol = 1
- while lol >= 1 do
- local LOL = i^(lol+1)
- if math.floor(n2/LOL)~=n2/LOL then
- f[#f+1] = {i,lol}
- n2 = n2/(i^lol)
- lol = 0
- else
- lol = lol+1
- end
- end
- end
- end
- end
- end
- end
- F[#F+1]=f
- end
- return F
- end
- end
- function FCF(pon)
- local af = FP({pon[1]})
- local bf = FP({pon[2]})
- local cf = {{1,1}}
- for i=1, #af[1] do
- for k=1, #bf[1] do
- local f1 = af[1][i]
- local f2 = bf[1][k]
- local s = nil
- if f1[1]==f2[1] then
- if f1[2] >= f2[2] then
- s=f2[2]
- elseif f1[2] < f2[2] then
- s=f1[2]
- end
- cf[#cf+1]={f1[1],math.abs(s)}
- end
- end
- end
- return cf
- end
- function ECF(pon2)
- local f = FCF(pon2)
- local cf=1
- for i=1, #f do
- cf = cf*(f[i][1]^f[i][2])
- end
- return cf
- end
- function Solve(a,b,c)
- local result = nil
- if tonumber(a)~=nil and tonumber(b)~=nil and tonumber(c)~=nil then
- if a == math.floor(a) and b == math.floor(b) and c == math.floor(c) then
- if a ~= 0 then
- local t = 1
- local s = {}
- local S = 1
- local D = (b*b)-(4*a*c)
- if D<0 then
- t=-1
- end
- if math.abs(D)>0 then
- local Df = FP({D})
- for k1=1, #Df[1] do
- local f = Df[1][k1]
- if f[2] == 1 then
- t=t*f[1]
- elseif f[2]/2 ~= math.floor(f[2]/2) and f[2]>1 then
- f[2]=f[2]-1
- s[#s+1]=f[1]^f[2]
- t=t*f[1]
- elseif f[2]/2 == math.floor(f[2]/2) then
- s[#s+1]=f[1]^f[2]
- end
- end
- for k2=1, #s do
- S = S*math.sqrt(s[k2])
- end
- if t~=1 then
- local ncf = ECF({b,S})
- local fcf = ECF({2*a,ncf})
- n1 = ((-1*b)/fcf)
- n2 = (S/fcf)
- d = (2*a/fcf)
- if n1 == 0 then
- local fcf4 = ECF({2*a,S})
- n2 = S/fcf4
- d = 2*a/fcf4
- end
- end
- elseif D == 0 then
- t=0
- end
- if t == 0 then
- local fcf1 = ECF({b,2*a})
- local n = b/fcf1
- local da = 2*a/fcf1
- if math.abs(da) ~= 1 and math.abs(da) ~= math.abs(n) then
- result = "SOLUTION: "..tostring(-1*n).."/"..tostring(da).." | FACTORABLE | 1 REAL SOLUTION"
- else
- result = "SOLUTION: "..tostring(-1*n/da).." | FACTORABLE | 1 REAL SOLUTION"
- end
- elseif t>1 then
- if n2 == 1 then
- n2 = ""
- end
- if n1 ~= 0 then
- result = "SOLUTIONS: ("..tostring(n1).." + "..tostring(n2).."sqrt("..tostring(t).."))/"..tostring(d).." and ("..tostring(n1).." - "..tostring(n2).."sqrt("..tostring(t).."))/"..tostring(d).." | NOT FACTORABLE | 2 REAL SOLUTIONS"
- elseif n1 == 0 then
- result = "SOLUTIONS: "..tostring(n2).."sqrt("..tostring(t)..")/"..tostring(d).." and (-"..tostring(n2).."sqrt("..tostring(t).."))/"..tostring(d).." | NOT FACTORABLE | 2 REAL SOLUTIONS"
- end
- elseif t<0 then
- if n2 == 1 then
- n2 = ""
- end
- t=math.abs(t)
- if n1 ~= 0 then
- if t ~= 1 then
- result = "SOLUTIONS: ("..tostring(n1).." + "..tostring(n2).."sqrt("..tostring(t)..")i)/"..tostring(d).." and ("..tostring(n1).." - "..tostring(n2).."sqrt("..tostring(t)..")i)/"..tostring(d).." | NO REAL SOLUTIONS"
- elseif t ==1 then
- result = "SOLUTIONS: ("..tostring(n1).." + "..tostring(n2).."i)/"..tostring(d).." and ("..tostring(n1).." - "..tostring(n2).."i)/"..tostring(d).." | NO REAL SOLUTIONS"
- end
- elseif n1 == 0 then
- if t ~= 1 then
- result = "SOLUTIONS: "..tostring(n2).."sqrt("..tostring(t)..")i)/"..tostring(d).." and (-"..tostring(n2).."sqrt("..tostring(t)..")i)/"..tostring(d).." | NO REAL SOLUTIONS"
- elseif t ==1 then
- result = "SOLUTIONS: "..tostring(n2).."i/"..tostring(d).." and (-"..tostring(n2).."i)/"..tostring(d).." | NO REAL SOLUTIONS"
- end
- end
- elseif t==1 then
- local fcf2 = ECF({2*a,(-b)+S})
- local fcf3 = ECF({2*a,b+S})
- local n1a = (((-b)+S)/fcf2)
- local n2a = ((b+S)/fcf3)
- local db1 = (2*a/fcf2)
- local db2 = (2*a/fcf3)
- if math.abs(db) ~= 1 then
- result = "SOLUTIONS: "..tostring(n1a).."/"..tostring(db1).." and ".."("..tostring(-1*n2a)..")/"..tostring(db2).." | FACTORABLE | 2 REAL SOLUTIONS"
- else
- result = "SOLUTIONS: "..tostring(n1a/db1).." and "..tostring(-1*n2a/db2).." | FACTORABLE | 2 REAL SOLUTIONS"
- end
- end
- elseif a == 0 and b ~= 0 then
- local lcf = ECF({b,c})
- local ln = -c/lcf
- local ld = b/lcf
- if math.abs(ld) ~= 1 and math.abs(ld) ~= math.abs(c) and ln ~= 0 then
- result = "SOLUTION: "..tostring(ln).."/"..tostring(ld).." | This is a linear equation."
- else
- result = "SOLUTION: "..tostring(ln/ld).." | This is a linear equation."
- end
- elseif a==0 and b == 0 then
- result = "NO SOLUTIONS | This is a constant..."
- if c == 0 then
- result = "SOLUTION: ANY NUMBER | What equation is this?"
- end
- end
- else
- result = "This program only works on integers :("
- end
- else
- result = "Please check your input, it must be in the form of Solve(INTEGER,INTEGER,INTEGER)"
- end
- print(result)
- end
- --Example--------------
- Solve(2,3,5)
- ------------Remove this