『Fate/kaleid liner プリズマ☆イリヤ ドライ!!(8)』を読み終わった

Fate/kaleid liner プリズマ☆イリヤ ドライ!!(8)<Fate/kaleid liner プリズマ☆イリヤ ドライ!!> (角川コミックス・エース)


 これ最終的にシロウとミユの扱いどうなんのかね。
居ても幸せになれんのなら、持ち帰ってエーデルフェルト家で執事&メイドにしたらいいと思う。


三行感想

Fateで平和を願う奴は大体悪堕ちの法則がまたも
・平行世界の可能性含めたら衛宮家全員英霊インストールできそうなんだよなぁ
・定期的にルールブレイカーを刺してダリウス化を防ぐ拷問



 定期的にルールブレイカーの粉末を吸引したりルールブレイカーを打ったりすればダリウス化防げそうなんだが…。
やっぱりあぶない禁断症状が出たりするんだろうか。



Project Euler : Problem 27 『Quadratic primes』

PadlockPadlock / haru__q


問題

projecteuler.net


n2 + an + b (|a| < 1000 , |b| ≦ 1000)


上式にn=0,1,2…と入力し、最も長く連続して素数が出てくるaとbの積を求めよ。


もっとa,bの範囲を狭めたい

 まずn=0の場合を考えると、
02 + a×0 + b = b
なので、bは素数じゃないといけない。


 次にn=1の場合を考えると、
12 + a + b = a + b + 1
となる。
n=0の場合からbは素数だとわかってるので、b+1は偶数になる。
a+b+1が素数になるとすると素数は奇数なので、偶数+奇数=奇数からaは奇数でないといけない。


 以上の二つから分かったのは、
(1) bは1000以下の素数
(1-1) よってbが0やマイナスはありえない
(2) |a|は1000未満の奇数


 後はa,b総当たりで。


コード
using System.Collections.Generic;
using System.Diagnostics;

namespace Problem27
{
    class Program
    {
        static void Main(string[] args)
        {
            int[] p = CreatePrimeArray(1000);

            int maxN = 0;
            int maxPd = 0;
            for (int pi = 0; pi < p.Length; pi++)
            {
                int b = p[pi];
                for (int a = 1; a < 1000; a += 2)
                {
                    int tmp = QuadraticFormula(a, b);
                    if (maxN < tmp)
                    {
                        maxN = tmp;
                        maxPd = a * b;
                    }
                    tmp = QuadraticFormula(-a, b);
                    if (maxN < tmp)
                    {
                        maxN = tmp;
                        maxPd = -a * b;
                    }
                }
            }

            Debug.WriteLine(maxPd);
        }

        /// <summary>
        /// 二次式で素数がどれだけ連続するか調べる
        /// </summary>
        static int QuadraticFormula(int a, int b)
        {
            int n = 0;
            int p = 0;

            while (true)
            {
                p = n * n + a * n + b;
                if (IsPrime(p) == true)
                {
                    n++;
                }
                else
                {
                    break;
                }
            }

            return n;
        }

        /// <summary>
        /// エラトステネスの篩による素数列の生成
        /// </summary>
        static int[] CreatePrimeArray(int max)
        {
            List<int> p = new List<int>();

            for (int i = 0; i <= max; i++)
            {
                p.Add(i);
            }

            for (int i = 2; i <= max / 2; i++)
            {
                if (p[i] != 0)
                {
                    for (int j = 2; p[i] * j <= max; j++)
                    {
                        p[i * j] = 0;
                    }
                }
            }

            p.RemoveAll(obj => obj == 0);

            return p.ToArray();
        }

        /// <summary>
        /// 素数判定
        /// </summary>
        static bool IsPrime(int n)
        {
            if (n <= 0) return false;

            int hn = n / 2;

            if (n % 2 == 0) return false;

            for (int i = 3; i <= hn; i += 2)
            {
                if (n % i == 0) return false;
            }

            return true;
        }

    }
}
答え

 -59231


 もっとaの範囲狭めたりできないかなぁ。



恐怖の鎖

恐怖の鎖

HUNTERxHUNTER クラピカ 五指の制約の鎖 コスチューム用小物

HUNTERxHUNTER クラピカ 五指の制約の鎖 コスチューム用小物

