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

Problem71 順序分数

問題

nとdを正の整数として, 分数 n/d を考えよう.
n<d かつ HCF(n,d) = 1のとき、真既約分数と呼ぶ.

d <= 8 について真既約分数を大きさ順に並べると, 以下を得る:
1/8, 1/7, 1/6, 1/5, 1/4, 2/7, 1/3, 3/8, 2/5, 3/7, 1/2,
4/7, 3/5, 5/8, 2/3, 5/7, 3/4, 4/5, 5/6, 6/7, 7/8

3/7のすぐ左の分数は2/5である.
d <= 100万について真既約分数を大きさ順に並べたとき,
3/7のすぐ左の分数の分子を求めよ.


ソース

using System;

class Program
{
    //const int MaxD = 8;
    const int MaxD = 1000000;

    static void Main()
    {
        var sw = System.Diagnostics.Stopwatch.StartNew();

        int AnswerBunsi = 0;
        int AnswerBunbo = 1;

        for (int D = 1; D <= MaxD; D++) {
            for (int N = DeriveMaxSeisuuKai(D); N >= 1; N--) {
                //分子と分母が互いに素なら既約分数
                if (DeriveGCD(D, N) == 1) {
                    //    AnswerBunsi/AnswerBunbo < N/D
                    // ⇔ AnswerBunsi*D < AnswerBunbo*N
                    ulong wkProd1 = (ulong)AnswerBunsi * (ulong)D;
                    ulong wkProd2 = (ulong)AnswerBunbo * (ulong)N;
                    if (wkProd1 < wkProd2) {
                        Console.WriteLine("解候補{0}/{1}を発見。経過時間={2}",
                            N, D, sw.Elapsed);
                        AnswerBunsi = N;
                        AnswerBunbo = D;
                    }
                    break;
                }
            }
        }
    }

    //分母を引数として、不等式 分子/分母 < 3/7 の最大の整数解を求める
    static int DeriveMaxSeisuuKai(int pBunbo)
    {
        bool NeedKurisage = ((3 * pBunbo) % 7 == 0);
        int WillReturn = 3 * pBunbo / 7;
        return (NeedKurisage ? WillReturn - 1 : WillReturn);
    }

    //ユークリッドの互除法で2数の最大公約数を求める
    static int DeriveGCD(int pVal1, int pVal2)
    {
        int WarareruKazu = Math.Max(pVal1, pVal2);
        int WaruKazu = Math.Min(pVal1, pVal2);

        while (true) {
            int Amari = WarareruKazu % WaruKazu;
            if (Amari == 0) return WaruKazu;
            WarareruKazu = WaruKazu;
            WaruKazu = Amari;
        }
    }
}


実行結果

省略
解候補428531/999906を発見。経過時間=00:00:10.7868586
解候補428534/999913を発見。経過時間=00:00:10.7868949
解候補428537/999920を発見。経過時間=00:00:10.7869312
解候補428540/999927を発見。経過時間=00:00:10.7869678
解候補428543/999934を発見。経過時間=00:00:10.7870050
解候補428546/999941を発見。経過時間=00:00:10.7870413
解候補428549/999948を発見。経過時間=00:00:10.7870776
解候補428552/999955を発見。経過時間=00:00:10.7871290
解候補428555/999962を発見。経過時間=00:00:10.7871659
解候補428558/999969を発見。経過時間=00:00:10.7872020
解候補428561/999976を発見。経過時間=00:00:10.7872391
解候補428564/999983を発見。経過時間=00:00:10.7872760
解候補428567/999990を発見。経過時間=00:00:10.7873126
解候補428570/999997を発見。経過時間=00:00:10.7873486


解説

分母ごとに
不等式 分子/分母 < 3/7
の最大の整数解を求めてます。