友愛数・婚約数

 投稿者:しばっち  投稿日:2016年 5月28日(土)20時42分5秒
  友愛数・婚約数
https://ja.wikipedia.org/wiki/婚約数

OPTION BASE 0
LET KMAX=100000
DIM A(KMAX),B(200),C(200)
FOR I=2 TO KMAX
   IF A(I)=0 THEN
      FOR J=I*I TO KMAX STEP I !'エラトステネスの篩
         LET A(J)=1 !'倍数に印をつける
      NEXT J
   END IF
NEXT I
FOR I=2 TO KMAX
   IF A(I)=1 THEN !'素数でないなら
      CALL CALC(I,B,P,L1)
      CALL CALC(P,C,Q,L2)
      IF I=Q AND I<=P THEN !'友愛数の時、完全数含む
         PRINT I;":";
         FOR K=0 TO L1-1
            PRINT B(K);
         NEXT K
         PRINT
         PRINT P;":";
         FOR K=0 TO L2-1
            PRINT C(K);
         NEXT K
         PRINT
         PRINT
      END IF
   END IF
NEXT I
END

EXTERNAL  SUB CALC(K,B(),SUM,L) !'Kの約数の和を求める
MAT B=ZER
LET L=0
LET SUM=1 !' SUM=0 ...婚約数 or SUM=1 ...友愛数
IF SUM=1 THEN
   LET B(0)=1
   LET L=L+1
END IF
FOR J=2 TO INT(SQR(K))
   LET R=MOD(K,J)
   IF R=0 THEN
      LET SUM=SUM+J
      LET B(L)=J
      LET L=L+1
      IF J<>K/J THEN !'平方数でないなら
         LET SUM=SUM+K/J
         LET B(L)=K/J
         LET L=L+1
      END IF
   END IF
NEXT J
END SUB
 

戻る