コラッツの問題 (Collatz・角谷予想) の f(n) を Loki を使って求めてみる。

#include <loki/TypeManip.h>
#include <iostream>

template <int N>
struct Collatz
{
  enum { Result = 1 +
                  Loki::Select<N%2,
                               Collatz<N*3+1>,
                               Collatz<N/2> >::Result::Result };
};

template <>
struct Collatz<1>
{
  enum { Result = 0 };
};

int main()
{
  std::cout << "f(1) = " << Collatz<1>::Result << "\n";
  std::cout << "f(2) = " << Collatz<2>::Result << "\n";
  std::cout << "f(3) = " << Collatz<3>::Result << "\n";
  std::cout << "f(4) = " << Collatz<4>::Result << "\n";
  std::cout << "f(5) = " << Collatz<5>::Result << "\n";
  std::cout << "f(6) = " << Collatz<6>::Result << "\n";
  std::cout << "f(7) = " << Collatz<7>::Result << "\n";
  std::cout << "f(8) = " << Collatz<8>::Result << "\n";
  std::cout << "f(9) = " << Collatz<9>::Result << "\n";
  std::cout << "f(10) = " << Collatz<10>::Result << "\n";

  std::cout << "f(1024) = " << Collatz<1024>::Result << "\n"; 

  std::cout << "f(65535) = " << Collatz<65535>::Result << "\n"; 
  return 0;
}

実際のf(n)の計算はコンパイル時に行われるので、コンパイルさえできればとても高速に動作しますね(笑

欠点は template パラメタを使ってるのでnを直書きするしかない点か...

まぁ、この程度だとわざわざLokiを使わずに、 Select を自作した方が早そうですが。

template <bool B, typename T, typename U>
struct Select
{
  typedef T Result;
};

template <typename T, typename U>
struct Select<false,T,U>
{
  typedef U Result;
};

トラックバック(0)

トラックバックURL: http://floralcompany.jp/mt/mt-tb.cgi/172

コメントする

AUTHOR

  • turugina (虎王 剱奈)
  • E-mail: turugina {at} floralcompany.jp
  • pixiv
  • ニジエ

2014年5月

        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31

アーカイブ

OpenID対応しています OpenIDについて
Powered by Movable Type 5.2.10

- 警 告 -

本サイトにはいわゆる「18禁画像」(イラスト)へのリンクが存在します。 未成年の方や、その手の画像に不快感を覚える方は、 該当記事(「えちぃの」及び「ちょっとえちぃの」カテゴリ) をご覧にならないようお願いいたします。

上記を理解した上で非表示のブログパーツを表示する
あわせて読みたいブログパーツ
ついった
drawr/pixiv/twitpic