// Autor: H.Podhaisky, M. Kotschote
import java.awt.*;
import java.math.*;
import java.awt.event.*;
import java.applet.*;
import java.util.*;
import java.net.*;
import java.io.*;

public class Prog extends Applet 
{
    MyControls controls; 
    MyCanvas canvas;       

    public void init() {
    setLayout(new BorderLayout());
    canvas = new MyCanvas();
    add("North",canvas); 
    add(controls = new MyControls(canvas));
    }
     
    static class MyAdapter extends WindowAdapter {
        public void windowClosing(WindowEvent e) {
	    System.out.println("Close \n"+e);
	    
	    System.exit(0);
	}
    }

    public void destroy() {
        remove(controls);
        remove(canvas);
    }

    public void start() {
    controls.setEnabled(true);
    }

    public void stop() {
    controls.setEnabled(false);
    }
  
    public void processEvent(AWTEvent e) {
		System.out.println("in AWT\n");
        if (e.getID() == Event.WINDOW_DESTROY) {
            System.exit(0);
        }
    }

    public static void main(String args[]) {
    Frame f = new Frame("Prog");
    Prog myProg = new Prog();

    myProg.init();
    myProg.start();

    f.add("Center", myProg);
    f.setSize(500, 500);
    f.show();
	f.addWindowListener(new MyAdapter());
    }

    public String getAppletInfo() {
        return "";
    }

    public void actionPerformed(ActionEvent e) {
	System.out.println("Action "+e);
	}
}

class MyCanvas extends Canvas  {

    Font font;
    String res="";
    int N;

    public void paint(Graphics g) {
    Rectangle r = getBounds();
    
    g.setColor(Color.black);
    g.setFont(font);
    }  
    public void redraw(Integer zahl, MyControls myPanel) {
	
	N=zahl.intValue();
	fac();
        myPanel.output.append(res);

    repaint();
    
    }

    void spalte_ab(int l){
	int ex;
	int dd,dd1=1;
	
	ex=0;dd=l;
	while(N%dd==0) {
	    dd1=dd;
	    dd=dd*l;
	    ex++;
	}
	if (ex==1) {
	    res+=l;
	}
	if (ex>1) {
	    res+=l+"^"+ex;
	}
	N/=dd1;
	if (ex>0 && N!=1) {
	    res+="*";
	}
	
    }

    void fac() {
	
	int[] prime1={2,3,5,7,11,13,17,19,23,29,0};
	int[] offset={1,7,11,13,17,19,23,29,0};


	double rt;
	boolean done;
	
	rt=System.currentTimeMillis();
	
	int l,i,t;
	res="N=";

	i=0;
	l=prime1[i];
	while(l!=0) {
	    spalte_ab(l);
	    l=prime1[++i];
	}
	
	t=1;
	done=false;
	while (!done) {
	    i=0;
	    l=30*t+offset[i];
	    
	    while (offset[i]!=0&&!done) {
		spalte_ab(l);
		l=30*t+offset[++i];
		if (l*l > N) done=true;
	    }

	    t++;
	}
	
	if (N!=1) res+=N;

	rt=System.currentTimeMillis()-rt;
	res+='\n';
	res+="time "+rt+" m. sec\n";
    }

	

}


    

class MyControls extends Panel implements ActionListener {
    public TextField input;
    public TextArea output;


    Panel p1 = new Panel();
    Panel p2 = new Panel();


    MyCanvas canvas;

 
    public MyControls(MyCanvas canvas) {


	Button but1=new Button("Faktorisieren!");


	
	this.canvas = canvas;
    
	p1.add(new Label("N="));
	p1.add(input = new TextField("12863273",20));
	p1.add(but1);
	
	but1.addActionListener(this);

	p2.add(output= new TextArea("",20,40));

	add("North",p1);
	add("South",p2);


    }
    public void actionPerformed(ActionEvent ev) {
    String label = ev.getActionCommand();

    canvas.redraw(new Integer(input.getText()),this);
    }

}

    

