/**
 * erdosdemo.java - 11/01/10 - 13/01/10
 * 
 * Auteur : Jean-Paul QUELEN
 * 
 * Applique le théorème de Erdös à un entier quelconque (sans les "BigInteger")
 * suppose le théorème démontré !
 *
 * ajout de main() le 06/01/18 et modifications le 28/08/22
 */

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.math.BigInteger;

public class erdosdemo extends JPanel implements ActionListener {
	static final long serialVersionUID = 220828L;
	JTextField tn;
	TextArea ta;
	JButton ok, efface;
	BigInteger n;
	String s;
	BigInteger quatre;

public erdosdemo() {
	setFont (new Font ("Arial, Helvetica, sans-serif", Font.PLAIN, 12));
	setBackground (Color.lightGray);
	setLayout (new BorderLayout ());
	JPanel p = new JPanel ();
	add (p, BorderLayout.NORTH);

// installe N = 1 et le bouton Ok dans le panneau "nord"
	p.add (new Label ("N ="));
	p.add (tn = new JTextField ("1", 10));
	p.add (ok = new JButton ("Ok"));
	ok.addActionListener (this);
	p.add (efface = new JButton ("Efface"));
	efface.addActionListener (this);

// installe le champ de texte "ta" qui recevra les éléments de la suite dans le panneau central
	p = new JPanel ();
	add (p);
	p.add (ta = new TextArea ("", 20, 50, TextArea.SCROLLBARS_VERTICAL_ONLY), BorderLayout.CENTER);
	quatre = new BigInteger ("4");
}

// Traitement de l'appui sur le bouton "Ok"

	public void actionPerformed (ActionEvent evt) {
		if (evt.getSource() == ok) {
			try {
				n = new BigInteger (tn.getText());
				s = "";
				if (n.compareTo (BigInteger.ZERO) < 0)
					ta.append ("\nEntrer un nombre entier positif\n");
				else {
					if (n.compareTo (BigInteger.ZERO) == 0)
						s = "1101001";// 0=1²+2²-3²+4²-5²-6²+7²
					else {
						BigInteger[] qr = n.divideAndRemainder (quatre);
						int index = (int) qr[1].doubleValue(); // on récupère le reste
						switch (index) {
							case 1 :
								s = "1";		// 1=1²
								break;
							case 2 :
								s = "0001";		// 2=-1²-2²-3²+4²
								break;
							case 3 :
								s = "01";		// 3=-1²+2²
								break;
							default :
							s = "";
						}
						BigInteger k = qr[0]; // on récupère le quotient
						while (k.compareTo(BigInteger.ZERO) > 0) {
							s += "1001";// 4=1²-2²-3²+4²
							k = k.subtract (BigInteger.ONE);
						}
					}
					String sta = "";
					if (ta.getText().length() > 0)
						sta = "\n\n";
					sta += n.toString() + " = ";
					for (int i = 0; i < s.length(); i++) {
						if (s.charAt (i) == '1')
							sta += " + ";
						else
							sta += " - ";
						sta += ((i + 1) * (i + 1)) + " ";
					}
					ta.append (sta);
					sta = "\n\n" + n.toString() + " = ";
					for (int i = 0; i < s.length(); i++) {
						if (s.charAt (i) == '1')
							sta += " + ";
						else
							sta += " - ";
						sta += (i + 1) + "²";
					}
					ta.append (sta);
				}
//				tn.setText(n.add(BigInteger.ONE).toString());
			}
			catch (NumberFormatException nfe) {
				ta.append ("\nEntrer un nombre entier positif\n");
			}
		} else if (evt.getSource () == efface)
			ta.setText("");
	}

	public static void main (String args []) {
		int w = 400;
		int h = 400;

		erdosdemo e = new erdosdemo ();
		JFrame f = new JFrame ("Erdös") ;
		f.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
		f.add (e) ;
		f.setSize (w, h) ;
		f.setVisible (true);
	}
}