Project Euler : Problem 26 『Reciprocal cycles』

Geometric Tiles, Mosque of Moulay Idriss, MoroccoGeometric Tiles, Mosque of Moulay Idriss, Morocco / Dimitry B


問題

projecteuler.net


最も循環節が長くなる1/dのd (d < 1000) を求めよ。


困った時のwikipedia

 昔、循環小数を100まで出力したことがあった。
pongeponge.hatenablog.jp
似たような方法を使おうかと思ったけど、どうにも時間かかりすぎる気がしたので却下。


 つらつらと見てると、素数の時に長い循環節が出てくる傾向があるのに気づく。
でも気づいたのはそれだけで、それ以外の循環節の長さと数の関係がわからないのでWikipediaで調べることに。

 2 と 5(一般には、基数の約数たる素数)以外の素数 p の逆数の循環節の長さは、p - 1 の約数である。

 へー。


私の方法

(1) 素数のリストを作る
(2) 大きい素数pからピックアップ
(3) 10nをpで割った余りが1になるまでnを増やす
(4) 余り1になれば、その時点のnが1/pの循環節の長さL
(5)Lよりp-1の約数が小さければ、それ以降のpは計算しない


コード
using System.Collections.Generic;
using System.Diagnostics;
using System.Numerics;

namespace Problem26
{
    class Program
    {
        static void Main(string[] args)
        {
            Debug.WriteLine("RC1:" + ReciprocalCycles(1000));
        }

        static int[] CreatePrimeArray(int max)
        {
            List<int> p = new List<int>();

            for (int i = 0; i <= max; i++)
            {
                p.Add(i);
            }

            for (int i = 2; i <= max / 2; i++)
            {
                if (p[i] != 0)
                {
                    for (int j = 2; p[i] * j <= max; j++)
                    {
                        p[i * j] = 0;
                    }
                }
            }

            p.RemoveAll(obj => obj == 0);

            //1,2,5は巡回小数にならないので最初に削除しておく
            p.RemoveAt(3);
            p.RemoveAt(1);
            p.RemoveAt(0);

            return p.ToArray();
        }

        static int ReciprocalCycles(int max)
        {
            int[] primes = CreatePrimeArray(max);

            int l = 0;
            int n = 0;

            for (int i = primes.Length-1; i >= 0; i--)
            {
                for (int d = primes[i].ToString().Length; ; d++)
                {
                    if (Pow(d) % primes[i] == 1)
                    {
                        if (l < d)
                        {
                            l = d;
                            n = primes[i];
                        }
                        break;
                    }
                }

                if (primes[i] - 1 < l) break;
            }

            return n;
        }

        static BigInteger Pow(int y)
        {
            BigInteger p = 1;

            for (int i = 0; i < y; i++)
            {
                p *= 10;
            }

            return p;
        }
    }
}
答え

 983


 何か難しかったわ。



小数を用いた割り算で考えた事

小数を用いた割り算で考えた事

環論,これはおもしろい ―素因数分解と循環小数への応用― (数学のかんどころ)

環論,これはおもしろい ―素因数分解と循環小数への応用― (数学のかんどころ)

循環小数は、有理数ではない!

循環小数は、有理数ではない!

Project Euler : Problem 25 『1000-digit Fibonacci number』

Villain or Hero?Villain or Hero? / iMorpheus


問題

projecteuler.net


 1000桁を超える最小のフィボナッチ数は何番目か。


力の1号と技の1号が合わさって最強

 考えても分からんし、一般項使おうとしても√5を超計算しないといけないぽかったり。
もう普通に計算していくことにしました。
そしたら、あっとういうまに答えが出て、力技って凄いなぁと思いました(小並感)


コード
using System.Diagnostics;
using System.Numerics;

namespace Problem25
{
    class Program
    {
        static void Main(string[] args)
        {
            BigInteger f1 = 1;
            BigInteger f2 = 1;
            BigInteger f3 = 0;

            int count = 2;
            while(f3.ToString().Length < 1000)
            {
                f3 = f1 + f2;
                f1 = f2;
                f2 = f3;
                count++;
            }

            Debug.WriteLine("Count:" + count);
            Debug.WriteLine(f3);
        }
    }
}