二次方程式を解く2/2(全2/2)

 投稿者:nuメール  投稿日:2012年 1月29日(日)07時19分41秒
  !2/2

03000 !【3】判別式分岐
03100 LET D=b^2-4*a*c !D=平方数
03200 IF D>0 THEN GOTO 04000 !【4】実数解のときの平方数分岐
03250 IF D=0 THEN GOTO 04300
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≠平方数のときの分岐
04300 IF INT(b/GCD(b,2*a))><INT(2*a/GCD(b,2*a)) AND 2*a/GCD(b,2*a)><1 THEN GOTO 04500
04400 IF INT(b/GCD(b,2*a))=INT(2*a/GCD(b,2*a)) OR 2*a/GCD(b,2*a)=1 THEN GOTO 04700
04500 PRINT "x=";-b/GCD(b,2*a);"/";2*a/GCD(b,2*a);"(重解)"
04600 GOTO 20000
04700 PRINT "x=";-b/2/a;"(重解)"
04800 GOTO 20000

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(2)
05500 GOTO 20000 !ENDへ

06000 !【6】実数解のときのD≠平方数のときの分岐
06100 FOR i=INT(SQR(D)) TO 1 STEP -1
06300    IF FP( D/(i^2))><0 THEN GOTO 06900 !iの探索を行うループ
06400    IF FP( D/(i^2))=0 THEN GOTO 06500 !除数分岐へ
         !06410    IF i=GCD(2*a,i) THEN GOTO 06450
         !06420    IF i><GCD(2*a,i) THEN GOTO 06500
         !06450    PRINT "x(1)=";-b/GCD(2*a,b);"/";2*a/GCD(2*a,b);"-";"√";D/(i^2);"/";(2*a)/i
         !06460    PRINT "x(2)=";-b/GCD(2*a,b);"/";2*a/GCD(2*a,b);"+";"√";D/(i^2);"/";(2*a)/i
         !06470    PRINT "⇔"
         !06480    GOTO 06900
06500    PRINT "x(1)=";-b/GCD(2*a,b);"/";2*a/GCD(2*a,b);"-";i/GCD(2*a,i);"/";(2*a)/GCD(2*a,i);"√";D/(i^2)
06600    PRINT "x(2)=";-b/GCD(2*a,b);"/";2*a/GCD(2*a,b);"+";i/GCD(2*a,i);"/";(2*a)/GCD(2*a,i);"√";D/(i^2)
06700    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=INT(SQR(D)) TO 1 STEP -1
10300    IF FP( D/(i^2))><0 THEN GOTO 10900 !iの探索を行うループ
10400    IF FP( D/(i^2))=0 THEN GOTO 10500 !除数分岐へ
         !10410    IF i=GCD(2*a,i) THEN GOTO 10450
         !10420    IF i=GCD(2*a,i) THEN GOTO 10500
         !10450    PRINT "x(1)=";-b/GCD(2*a,b);"/";2*a/GCD(2*a,b);"-i*";"√";D/(i^2);"/";(2*a)/i
         !10460    PRINT "x(2)=";-b/GCD(2*a,b);"/";2*a/GCD(2*a,b);"+i*";"√";D/(i^2);"/";(2*a)/i
         !10470    PRINT "⇔"
         !10480    GOTO 10900
10500    PRINT "x(1)=";-b/GCD(2*a,b);"/";2*a/GCD(2*a,b);"-i*";i/GCD(2*a,i);"/";(2*a)/GCD(2*a,i);"√";D/(i^2)
10600    PRINT "x(2)=";-b/GCD(2*a,b);"/";2*a/GCD(2*a,b);"+i*";i/GCD(2*a,i);"/";(2*a)/GCD(2*a,i);"√";D/(i^2)
10700    PRINT "⇔"
10900 NEXT i
11000 PRINT"これが解です。"
12000 GOTO 20000 !ENDへ
13000 PRINT TIME-t0;"秒かかりました。"
14000 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
 

戻る