1 DIM A(37),B(37),C(36),D(36)
2  SIGNIFICANCE 10
4 TOL=.00001
5 ! VALUES PLACED IN THE A() ARRAY ARE LOST DURING EXECUTION
7 PRINT TAB(-1,0)
10 INPUT "WOULD YOU LIKE THE INSTRUCTIONS FOR USING THIS PROGRAM?(YES OR NO)";A$
15 IF A$="NO" THEN 200
20 IF A$="N" THEN 200
25 ?:?:?
27 REM INSTRUCTIONS FOR USER
30 PRINT "THIS PROGRAM WILL FIND THE ROOTS OF A POLYNOMIAL UP TO 36TH DEGREE":?
35 PRINT "A POLYNOMIAL IS SIMPLY A LINEAR COMBINATION OF VARIOUS POWERS OF"
40 PRINT "A GIVEN VARIALBLE.":?:? " FOR EXAMPLE:":?
45 PRINT "Y = C0 + C1*X + C2*X^2 + C3*X^3 + C4*X^4 + ... + CN*X^N":?
50 PRINT "IN THE ABOVE EXAMPLE, C0 IS THE CONSTANT TERM AND C1,C2,C3,C4,..CN"
55 PRINT "ARE THE COEFFICIENTS OF THE VARIOUS POWERS OF X":?
60 PRINT "THE ORDER OF A POLYNOMIAL IS DEFINED AS THE LARGEST POWER OF X WITH"
65 PRINT "A NON-ZERO COEFFICIENT":?
70 PRINT "THE ORDER OF Y=3 - 2*X + X^4 IS 4 FOR Y=3 + 2*X^10 THE ORDER IS 10":?
75 PRINT "THIS PROGRAM WILL ONLY WORK FOR POLYNOMIALS WITH AN ORDER GREATER"
76 PRINT "THAN, BUT NOT EQUAL TO ZERO, AND LESS THAN 36.":?
80 PRINT TAB(25);"HIT RETURN TO CONTINUE";:INPUT A$
82 PRINT TAB(-1,0)
85 PRINT "AN NTH ORDER POLYNOMIAL WILL HAVE N ROOTS AND THIS PROGRAM WILL ";
90 PRINT "FIND THEM ALL;":?
95 PRINT "BOTH REAL AND IMAGINARY":?
100 PRINT "ALL THE ROOTS WILL BE RETURNED IN THE FOLLOWING FORM: A+B*I":?
105 PRINT "IF B IS NOT ZERO THE ROOT IS IMAGINARY AND HAS NO PHYSICAL";
110 PRINT " INTERPRETATION.":?
115 PRINT "HOWEVER, IF B=0 THE ROOT IS REAL AND REPRESENTS THE POINT AT WHICH"
120 PRINT "THE VALUE OF THE FUNCTION IS ZERO."
125 PRINT "(I.E. THE POINT WHERE THE GRAPH CROSSES THE HORIZONTAL OR X AXIS.)"
130 PRINT:? "TO ENTER YOUR POLYNOMIAL JUST ANSWER THE QUESTIONS THAT ";
135 PRINT "THE PROGRAM ASKS":?:?:?:?
140 PRINT "REMEMBER:";TAB(30);"1) THE ORDER OF THE POLYNOMIAL MUST BE >0 ";
142 PRINT "AND <36.":?
145 PRINT TAB(30);"2) THE HIGHEST POWER COEFFICIENT MUST NOT BE ZERO":?
150 PRINT TAB(30);"3) REAL ROOTS ARE THOSE WITH NO IMAGINARY PART"
155 INPUT "HIT RETURN TO CONTINUE";A$
160 PRINT TAB(-1,0)
165 GOTO 200
190 REM INPUT OF DATA
200 INPUT "ORDER OF THE POLYNOMIAL?";Z
205 I1=Z+1
206 IF I1>36 OR I1<=1 GOSUB 1000
210 INPUT "CONSTANT TERM=?";A(1)
215 FOR I=1 TO Z
220 PRINT "COEFFICENT OF X^";I;:INPUT "TERM = ?";A(I+1)
225 NEXT I
230 PRINT TAB(-1,0)    !CLEARS SCREEN AND HOMES CURSOR
235 PRINT TAB(1,1);"Y= ";
240 Z=INT(I1/4+.8)
243 PRINT TAB(5);A(1);" + ";A(2);"*X + ";A(3);"*X^ 2 + ";A(4);"*X^ 3":?
244 IF Z<2 THEN 270
245 FOR I=1 TO Z-1
247 IF I=9 GOTO 266
250 PRINT TAB(5);A(1+4*I);"*X^";4*I;" + ";A(2+4*I);"*X^";4*I+1;" + ";
255 PRINT A(3+4*I)"*X^";4*I+2;" + ";A(4+4*I);"*X^";3+4*I
262 PRINT
263 NEXT I
265 IF I<9 THEN 270
266 PRINT TAB(5);A(1+4*I);"*X^";4*I
270 ?: GOTO 1050: REM ERROR CHECKING SUBROUTINE
1000 IF I1<37 THEN 1010
1003 REM I1 IS THE NUMBER OF COEFFICIENTS ENTERED
1004 REM ER IS THE ERROR MESSAGE CODE
1005 ER=2: GOTO 1980
1010 IF I1>1 THEN 1020
1015 ER=1: GOTO 1980
1020 IF ABS(A(I1))-TOL>0 THEN 1050
1030 ER=4: GOTO 1980
1032 RETURN
1050 N=I1-1
1055 IF N<=0 THEN 1980
1060 N1=N
1070 N2=N+1
1080 N3=1
1090 K=N+1
1100FOR L=1 TO K
1110 M1=K-L+1
1120 B(M1)=A(L)
1130 NEXT L
1135 REM SET INITIAL VALUES
1140 X0=.00500101
1150 Y0=.01000101
1155 REM ZERO INITIAL VALUE COUNTER
1160 I2=0
1170 X2=X0
1175 REM INCREMENT INITIAL VALUES AND COUNTER
1180 X0=-10*Y0
1181 Y0=-10*X2
1182 X2=X0
1183 REM SET X AND Y TO CURRENT VALUES
1190 Y1=Y0
1200 I2=I2+1
1210 GO TO 1250
1220 I3=1
1230 X3=X2
1240 Y3=Y1
1245 REM EVALUATE POLYNOMIAL AND DERIVATIVES
1250 I4=0
1260 U1=0
1270 U2=0
1280 V=0
1290 Y4=0
1300 X4=1
1310 U=B(N+1)
1320 IF U=0 THEN 1770
1330 FOR I=1 TO N   STEP 1
1340 L=N-I+1
1350 X5=X2*X4-Y1*Y4
1360 Y5=X2*Y4+Y1*X4
1370 U=U+B(L)*X5
1380 V=V+B(L)*Y5
1390 F=I
1400 U1=U1+F*X4*B(L)
1410 U2=U2-F*Y4*B(L)
1420 X4=X5
1430 Y4=Y5
1440 NEXT I
1450 S=U1*U1+U2*U2
1460 IF S = 0 THEN 1670
1470 D1=(V*U2-U*U1)/S
1480 X2=X2+D1
1490 D2=-(U*U2+V*U1)/S
1500 Y1=Y1+D2
1510 IF ABS(D2)+ABS(D1)-1.0E-05 <0 THEN 1570
1515 REM STEP ITERATION COUNTER
1520 I4=I4+1
1525 REM I4 IS THE ITERATION COUNTER
1530 IF I4-500 <0 THEN 1260
1540 IF I3 <>0 THEN 1570
1545 REM I2 IS THE NUMBER OF DIFFERENT STARTING VALUES USED
1550 IF I2-5 < 0 THEN 1170
1555 ER=3
1560 GO TO 1980
1570 FOR L=1 TO N2   STEP 1
1580 M1=K-L+1
1590 T=A(M1)
1600 A(M1)=B(L)
1610 B(L)=T
1620 NEXT L
1630 T1=N
1640 N=N1
1650 N1=T1
1660 IF I3 = 0 THEN 1220
1661 IF I3 <>0 THEN 1700
1670 IF I3 = 0 THEN 1170
1680 X2=X3
1690 Y1=Y3
1700 I3=0
1710 IF X2 = 0 THEN 1730
1720 IF ABS(Y1)-ABS(X2)*1.0**-4 <0 THEN 1800
1730 A1=X2+X2
1740 S=X2*X2+Y1*Y1
1750 N=N-2
1760 GO TO 1840
1770 X2=0
1780 N1=N1-1
1790 N2=N2-1
1800 Y1=0
1810 S=0
1820 A1=X2
1830 N=N-1
1840 L1=1
1850 L2=2
1860 B(L2)=B(L2)+A1*B(L1)
1870 FOR L=2 TO N   STEP 1
1880 B(L+1)=B(L+1)+A1*B(L)-S*B(L-1)
1885 NEXT L
1886 REM ARRAY C() CONTAINS REAL PORTIONS OF ALL ROOTS
1887 REM ARRAY D() CONTAINS IMAGINARY PORTION OF ALL ROOTS
1890 D(N3)=Y1
1900 C(N3)=X2
1910 N3=N3+1
1920 IF S = 0 THEN 1960
1930 Y1=-Y1
1940 S=0
1950 GO TO 1890
1960 IF N <=0 THEN 2010
1970 IF N > 0 THEN 1140
1980 ?:?:? TAB(22);"ERROR...ERROR...ERROR...ERROR...ERROR...ERROR"
1982 ?:? TAB(37);"ERROR = ";ER:?:?
1984 PRINT TAB(35);"ERROR CODE":?:?
1986 PRINT TAB(15);"ERROR = 1  ORDER OF POLYNOMIAL IS LESS THAN ONE":?
1988 PRINT TAB(15);"ERROR = 2  ORDER OF POLYNOMIAL IS GREATER THAN 36":?
1990 PRINT TAB(15);"ERROR = 3  UNABLE TO DETERMINE ROOT WITHIN 500 ITERATIONS"
1992 PRINT TAB(26);"AND 5 STARTING VALUES.":?
1994 PRINT TAB(15);"ERROR = 4  HIGHEST ORDER COEFFICIENT IS LESS THAN";TOL:?
1996 INPUT "HIT RETURN TO CONTINUE";A$
1998 PRINT TAB(-1,0)  !CLEAR SCREEN
2000 GOTO 200
2005 REM OUTPUT OF RESULTS
2010 PRINT TAB(15);".......THE ROOTS TO THE ABOVE POLYNOMIAL ARE AS FOLLOWS........"
2015 FOR I=1 TO I1-1
2020 PRINT TAB(25);C(I);" + ";D(I);"*I"
2025 NEXT I
2030 INPUT "DO YOU HAVE ANOTHER POLYNOMIAL?";A$
2035 IF A$="NO" THEN 3000
2040 IF A$="N" THEN 3000
2045 PRINT TAB(-1,0)
2050 GOTO 200
2055 REM A PROGRAM BY JACK WARNER AND DON PENLAND
2060 REM SURPRISE VALLEY HIGH SCHOOL, PO BOX 28-F, CEDARVILLE, CA 96104
2065 REM THIS PROGRAM WAS ADAPTED FROM AN IBM FORTRAN PROGRAM
2070 REM SO IT COULD BE USED ON AN ALPHA MICRO SYSTEM
3000 END