PROGRAM QUBIC_ROOT_COMPUTATION
C=======================================================================
C SOLUTION OF X**3+A*X**2+B*X+C=0
C EIJI FUKUMORI
C 29 DECEMBER 2012
C=======================================================================
IMPLICIT REAL*8 ( A-H , O-Z )
COMPLEX*16 BETA, T1, T2, ALPHA, X1, X2, X3
WRITE (*,*) 'QUBIC ROOT COMPUTATION'
C------------ CASE OF TRIPLE ROOT --------------------
C TRY A = -9.D0 B = 27.D0 C = -27.D0
C X1=3, X2=3, X3=3
C-----------------------------------------------------
C------------ CASE OF DOUBLE ROOT --------------------
C TRY A = -7.D0 B = 16.D0 C = -12.D0
C X1=3, X2=2, X3=2
C-----------------------------------------------------
A = -7.D0
B = 16.D0
C = -12.D0
C
WRITE (*,*) 'A, B, C =', A, B, C
IF ( A.EQ.0.D0 .AND. B.EQ.0.D0 .AND. C.EQ.0.D0 ) THEN
X1 = DCMPLX(0.D0, 0.D0)
X2 = DCMPLX(0.D0, 0.D0)
X3 = DCMPLX(0.D0, 0.D0)
ELSE
P = -A**2/3.D0 + B
Q = 2.D0*A**3/27.D0 -A*B/3.D0 + C
IF ( P.EQ.0.D0 .AND. Q.EQ.0.D0 ) THEN
X1 = DCMPLX(-A/3.D0, 0.D0)
X2 = DCMPLX(-A/3.D0, 0.D0)
X3 = DCMPLX(-A/3.D0, 0.D0)
ELSE
DISCR = Q**2 + (4.D0/27.D0)*P**3
BETA = (-DCMPLX(Q) - CDSQRT(DCMPLX(DISCR)))/2.0D0
WRITE (*,*) 'BETA =', BETA
ALPHA = BETA**(1.D0/3.D0)
T1 = DCMPLX(-0.5D0, +0.5D0*DSQRT(3.D0))
T2 = DCMPLX(-0.5D0, -0.5D0*DSQRT(3.D0))
WRITE (*,*) 'ALPHAS ARE ', ALPHA, ALPHA*T1, ALPHA*T2
X1 = ALPHA -DCMPLX(P)/(3.D0*ALPHA) - DCMPLX(A)/3.D0
X2 = ALPHA*T1 -DCMPLX(P)/(3.D0*ALPHA*T1) - DCMPLX(A)/3.D0
X3 = ALPHA*T2 -DCMPLX(P)/(3.D0*ALPHA*T2) - DCMPLX(A)/3.D0
END IF
END IF
C
WRITE (*,*) 'SOLUTIONS TO QUBIC EQ. ARE ', X1, X2, X3
WRITE (*,*) 'CONFIRMATION OF SOLUTIONS'
WRITE (*,*) 'X1**3+A*X1**2+B*X1+C=', X1**3+A*X1**2+B*X1+C
WRITE (*,*) 'X2**3+A*X2**2+B*X2+C=', X2**3+A*X2**2+B*X2+C
WRITE (*,*) 'X3**3+A*X3**2+B*X3+C=', X3**3+A*X3**2+B*X3+C
OPEN ( 1,FILE='QUBIC.SOL', STATUS='UNKNOWN' )
WRITE (1,*) '0. 0.'
WRITE (1,*) DREAL(X1), DIMAG(X1)
WRITE (1,*)
WRITE (1,*) '0. 0.'
WRITE (1,*) DREAL(X2), DIMAG(X2)
WRITE (1,*)
WRITE (1,*) '0. 0.'
WRITE (1,*) DREAL(X3), DIMAG(X3)
R = DSQRT(DREAL(X1)**2+DIMAG(X1)**2)
R = DMAX1 ( R, DSQRT(DREAL(X2)**2+DIMAG(X2)**2) )
R = DMAX1 ( R, DSQRT(DREAL(X3)**2+DIMAG(X3)**2) )
PI = 4.D0*DATAN (1.D0)
N = 40
DANG = 2.D0*PI / N
WRITE (1,*)
WRITE (1,*) R, ' 0.'
DO I = 1 , N
ANG = I*DANG
X = R*DCOS(ANG)
Y = R*DSIN(ANG)
WRITE (1,*) X , Y
END DO
CLOSE (1)
STOP
END