兄弟素数(いとこ素数,セクシー素数)を求める

兄弟素数(いとこ素数,セクシー素数)

差が2だと双子素数なら差が4とか6とかだとどうなんだろう、という事で調べてみました。兄弟素数というのは私の造語です。一般になんと呼ばれているのかは分かりません。なお、今回のプログラムでは隣接する素数同士の距離しか測っていません。例えば距離4の素数の組として3と7のように間に別の素数をはさむ物は除外しています。

(2012/5/9追記)

差が4のものを「いとこ素数」、差が6のものを「セクシー素数」と呼ぶそうです。なんで差が6でセクシーなのかというとラテン語で6が「sex」だからだそうです。

#include <stdio.h>
#include <stdlib.h>

#define BUF_SIZE  (1024)

int main( int ac, char *av[] )
{
    long long i, p, *primelist, d;
    char buf[BUF_SIZE];

    /*  コマンドラインから差を決定する    */
    if( ac < 2 ) {
        fprintf( stderr, "usage : brotherprime d\n" );
        return( 1 );
    }
    d = strtoll( av[1], NULL, 10 );
    if( d < 2 ) {
        fprintf( stderr, "bad parameter\n" );
        return( 1 );
    }

    /*  ペア候補素数を格納する配列を用意  */
    if( ( primelist = calloc( d, sizeof(long long) ) ) == NULL ) {
        fprintf( stderr, "calloc failed\n" );
        return( 1 );
    }
    for( i = 0; i < d; i++ )
        primelist[i] = 0;

    /*  兄弟素数を探す  */
    while( fgets( buf, BUF_SIZE, stdin ) ) {
        if( ( p = strtoll( buf, NULL, 10 ) ) == 0 )
            continue;
        for( i = 0; i < d; i++ ) {
            if( primelist[i] != 0 && p - primelist[i] == d )
                printf( "%lld %lld\n", primelist[i], p );
        }
        for( i = d - 1; i > 0; i-- )
            primelist[i] = primelist[i - 1];
        primelist[0] = p;
    }

    free( primelist );

    return( 0 );
}

1億以下の素数一覧データに対して距離を4から20まで変えて調べてみたところ、兄弟素数(いとこ素数,セクシー素数)は以下の組だけ存在しました。

兄弟素数(いとこ素数,セクシー素数) 1億以下
距離 組の数
4(いとこ素数) 440,258組
6(セクシー素数) 874,554組
8 437,125組
10 581,860組
12 872,551組
14 521,555組
16 435,413組
18 866,243組
20 576,603組

距離が離れれば組の数も減っていくと予想したのですが、意外とそうでもありませんでした。ちなみに隣接する素数同士の距離は無限に大きいものが存在しますので、どんなに距離の離れた兄弟素数も存在する事になりますが、ある距離の兄弟素数の数が無限に存在するかどうかはわかりません。距離2の場合は無限に存在するわけなんですが。

(2005/4/18追記)

双子素数で書きました通り、双子素数が無限に存在するというのは未だに証明されていないようです。ですので、距離2の兄弟素数が無限に存在するというこちらの記述も取り消します。

(2012/2/15追記)

素数一覧を10億まで求めたので、こちらも10億以下にデータを更新しました。

(2014/11/3追記)

1兆以下までデータを更新しました。

(2020/1/1追記)

10兆以下までデータを更新しました。

(2020/4/25追記)

ソースコードを少し整理しました。

(2026/4/1追記)

int を long long に変更するとともに、ソースコードを少し整理しました。

合わせて間に別の素数を挟む場合にも対応しました。例えば 3 と 7 はいとこ素数ですが、間に 5 を挟みます。従来のプログラムは隣り合った素数のみを対象にしていたため、このような素数は検出できませんでした。間に別の素数を挟む場合も対応したため、兄弟素数の組の数も修正しています。

兄弟素数(いとこ素数,セクシー素数)の組の数

1万以下

兄弟素数(いとこ素数,セクシー素数)の組の数 1万以下
距離 組の数
4(いとこ素数) 203組
6(セクシー素数) 405組
8 205組
10 261組
12 395組
14 239組
16 192組
18 397組
20 263組

10万以下

兄弟素数(いとこ素数,セクシー素数)の組の数 10万以下
距離 組の数
4(いとこ素数) 1,216組
6(セクシー素数) 2,436組
8 1,255組
10 1,609組
12 2,400組
14 1,460組
16 1,212組
18 2,436組
20 1,623組

100万以下

兄弟素数(いとこ素数,セクシー素数)の組の数 100万以下
距離 組の数
4(いとこ素数) 8,144組
6(セクシー素数) 16,292組
8 8,193組
10 10,866組
12 16,252組
14 9,789組
16 8,133組
18 16,328組
20 10,896組

1000万以下

兄弟素数(いとこ素数,セクシー素数)の組の数 1000万以下
距離 組の数
4(いとこ素数) 58,622組
6(セクシー素数) 116,721組
8 58,337組
10 77,842組
12 116,850組
14 70,090組
16 58,221組
18 116,798組
20 77,842組

1億以下

兄弟素数(いとこ素数,セクシー素数)の組の数 1億以下
距離 組の数
4(いとこ素数) 440,258組
6(セクシー素数) 874,554組
8 437,125組
10 581,860組
12 872,551組
14 521,555組
16 435,413組
18 866,243組
20 576,603組

10億以下

兄弟素数(いとこ素数,セクシー素数)の組の数 10億以下
距離 組の数
4(いとこ素数) 3,424,680組
6(セクシー素数) 6,804,789組
8 3,403,284組
10 4,525,545組
12 6,782,577組
14 4,054,697組
16 3,381,259組
18 6,726,612組
20 4,481,429組

100億以下

兄弟素数(いとこ素数,セクシー素数)の組の数 100億以下
距離 組の数
4(いとこ素数) 27,409,999組
6(セクシー素数) 54,452,336組
8 27,225,475組
10 36,206,290組
12 54,292,893組
14 32,440,985組
16 27,032,730組
18 53,829,024組
20 35,871,813組

1000億以下

兄弟素数(いとこ素数,セクシー素数)の組の数 1000億以下
距離 組の数
4(いとこ素数) 224,373,161組
6(セクシー素数) 445,631,845組
8 222,799,578組
10 296,377,691組
12 444,511,152組
14 265,526,520組
16 221,222,728組
18 440,596,583組
20 293,617,044組

1兆以下

兄弟素数(いとこ素数,セクシー素数)の組の数 1兆以下
距離 組の数
4(いとこ素数) 1,870,585,459組
6(セクシー素数) 3,714,622,313組
8 1,857,170,949組
10 2,469,723,227組
12 3,703,635,698組
14 2,212,683,816組
16 1,843,559,601組
18 3,671,689,674組
20 2,446,837,443組

10兆以下

兄弟素数(いとこ素数,セクシー素数)の組の数 10兆以下
距離 組の数
4(いとこ素数) 15,834,656,003組
6(セクシー素数) 31,437,582,124組
8 15,718,057,756組
10 20,897,099,161組
12 31,338,242,047組
14 18,722,078,419組
16 15,598,699,972組
18 31,081,345,911組
20 20,713,473,806組