「あぁ~こういうのたまに使うなぁ~あったら便利だなぁ~」
とか思ったんですけれど、
よくよく考えてみたら合同式を使うような機会ってそれなりにはありそうだし、
(最たるものは公開鍵暗号のアルゴリズムなんでしょうけれども)
どっかでライブラリーになっていてもおかしくないんじゃね?(boostあたりで)
とか思ったんですけれども、探す能力が自分にはない・・・。というか面戸くせぇw
合同式ってなに?っていう人もいるかもなので一応軽く説明しておくと、こういう奴です
6 ≡ 18 ≡ 30 (mod12) ←これは時計の文字盤についての話
sin α = 1, α ≡ π/2 (mod 2π) ←これは三角関数の話
要は、mod(何とか) を横に着けておいて、≡の記号で結べば、それらは「合同」であるといえるわけです。(説明テキトーw)
よく17時と5時って一緒だよね、とか言いますがそれはmod12で考えれば合同だということです。
でこいつらは便利なことに加減乗について閉じています。(つまり足し引き掛け算までは自由にできる)
3+5 ≡ 8 ≡ 2 (mod 6)
7*4 ≡ 28 ≡ 3 (mod 5)
・・・みたいな。
これらは上から、
6で割って3余る数と6で割って5余る数の和は、6で割ると2余る という意味と、
下は5で割ると7余る数と5で割ると4余る数の積は、5で割ると3余る という意味です。
文章で書くと億劫ですが、きわめて簡素に表現できます。
もちろん掛け算ができるわけですから累乗が計算できます
7^6 (mod 3)を計算したいのであれば、(つまり7の6乗を3で割った数を計算したいのであれば)
7 ≡ 1 (mod 3)より
7^6 ≡ 1^6 = 1 (mod 3)となって簡単に求まります。
こういう便利な奴がいるんです。
・・・で、自分もこいつをクラス化しようと思ったんですけど、なんか単純にやるのはつまらないので、こないだ掲示板でなんか話題にちょろっと出たし
またテンプレートを使って遊ぼうかなぁ~とか思ってたんですけど、
・・・
・・・
・・・忘れてる。
アイディアはあるので、取りあえずまずはやりたいことを整理して思い出そうとしてみた。
やりたいこと:
与えられた整数が unsigned longの範囲に収まるか、unsigned long long の範囲じゃないとダメなのかをコンパイル時に判断する
#include
#include
#include
#include
template
struct A{
void print()
{
std::cout
struct isOverUintMax
{
typedef boost::mpl::bool_UINT_MAX) > type;
};
template
struct B{
A::type,
unsigned long long,
unsigned int
>::type,
Num
> a;
void print(){
a.print();
}
};
int main(){
B b1;
b1.print();
B b2;
b2.print();
}
やばいwやばいぞw完全に忘れつつあるw最近C#しかやってなかったから!!
・・・OTZ