|
!以下のプログラムで二次方程式を解きたいのですが、どうにも手詰まりです。
!特にa=12,b=23,c=34,d=45,e=56,f=67の場合、如何ともし難いので、
!お分かりになられる方、ご教授を下さるようお願いいたします。
!----------------------------------------------------------------------
!二次方程式を解くためのプログラム
!根はわざと開かないような仕様にいたしました。
!----------------------------------------------------------------------
00100 LET t0=TIME
00500 DECLARE EXTERNAL FUNCTION GCD
01000 !【1】配列
01100 DIM x(2)
01200 DIM y(3)
01300 GOTO 02000 !【2】代入へ
02000 !【2】代入
02100 PRINT "「二次方程式の解を計算します。"
02110 PRINT " a/d*x^2 + b/e*x + c/f = 0 の形式で、"
02120 PRINT " a,b,c,d,e,fの順序で入力してください。」"
02130 PRINT " <例> a*x^2 + b*x + c = 0 のとき、"
02140 PRINT " a,b,c,1,1,1と入力します。"
02300 INPUT a,b,c,d,e,f
02400 LET y(1)=a*e*f !置き換え
02500 LET y(2)=b*d*f
02600 LET y(3)=c*d*e
02700 LET G=GCD(GCD(y(1),y(2)),y(3))
02750 LET a=y(1)/G
02800 LET b=y(2)/G
02850 LET c=y(3)/G
02900 GOTO 03000 !【3】判別式分岐へ
03000 !【3】判別式分岐
03100 LET D=b^2-4*a*c !D=平方数
03200 IF D>=0 THEN GOTO 04000 !【4】実数解のときの平方数分岐
03300 IF D<0 THEN GOTO 03400
03400 LET D=-D
03500 GOTO 08000!【8】虚数解のときの分岐
04000 !【4】実数解のときの平方数分岐
04100 IF INT(SQR(D))=SQR(D) THEN GOTO 05000!【5】!実数解のときのD=平方数のときの解
04200 IF INT(SQR(D))><SQR(D) THEN GOTO 06000!【6】!実数解のときのD≠平方数のときの分岐
05000 !【5】実数解のときのD=平方数のときの解
05100 LET x(1)=(-b-SQR(D))/(2*a)
05200 LET x(2)=(-b+SQR(D))/(2*a)
05300 PRINT "x(1)=";x(1)
05400 PRINT "x(2)=";x(1)
05500 GOTO 20000 !ENDへ
06000 !【6】実数解のときのD≠平方数のときの分岐
06100 FOR i=2 TO INT(SQR(D))
06300 IF MOD(D/(i^2)-INT(D/(i^2)),1)><0 THEN GOTO 06900 !iの探索を行うループ
06400 IF MOD(D/(i^2)-INT(D/(i^2)),1)=0 THEN GOTO 06500 !除数分岐へ
06500 IF MOD((i^2)-INT((i^2)),1)><0 THEN GOTO 06900
06600 IF MOD((i^2)-INT((i^2)),1)=0 THEN GOTO 06620 !実数解のときの-D≠平方数のときの解
06620 IF i/GCD(2*a,i)=1 THEN GOTO 06820
06640 IF i/GCD(2*a,i)><1 THEN GOTO 06700
06700 PRINT "x(1)=";-b/GCD(2*a,b);"/";2*a/GCD(2*a,b);"+";i/GCD(2*a,i);"√";D/(i^2);"/";2*a/GCD(2*a,i)
06800 PRINT "x(2)=";-b/GCD(2*a,b);"/";2*a/GCD(2*a,b);"-";i/GCD(2*a,i);"√";D/(i^2);"/";2*a/GCD(2*a,i)
06805 PRINT "⇔"
06810 GOTO 06900
06820 PRINT "x(1)=";-b/GCD(2*a,b);"/";2*a/GCD(2*a,b);"+";"√";D;"/";2*a
06840 PRINT "x(2)=";-b/GCD(2*a,b);"/";2*a/GCD(2*a,b);"-";"√";D;"/";2*a
06850 PRINT "⇔"
06900 NEXT i
07000 PRINT"これが解です。"
07100 GOTO 20000 !ENDへ
08000 !【8】虚数解のときの平方数分岐
08100 IF INT(SQR(D))=SQR(D) THEN GOTO 09000!【9】!虚数解のときの-D=平方数のときの解
08200 IF INT(SQR(D))><SQR(D) THEN GOTO 10000!【10】!虚数解のときの-D≠平方数のときの分岐
09000 !【9】虚数解のときの-D=平方数のときの解
09100 LET x(1)=(-b-SQR(D))/(2*a)
09200 LET x(2)=(-b+SQR(D))/(2*a)
09300 PRINT "x(1)=";x(1)
09400 PRINT "x(2)=";x(2)
09500 GOTO 20000 !ENDへ
10000 !【10】虚数解のときの-D≠平方数のときの分岐
10100 FOR i=2 TO INT(SQR(D))
10300 IF MOD(D/(i^2)-INT(D/(i^2)),1)><0 THEN GOTO 10900 !iの探索を行うループ
10400 IF MOD(D/(i^2)-INT(D/(i^2)),1)=0 THEN GOTO 10500 !除数分岐へ
10500 IF MOD((i^2)-INT((i^2)),1)><0 THEN GOTO 10900
10600 IF MOD((i^2)-INT((i^2)),1)=0 THEN GOTO 10620 !実数解のときの-D≠平方数のときの解
10620 IF i/GCD(2*a,i)=1 THEN GOTO 10820
10640 IF i/GCD(2*a,i)><1 THEN GOTO 10700
10700 PRINT "x(1)=";-b/GCD(2*a,b);"/";2*a/GCD(2*a,b);"-";i/GCD(2*a,i);"√";D/(i^2);"i/";2*a/GCD(2*a,i)
10800 PRINT "x(2)=";-b/GCD(2*a,b);"/";2*a/GCD(2*a,b);"+";i/GCD(2*a,i);"√";D/(i^2);"i/";2*a/GCD(2*a,i)
10805 PRINT "⇔"
10810 GOTO 10900
10820 PRINT "x(1)=";-b/GCD(2*a,b);"/";2*a/GCD(2*a,b);"+";"√";D;"i/";2*a
10840 PRINT "x(2)=";-b/GCD(2*a,b);"/";2*a/GCD(2*a,b);"-";"√";D;"i/";2*a
10850 PRINT "⇔"
10900 NEXT i
11100 PRINT"これが解です。"
11150 PRINT TIME-t0;"秒かかりました。"
11200 GOTO 20000 !ENDへ
20000 END
30000 EXTERNAL FUNCTION GCD(a,b)
30100 DO
30200 LET r=MOD(a,b)
30300 IF r=0 THEN EXIT DO
30400 LET a=b
30500 LET b=r
30600 LOOP
30700 LET GCD=b
30800 END FUNCTION
|
|