10	DATA 1,3,6
11	DATA 2,1,-6,5
12	DATA 3,3,-7,0,4
305	 DIM A(25),B(25),X(25)
310	LET G8=0
315	PRINT
320	LET G8=G8+1
325	PRINT
330	 READ N
335	IF N=0 THEN 999
340	PRINT
345	PRINT "POLYNOMIAL NUMBER";G8;"IS OF ORDER";N
350	PRINT
355	PRINT "   COEFFICIENTS (IN DESCENDING ORDER) ARE:"
360	PRINT
365	PRINT "      ";
370	 FOR I=0 TO N
375	READ A(I)
380	  PRINT A(I);
385	 LET B(I)=A(I)
390	NEXT I
395	PRINT
400	 PRINT
405	PRINT "   THE ROOTS ARE:"
410	 PRINT
415	 IF N<=2 THEN 665
420	 IF A(N) = 0 THEN 705
425	 IF (N/2-INT(N/2))=0 THEN 440
430	 GOSUB 745
435	 GOTO 415
440	 IF ABS(A(N-2))< 1.E-25 THEN 460
445	 LET P=A(N-1)/A(N-2)
450	LET Q=A(N)/A(N-2)
455	 GOTO 470
460	 LET P=A(N-1)
465	 LET Q=A(N)
470	FOR I = 0 TO N
475	LET X(I)=A(I)
480	NEXT I
485	GOSUB 720
490	 FOR I = 0 TO N-2
495	 LET B(I)=X(I)
500	 NEXT I
505	LET R=X(N-1)
510	LET S=A(N)-P*X(N-1)-Q*X(N-2)
515	GOSUB 720
520	 LET X(N-1)=-P*X(N-2)-Q*X(N-3)
525	 LET D=X(N-2)^2-X(N-1)*X(N-3)
530	 IF ABS(D ) > 1.E-25 THEN 545
535	PRINT "       UNOBTAINABLE WITH THIS PROGRAM.  SORRY ABOUT THAT."
540	 GOTO 315
545	 LET P1=P+(R*X(N-2)-S*X(N-3))/D
550	 LET Q1=Q+(S*X(N-2)-R*X(N-1))/D
555	 IF ABS(P ) > 1.E-25 THEN 575
560	 IF ABS(P1) > 1.E-25 THEN 575
565	 IF ABS( Q) > 1.E-25 THEN 580
570	 GOTO 585
575	 IF ABS(P1/P-1)>.000001 THEN 585
580	 IF ABS(Q1/Q-1)<.000001 THEN 600
585	 LET P=P1
590	LET Q=Q1
595	 GOTO 470
600	 FOR I=1 TO N-2
605	LET A(I)=B(I) 
610	 NEXT I
615	 LET  N=N-2
620	 LET D=P*P-4*Q
625	 IF D<0 THEN 650
630	 LET D=SQR(D)
635	PRINT "      ";(-P+D)/2;" AND  ";(-P-D)/2
640	IF N-2>0 THEN 420
645	 GOTO 665
650	 LET D=SQR(-D)
655	PRINT "      ";-P/2;"+ J *";D/2;" AND  ";-P/2;"- J *";D/2
660	 IF N-2>0 THEN 420
665	 IF N=1 THEN 695
670	IF N=0 THEN 315
675	 LET P=B(1)/B(0)
680	 LET Q=B(2)/B(0)
685	 LET N=0
690	 GOTO 620
695	PRINT "      ";-B(1)/B(0)
700	GOTO 315
705	PRINT "       0.00000"
710	 LET N=N-1
715	GOTO 415
720	LET X(1)=X(1)-P*X(0)
725	 FOR I=2 TO N-1
730	 LET X(I)=X(I)-P*X(I-1)-Q*X(I-2)
735	 NEXT I
740	 RETURN
745	 IF B(1) = 0 THEN 760
750	 LET X=-B(1)/B(0)
755	 GOTO 765
760	 LET X=-B(N)/B(0)
765	 LET F=0
770	 LET F1=0
775	 FOR I=0 TO N
780	 LET J=N-I
785	 IF B(J)=0 THEN 805
790	 LET F=B(J)*X^I+F
795	 IF I = 0 THEN 805
800	 LET F1=I*B(J)*X^(I-1)+F1
805	 NEXT I
810	 LET X1=X-F/F1
815	 IF ABS(X/X1-1) < .000001 THEN 830
820	 LET X=X1
825	 GOTO 765
830	PRINT "      ";X1
835	 LET N=N-1
840	 FOR I=1 TO N
845	 LET A(I)=B(I)+X1*A(I-1)
850	 LET B(I)=A(I)
855	 NEXT I
860	 RETURN
865	STOP
870	PRINT
875	PRINT "THIS PROGRAM FINDS THE ROOTS OF POLYNOMIALS"
880	PRINT "USING BAIRSTOW'S METHOD.  TO USE, ENTER DATA"
885	PRINT "IN DATA STATEMENTS AS FOLLOWS:"
890	PRINT
895	PRINT "   10 DATA  N, A(N), A(N-1),......, A(1), A(0)"
900	PRINT
905	PRINT "WHERE N IS THE ORDER OF THE POLYNOMIAL AND"
910	PRINT "A(I) IS THE COEFFICIENT OF THE I-TH DEGREE"
915	PRINT "TERM.  MORE THAN ONE DATA LINE MAY BE USED"
920	PRINT "TO SUPPLY COEFFICIENTS FOR ONE POLYNOMIAL,"
925	PRINT "AND ADDITIONAL POLYNOMIALS MAY BE SOLVED ON"
930	PRINT "A SINGLE RUN BY SUPPLYING DATA FOR THEM ON"
935	PRINT "SUBSEQUENT DATA LINES (NOT BEYOND LINE 299)."
940	PRINT
945	PRINT "CAUTION:  THERE ARE A FEW TYPES OF POLYNOMIALS"
950	PRINT "WHICH THIS PROGRAM IS UNABLE TO SOLVE.  PROGRAM"
955	PRINT "WILL SO INDICATE AND GO ON TO NEXT CASE.  ALSO,"
960	PRINT "FOR HIGH ORDER POLYNOMIALS, PROGRAM MAY REQUIRE"
965	PRINT "MANY ITERATIONS, SO RUNNING TIME CAN BE HIGH."
975	PRINT"ENTER DATA BEGINNING ON LINE 10 THEN TYPE 'RUN'"
998	DATA 0
999	END
