Как сделать так, чтобы это приложение делило полином на множители с помощью квадратичной формулы или какого-либо другого трюка?

#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 .