社交数

社交数

社交数というのは友愛数を拡張したもので、aの約数の和がbに、bの約数の和がcに、cの約数の和がaになるような3数の組を言います。

#include <stdio.h>

#define MAX_ARRAY   (100000000)

int array[MAX_ARRAY];

int main( int ac, char *av[] )
{
    int n, n2, n3, i;

    /*  配列を初期化する    */
    for( i = 0; i < MAX_ARRAY; i++ )
        array[i] = 0;

    /*  約数の和を求める    */
    for( n = 1; n < MAX_ARRAY / 2; n++ ) {
        for( i = 2; i * n < MAX_ARRAY; i++ )
            array[i * n] += n;
    }

    /*  約数の和が互いの数自身になれば社交数である  */
    for( n = 1; n < MAX_ARRAY; n++ ) {
        n2 = array[n];
        if( n2 >= MAX_ARRAY )
            continue;
        n3 = array[n2];
        if( n3 >= MAX_ARRAY )
            continue;
        if( n < n2 && n < n3 && array[n3] == n )
            printf( "%d %d %d\n", n, n2, n3 );
    }

    return( 0 );
}

1千万以下の範囲を調べてみましたが、残念ながら社交数は見つかりませんでした。実は社交数は未だに一組も見つかっていないそうです。だからといって社交数が存在しないと証明されてもいないそうです。ちなみに4数での社交数などは見つかっているそうです。

(2012/2/16追記)

こちらも、配列を大きくして1億以下まで求めるようにしました。しかし、やはり社交数は一組も見つかりませんでした。


あおやぎのさいと2.0初歩の整数論プログラミング