def display_roots(E) {
	L = roots_to_tex(E);
	shell("cd /tmp; rm -f asir_tex*");
	output("/tmp/asir_tex.tex");
	print("\hoffset -1in\voffset -0.8in");
	for ( T = L, I = 0; T != []; T = cdr(T), I++ ) {
		S = car(T); print("\par$root",0); print(I,0);
		print("=",0); print(S[1],0); print("$");
	}
	print("\bye");
	output();
	exec_tex("asir_tex","+copy -s 2 -paper a6r -geometry 800x200");
}

def exec_tex(F,O)
{
	T = "cd /tmp; tex "+F+".tex 2>&1 >/dev/null";
	Status = shell(T);
	if ( !Status ) {
		X = "cd /tmp; xdvi "+O+" "+F+".dvi";
		Status = shell(X);
		if ( Status )
			print("error on xdvi");
	} else
		print("error on tex");
	R = "cd /tmp; rm -f "+F+"*";
	shell(R);
}

def roots_to_tex(E) {
	if ( E == [] )
		return [];
	E0 = E[0]; A = algtorat(E0[0]); M = E0[1];
	T = roots_to_tex(cdr(E));
	R = subst_tex(-coef(M,0,A)/coef(M,deg(M,A),A),T);
	if ( deg(M,A) == 2 )
		R = "{\root "+" \of {"+R+"}}";
	else
		R = "{\root "+rtostr(deg(M,A))+" \of {"+R+"}}";
	return cons([A,R],T);
}

def subst_tex(P,E) {
	if ( type(P) == 1 )
		return "{"+rtostr(P)+"}";
	else {
		V = var(P);
		for ( T = E; T != []; T = cdr(T) )
			if ( car(car(T)) == V )
				break;
		VT = car(T); R = VT[1];
		for ( S = ""; P; P -= C*V^I ) {
			I = deg(P,V); C = coef(P,I,V);
			if ( type(C) == 1 ) {
				if ( C == 1 ) {
					if ( S != "" )
						S += "+";
					if ( I == 0 )
						S += "1";
				} else if ( C == -1 ) {
					S += "-";
					if ( I == 0 )
						S += "1";
				} else if ( C < 0 )
					S += rtostr(C);
				else {
					if ( S != "" )
						S += "+";
					S += rtostr(C);
				}
			} else {
				if ( S != "" )
					S += "+";
				S += "\left({" + subst_tex(C,E) + "}\right)";
			}
			if ( I == 1 )
				S += R;
			else if ( I > 1 )
					S += "\left(" + R + "\right)" + "^{" + rtostr(I) + "}";
		}
		return S;
	}
}

def roots_to_c(E) {
	if ( E == [] )
		return [];
	E0 = E[0]; A = algtorat(E0[0]); M = E0[1];
	T = roots_to_c(cdr(E));
	R = subst_c(-coef(M,0,A)/coef(M,deg(M,A),A),T);
	R = R^(1/deg(M,A));
	return cons([A,R],T);
}

def subst_c(P,E) {
	if ( type(P) == 1 )
		return P;
	else {
		V = var(P);
		for ( T = E; T != []; T = cdr(T) )
			if ( car(car(T)) == V )
				break;
		VT = car(T); R = VT[1];
		for ( S = 0; P; P -= C*V^I ) {
			I = deg(P,V); C = coef(P,I,V);
			S += subst_c(C,E)*R^I;
		}
		return S;
	}
}
end;
