mod(合同式)のクラス

アバター
GRAM
記事: 164
登録日時: 14年前
住所: 大阪

mod(合同式)のクラス

投稿記事 by GRAM » 13年前

この間MoNoQLoREATORさんの日記を見ていて、

「あぁ~こういうのたまに使うなぁ~あったら便利だなぁ~」

とか思ったんですけれど、
よくよく考えてみたら合同式を使うような機会ってそれなりにはありそうだし、
(最たるものは公開鍵暗号のアルゴリズムなんでしょうけれども)
どっかでライブラリーになっていてもおかしくないんじゃね?(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 の範囲じゃないとダメなのかをコンパイル時に判断する

CODE:

#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();
}
・・・こんなくだらないコードに30分くらいかかってしまった・・・wしかもなんか納得いかない・・・
やばいwやばいぞw完全に忘れつつあるw最近C#しかやってなかったから!!

・・・OTZ

beatle
記事: 1281
登録日時: 13年前

Re: mod(合同式)のクラス

投稿記事 by beatle » 13年前

おお,テンプレートいいですね!ちょっと標準C++で挑戦してみます.

アバター
tk-xleader
記事: 158
登録日時: 14年前

Re: mod(合同式)のクラス

投稿記事 by tk-xleader » 13年前

http://www.boost.org/doc/libs/1_48_0/li ... teger.html

これが有効活用できそうな事案ですね。