余談:Javaで因数分解をしてみる
またまた、暇つぶし。
今回は入力した2次式の因数分解をするコードを書いてみた。(但し ax2 - cの形式の因数分解は出来ない)
import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JTextField; public class Factorization extends JFrame implements ActionListener { JTextField ta; JTextField tb; JTextField tc; JLabel a; JLabel b; JLabel c; JLabel d; int valA; int valB; int valC; int aa; int ab; int ac; int ad; public void Analysis () { for (int i = 1; i < Math.abs(valA); i++) { if (valA % i == 0) { for (int j = 1; j < Math.abs(valC); j++) { if (valC % j == 0 && (valB == (i * j + valA/i * valC/j))) { aa = i; ab = valC/j; ac = valA/i; ad = j; } else if (valC % j == 0 && (valB == (i * valC/j + valA/i * j))) { aa = i; ab = j; ac = valA/i; ad = valC/j; } } } } } //ax2 + (-b) x + cの場合 public void Analysis2 () { for (int i = 1; i < Math.abs(valA); i++) { if (valA % i == 0) { for (int j = 1; j < Math.abs(valC); j++) { if (valC % j == 0 && (Math.abs(valB) == (i * j + valA/i * valC/j))) { aa = i; ab = (-1)*valC/j; ac = valA/i; ad = (-1)*j; } else if (valC % j == 0 && (Math.abs(valB) == (i * valC/j + valA/i * j))) { aa = i; ab = (-1)*j; ac = valA/i; ad = (-1)*valC/j; } } } } } // -a x2 + bx + cの場合 public void Analysis3 () { valA = (-1) * valA; valB = (-1) * valB; valC = (-1) * valC; for (int i = 1; i < Math.abs(valA); i++) { if (valA % i == 0) { for (int j = 1; j < Math.abs(valC); j++) { if (valC % j == 0 && (valB == (i * j + valA/i * valC/j))) { aa = (-1) * i; ab = (-1)*valC/j; ac = valA/i; ad = j; } else if (valC % j == 0 && (valB == (i * valC/j + valA/i * j))) { aa = (-1) *i; ab = (-1)*j; ac = valA/i; ad = valC/j; } } } } } // -a x2 + bx - cの場合 public void Analysis4 () { valA = (-1) * valA; valB = (-1) * valB; valC = (-1) * valC; Analysis2(); aa = (-1)*aa; ab = (-1)*ab; } public void Cal () { valA = Integer.parseInt(ta.getText()); valB = Integer.parseInt(tb.getText()); valC = Integer.parseInt(tc.getText()); if (valA > 0 && valB < 0 && valC > 0) { Analysis2 (); } else if (valA < 0){ if (valB > 0 && valC < 0) { Analysis4 (); } else { Analysis3 (); } } else { Analysis(); } a.setText(Integer.toString(aa)); b.setText(Integer.toString(ab)); c.setText(Integer.toString(ac)); d.setText(Integer.toString(ad)); } public void actionPerformed (ActionEvent e) { String cmd = e.getActionCommand(); if (cmd.equals("Cal")) { Cal(); } } Factorization () { JButton button = new JButton ("Cal"); button.addActionListener(this); button.setActionCommand("Cal"); ta = new JTextField (); tb = new JTextField (); tc = new JTextField (); JLabel la = new JLabel ("x2 + "); JLabel lb = new JLabel ("x + "); JLabel eq = new JLabel ("= "); JLabel k1 = new JLabel ("("); JLabel k2 = new JLabel (")"); JLabel k3 = new JLabel ("("); JLabel k4 = new JLabel (")"); JLabel x1 = new JLabel ("x"); JLabel p1 = new JLabel ("+"); JLabel x2 = new JLabel ("x"); JLabel p2 = new JLabel ("+"); a = new JLabel (); b = new JLabel (); c = new JLabel (); d = new JLabel (); button.setBounds(80, 90, 90, 30); ta.setBounds(30, 10, 30, 30); tb.setBounds(92, 10, 30, 30); tc.setBounds(150, 10, 30, 30); a.setBounds(42, 50, 40, 30); b.setBounds(92, 50, 40, 30); c.setBounds (142, 50, 40, 30); d.setBounds(188, 50, 40, 30); k1.setBounds (34, 50, 30, 30); k2.setBounds(120, 50, 30, 30); k3.setBounds(130, 50, 30, 30); k4.setBounds(216, 50, 30, 30); x1.setBounds(70, 50, 30, 30); x2.setBounds(166, 50, 30, 30); p1.setBounds(80, 50, 30, 30); p2.setBounds(176, 50, 30, 30); la.setBounds(62, 10, 30, 30); lb.setBounds(124, 10, 30, 30); eq.setBounds(25, 50, 30, 30); JPanel pane = new JPanel (); pane.setLayout(null); pane.add(button); pane.add(a); pane.add(b); pane.add(c); pane.add(d); pane.add(ta); pane.add(tb); pane.add(tc); pane.add(la); pane.add(lb); pane.add(eq); pane.add(k1); pane.add(k2); pane.add(k3); pane.add(k4); pane.add(p1); pane.add(p2); pane.add(x1); pane.add(x2); getContentPane().add(pane); } public static void main(String[] args) { Factorization frame = new Factorization (); frame.setBounds (100, 100, 260, 180); frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE); frame.setVisible(true); } }
ものすごい無理やり感のあるコードになったが、とりあえず因数分解できることは確認。
本コードでは、(1)ax2 - bx + c、(2)-ax2 + b + c、(3)その他の3通りに場合分けした。
(-ax2 + b + cを場合分けしないと、うまく計算してくれなかった理由は不明だが)
もう少しシンプルな方法が有りそうだが、現状の知識ではこんなものだろう。