トップページに戻る    次のC#のサンプルへ    前のC#のサンプルへ

Problem58 螺旋素数

問題

1から始めて, 以下のように反時計回りに数字を並べていくと,
辺の長さが7の渦巻きが形成される

37 36 35 34 33 32 31
38 17 16 15 14 13 30
39 18  5  4  3 12 29
40 19  6  1  2 11 28
41 20  7  8  9 10 27
42 21 22 23 24 25 26
43 44 45 46 47 48 49

面白いことに, 奇平方数が右下の対角線上に出現する.
もっと面白いことには, 対角線上の13個の数字のうち, 8個が素数である.
ここで割合は8/13 = 62%である.

渦巻きに新しい層を付け加えよう.すると辺の長さが9の渦巻きが出来る.
以下, この操作を繰り返していく.
対角線上の素数の割合が10%未満に落ちる最初の辺の長さを求めよ.


ソース

using System;
using System.Collections.Generic;
using System.Linq;

class Program
{
    static bool IsSosuu(int pVal)
    {
        if (pVal == 1) return false;
        if (pVal == 2) return true;
        if (pVal % 2 == 0) return false;
        for (int I = 3; I * I <= pVal; I += 2) {
            if (pVal % I == 0) return false;
        }
        return true;
    }

    static void Main()
    {
        int TotalCnt = 0;
        int TotalSosuuCnt = 0;

        double SosuuRate;
        int N = 1;
        while (true) {
            List<int> TaikakusenList = DeriveTaikakusenList(N);

            TotalCnt += TaikakusenList.Count;
            TotalSosuuCnt += TaikakusenList.Count(A => IsSosuu(A));

            SosuuRate = (double)TotalSosuuCnt / (double)TotalCnt;
            Console.WriteLine("HenLen={0},Cnt={1},SosuuCnt={2},Rate={3}",
                2 * N - 1, TotalCnt, TotalSosuuCnt, SosuuRate);
            if (2 * N - 1 >= 9 && SosuuRate < 0.1D) { //問題文により辺の長さは9以上
                Console.WriteLine("対角線上の素数の割合が10%未満になりました");
                return;
            }
            N++;
        };
    }

    static List<int> DeriveTaikakusenList(int pN)
    {
        if (pN == 1) return new List<int>() { 1 };

        int CurrHenLength = 2 * pN - 1;
        int PrevHenLength = CurrHenLength - 2;

        int PrevVal = PrevHenLength * PrevHenLength;
        var WillReturnList = new List<int>();
        for (int I = 1; I <= 4; I++)
            WillReturnList.Add(PrevVal + (CurrHenLength - 1) * I);
        return WillReturnList;
    }
}


実行結果

HenLen=26229,Cnt=52457,SosuuCnt=5247,Rate=0.100024782202566
HenLen=26231,Cnt=52461,SosuuCnt=5247,Rate=0.100017155601304
HenLen=26233,Cnt=52465,SosuuCnt=5248,Rate=0.100028590488897
HenLen=26235,Cnt=52469,SosuuCnt=5248,Rate=0.100020964760144
HenLen=26237,Cnt=52473,SosuuCnt=5248,Rate=0.100013340194005
HenLen=26239,Cnt=52477,SosuuCnt=5248,Rate=0.100005716790213
HenLen=26241,Cnt=52481,SosuuCnt=5248,Rate=0.0999980945485033
対角線上の素数の割合が10%未満になりました


解説

エラトステネスの篩ではなく、試し割りで素数かを判定してます。