双子素数を求める

双子素数

差が2である二つの素数の組を双子素数と呼ぶそうです。素数は無限に存在しますが、双子素数も無限に存在することが最近になってようやく証明されたそうです。ちなみに差が2と2である三つの素数の組を三つ子素数と呼びますが、三つ子素数は3, 5, 7しか存在しません。なぜなら三つ子の内のどれか一つは必ず3の倍数になり素数は3だけだからです。

(2005/4/18追記)

双子素数は無限に存在する事が証明されたという記事を見たような気がしてそう書きましたが、どうも勘違いだったようです。証明されたと言う記事をどこで見たかも思い出せませんので、この記述は取り下げます。

以下のプログラムは素数一覧に対して双子素数を検索するものです。

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

#define BUF_SIZE  (1024)

int main( void )
{
    long long p, prev_p;
    char buf[BUF_SIZE];

    /*  双子素数を探す  */
    prev_p = 0;
    while( fgets( buf, BUF_SIZE, stdin ) ) {
        if( ( p = strtoll( buf, NULL, 10 ) ) == 0 )
            continue;
        if( prev_p != 0 && p - prev_p == 2 )
            printf( "%lld %lld\n", prev_p, p );
        prev_p = p;
    }

    return( 0 );
}

単純に考えても分かる通り、素数が密集している小さな数では双子素数もたくさんありそうです。実際1億までの間に440312組も見つかりました。

(2020/4/25追記)

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

(2026/3/9追記)

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

双子素数一覧

ここにあった双子素数一覧は双子素数一覧に移動しました。