CTITLEMGCOMD -- FIND GREATEST COMMON DIVISOR 00000010 C*********************************************************************** C COPYRIGHT ATLANTIC RICHFIELD COMPANY 1991 * C*********************************************************************** CA AUTHOR DANIEL POLAK 00000020 CA DESIGNER DANIEL POLAK 00000030 CA LANGUAGE FORTRAN H 00000040 CA SYSTEM S/370 00000050 CA WRITTEN 01-13-81 00000060 C REVISED MO-DA-YR BY PROGRAMMER FOR REASON 00000070 C REVISED 00000080 CA 00000090 CA CALL MGCOMD (IND, NUM, IDIV) 00000100 CA 00000110 CA IN/OUT ARGUMENT TYPE DESCRIPTION 00000120 CA 00000130 CA IN IND I4 ARRAY TO FIND GREATEST COMMON DIVISOR 00000140 CA IN NUM I4 NUMBER OF ELEMENTS IN IND 00000150 CA OUT IDIV I4 GREATEST COMMON DIVISOR 00000160 CA 00000170 CA MGCOMD FINDS THE GREATEST COMMON DIVISOR OF ELEMENTS OF THE 00000180 CA IND ARRAY. 00000190 C 00000200 SUBROUTINE MGCOMD (IND, NUM, IDIV) 00000210 C 00000220 C INTEGER ARRAY IN PARAMETER LIST 00000230 C 00000240 INTEGER IND (1) 00000250 C 00000260 C FIND 2 DIFFERENT NUMBERS 00000270 C 00000280 J = 1 00000290 NUM1 = IND(1) 00000300 10 J = J + 1 00000310 IF (J .GT. NUM) GO TO 40 00000320 NUM2 = IND(J) 00000330 IF (NUM2 .EQ. NUM1) GO TO 10 00000340 C 00000350 C DIFF = DIFFERENCE BETWEEN TWO NUMBERS 00000360 C 00000370 DIFF = IABS(NUM2 - NUM1) 00000380 C 00000390 C FIND THE GREATEST COMMON DIVISOR 00000400 C 00000410 C GREATEST COMMON DIVISOR MUST BE LESS THAN OR EQUAL TO DIFF 00000420 C AND DIFF MUST BE A MULTIPLE OF THE GREATEST COMMON DIVISOR 00000430 C 00000440 LM = DIFF - 1 00000450 IF (LM .LE. 0) GO TO 40 00000460 C 00000470 DO 30 I = 1, LM 00000480 MM = DIFF / I 00000490 IF ((DIFF / MM) * MM .NE. DIFF) GO TO 30 00000500 MA = MOD(NUM1, MM) 00000510 C 00000520 C MM IS A DIVISOR OF DIFF. IS IT THE GREATEST COMMON 00000530 C DIVISOR OF ALL ARRAY ELEMENTS? 00000540 C 00000550 DO 20 J = 1, NUM 00000560 NUM2 = IND(J) 00000570 IF (MA .NE. MOD(NUM2, MM)) GO TO 30 00000580 20 CONTINUE 00000590 C 00000600 GO TO 50 00000610 C 00000620 30 CONTINUE 00000630 C 00000640 40 IDIV = 1 00000650 C 00000660 GO TO 60 00000670 C 00000680 50 IDIV = MM 00000690 C 00000700 60 RETURN 00000710 END 00000720