#polynomials #algebra #crystal-lang #quadratic-curve
Вопрос:
Как сделать так, чтобы это приложение делило полином на множители с помощью квадратичной формулы или какого-либо другого трюка?.
Многочлен 3x^2 10x -8 может быть отнесен к (x 4)(3x -2) с использованием группировки или трюка X. Я бы хотел, чтобы мой код сделал это, но я понятия не имею, как это сделать. Мой код умножает многочлен на (x -0,666666666666666666)(x 4,0), что не то, что я от него хочу. Этот фрагмент кода
require "option_parser"
puts "Please enter your variable values assuming the form ax**2 bx c ."
puts "a: "
a = gets
exit if a.nil?
a = a.to_i
puts "b: "
b = gets
exit if b.nil?
b = b.to_i
puts "c: "
c = gets
exit if c.nil?
c = c.to_i
the_gcd = a.gcd(b).gcd(a.gcd(c))
if the_gcd != 1
x1 = (-1*b (b**2 - 4*a*c) ** 0.5)/(2 * a)
x2 = (-1*b - (b**2 - 4*a*c) ** 0.5)/(2 * a)
if x1.to_i - x1 != 0 || x2.to_i - x2 != 0
puts "The root is not a whole number. Consider grouping for factoring the polynomial."
if x1 < 0 amp;amp; x2 < 0
puts "#{the_gcd}(x #{-x1})(x #{-x2})"
elsif x1 < 0 amp;amp; x2 > 0
puts "#{the_gcd}(x #{-x1})(x #{-x2})"
elsif x1 > 0 amp;amp; x2 < 0
puts "#{the_gcd}(x #{-x1})(x #{-x2})"
elsif x1 > 0 amp;amp; x2 > 0
puts "#{the_gcd}(x #{-x1})(x #{-x2})"
end
exit
else
if x1 < 0 amp;amp; x2 < 0
puts "#{the_gcd}(x #{-x1.to_i})(x #{-x2.to_i})"
exit
elsif x1 < 0 amp;amp; x2 > 0
puts "#{the_gcd}(x #{-x1.to_i})(x #{-x2.to_i})"
exit
elsif x1 > 0 amp;amp; x2 < 0
puts "#{the_gcd}(x #{-x1.to_i})(x #{-x2.to_i})"
exit
elsif x1 > 0 amp;amp; x2 > 0
puts "#{the_gcd}(x #{-x1.to_i})(x #{-x2.to_i})"
exit
end
end
if (b**2 - 4*a*c) < 0
puts "No real solution. Imaginary numbers involved in the solution."
exit
end
end
#The part below does not utilize GCD
x1 = (-1*b (b**2 - 4*a*c) ** 0.5)/(2 * a)
x2 = (-1*b - (b**2 - 4*a*c) ** 0.5)/(2 * a)
if x1.to_i - x1 != 0 || x2.to_i - x2 != 0
puts "The root is not a whole number. Consider grouping for factoring the polynomial."
if x1 < 0 amp;amp; x2 < 0
puts "(x #{-x1})(x #{-x2})"
elsif x1 < 0 amp;amp; x2 > 0
puts "(x #{-x1})(x #{-x2})"
elsif x1 > 0 amp;amp; x2 < 0
puts "(x #{-x1})(x #{-x2})"
elsif x1 > 0 amp;amp; x2 > 0
puts "(x #{-x1})(x #{-x2})"
end
exit
else
if x1 < 0 amp;amp; x2 < 0
puts "(x #{-x1.to_i})(x #{-x2.to_i})"
elsif x1 < 0 amp;amp; x2 > 0
puts "(x #{-x1.to_i})(x #{-x2.to_i})"
elsif x1 > 0 amp;amp; x2 < 0
puts "(x #{-x1.to_i})(x #{-x2.to_i})"
elsif x1 > 0 amp;amp; x2 > 0
puts "(x #{-x1.to_i})(x #{-x2.to_i})"
end
end
if (b**2 - 4*a*c) < 0
puts "No real solution. Imaginary numbers involved in the solution."
exit
end
является частью более крупного приложения, которое также имеет дело с другими методами факторинга квадратичных многочленов.
Пусть эти другие методы факторинга, такие как факторинг трехчленных совершенных квадратов или разность совершенных квадратов,
выходят за рамки этого вопроса.
Я столкнулся с аналогичной проблемой в этом коде Python, которая, по-видимому, была решена с использованием дробей.
Можно ли использовать фракции в кристалле, чтобы решить мою проблему?
Комментарии:
1. Вы всегда можете попробовать перенести код python в crystal…
2. Вы могли бы использовать BigRational .