2013年8月31日土曜日

小さい位数の有限群の分類

割と小さな自然数nに対し、位数nの有限群が同型を除いて何種類存在するか、という問いに対する有益な資料へのリンク集。

どの資料についても、自分で検証はしていない(というかする能力がない・・・)のでどれくらい信頼できる資料かは分かりませんが。


位数119までの群の分類
http://www.akanekodou.mydns.jp/math/mathmenu.html
119以下のほとんどの位数について、群の具体的な表示と、分類の証明まで行っているすごいテキストです。これを読みこなせれば随分とテクニックが身につくんだろうなあと思う、当面の自分の目標。


位数30以下の群の分類
http://www.math.meiji.ac.jp/~kurano/soturon/soturon.htm
明治大学の学生の卒論。位数30以下の群の分類について、基本的な手法の証明や用語の定義も含め丁寧に書いてあります。


The list of all discrete groups of order less than or equal to 100
http://lpsc.in2p3.fr/wingerter/smallgroups.html
位数100以下の群一覧表。とても便利です。


numbers of groups of orders 1 to 2015
http://orion.math.iastate.edu/maddux/504-Fall-2009/
2015以下のnに対し、位数nの群が何種類存在するかの個数一覧表。すごい・・・。

これによると、位数2015以下の群は全部で49,910,529,553種類存在するとのこと。
その内49,487,365,422個(99.2%)は位数1024の群、残った423,164,131個の内408,641,062個(96.6%)は位数1536の群という豆知識が得られました。

また、このpdfの内容を、Google Spread Sheetに貼り付けました。
http://goo.gl/lovBnl


どれも根気勝負みたいな資料で、作成された方々にはほんとうに頭が下がります。


2013/9/4 追記
「numbers of groups of orders 1 to 2015」について。

日本数学会 代数学分科会 シンポジウム
http://mathsoc.jp/section/algebra/algsymp_past/algsymp04.html
8月4日 原田耕一郎氏の報告資料に、

>> 紀元2000 年を記念する意味もあったろうか、Besche/Eick/O’Brien は位数2000 以下の
群の同型類をすべて定めた(2000).

とあり、上記リストはその論文の結果の一部かもしれません。
原論文がどこかでみれないかなあ。

2013年8月10日土曜日

Math Toolの素因数分解コード

Androidアプリ Math Tool ( https://play.google.com/store/apps/details?id=jp.blogspot.tsukinihinikeni.mathtool )で使用している素因数分解のコードです。

エラー処理、バックグラウンドプロセスに関する処理など、直接素因数分解に関係ない部分は省略しています。



TextView tv = (TextView) findViewById(R.id.***);
BigInteger n = new BigInteger(***);

if (n.abs().equals(BigInteger.ZERO)) {
tv.setText("0 = 0");
} else if (n.equals(BigInteger.ONE)) {
tv.setText("1 = 1");
} else if (n.negate().equals(BigInteger.ONE)) {
tv.setText("-1 = -1");
} else {
String factor = factorize(n);

String txt = "";
txt += n.toString() + " = ";
txt += factor;
tv.setText(txt);
}


private String factorize(BigInteger n) {

String f = "";
int factor_count = 0;

if (n.signum() == -1) {
f = "-1 * ";
n = n.negate();
}

ArrayList<String> factor_str = new ArrayList<String>();
ArrayList<Integer> index = new ArrayList<Integer>();

//primesは素数が小さい順に入っている配列(素数リスト)
//p_max_orderは素数リストの要素数
//p_maxは素数リストより大きい最小の自然数

for (int i = 0; i < p_max_order; i++) {

BigInteger p = new BigInteger(primes.get(i));
if (p.pow(2).compareTo(n) == 1) {
break;
}

int k = 0;

while (n.mod(p).equals(BigInteger.ZERO)) {
k++;
n = n.divide(p);
}

if (k > 0) {
factor_count++;
factor_str.add(p.toString());
index.add(k);
}
}

if (!n.equals(BigInteger.ONE)) {
factor_count++;
factor_str.add(n.toString());
index.add(1);
}

String notation = "";
if (n.compareTo((new BigInteger(p_max)).pow(2)) >= 0) {
notation = "\n  # " + n.toString() + " は " + p_max
+ " 以上の素数で割り切れる可能性があります.";
} else if (factor_count == 1 && index.get(0) == 1 && f == "") {
notation = " (素数)";
}

for (int i = 0; i < factor_count; i++) {
if (i > 0) {
f += " * ";
}

if (index.get(i) == 1) {
f += factor_str.get(i);
} else {
f += factor_str.get(i) + "^" + index.get(i);
}
}

f += notation;

return f;
}




アプリの使い方などは
http://tsukinihinikeni.blogspot.jp/2013/08/math-toolandroid.html
をご覧ください。

素数のリストについては、Excelで作成したCSVでアプリ内に保持しています。
作成方法は
http://tsukinihinikeni.blogspot.jp/2012/01/blog-post.html
をご覧ください。

Math Tool(Androidアプリ)

Androidアプリ:Math Tool
package:jp.blogspot.tsukinihinikeni.mathtool
対象:Android3.1+ ( HONEY COMB MR1以上)

Math Toolは手軽に剰余の計算(商と余りの計算)、既約分数の計算、素因数分解ができるツールです。
シンプルさと、どれだけ大きな数についてでも計算できるというのがウリです。(素因数分解には限界がありますが、それでもかなり大きな数まで計算出来ます。)

・アプリの概要

基本的な使い方
1.入力欄に数字を入力すると、自動的に素因数分解の結果が表示されます。



2.除数を入力すると、剰余計算の結果、既約分数が自動で表示されます。



3.C を押すと入力値がクリアされます。


入力値が大きな値の場合、素因数分解の結果が表示されるまでに若干の時間がかかる場合があります。


設定
Settings から、アプリの設定を変更できます。



・剰余計算 - 剰余計算表示
OFFにすると、剰余の計算・表示を行いません。

・剰余計算 - 負の数の剰余計算
初期設定では "余りは正値にする" になっています。
"余りは負値にする" を選んだ場合、負の数を入力した時の商と余りが、余りを0以下とするように計算されます。
具体的には
"余りは正値にする" → -7 ÷ 3 = -3 余り 2
"余りは負値にする" → -7 ÷ 3 = -2 余り -1
と計算されます。
どちらを選んでも、正の数の割り算については
7 ÷ 3 = 2 余り 1
になります。

・既約分数 - 既約分数表示
OFFにすると、既約分数の計算・表示を行いません。

・素因数分解 - 素因数分解表示
OFFにすると、素因数分解の計算・表示を行いません。

・素因数分解  - 素数リスト
素因数分解に使用する素数の範囲を指定します。
初期設定では1,229となっており、この時、小さい方から1,229番目までの素数(つまり、1万以下の素数)を使用して素因数分解を行います。そのため、1万より大きい素数同士の積については、その数が素数であるか合成数であるか判定できません。具体的には、
n < 1万×1万 で、nは1万以下の素数で割れない → nは素数
n > 1万×1万 で、nは1万以下の素数で割れない → nは素数か合成数か判定できない
としています。従って、入力した数が大きい場合、正確に"素因数"に分解できない場合があります。
この使用する素数の数(1,229)を変更するのがこの設定項目になります。何番目までの素数を使用するか入力して下さい。使用する素数の範囲を大きくすると正確に素数の判定ができる範囲が広がりますが、計算に時間がかかる場合があります。
使用する素数の数の最大値は78,498(100万以下の素数)です。

・その他 - 計算タイトルの表示
"タイトルを表示する" → 計算結果に、[剰余計算]、[既約分数]、[素因数分解]のタイトルが表示されます。
"タイトルを表示しない" → 計算結果に上記のタイトルが表示されません。
タイトルを表示する

タイトルを表示しない

・その他 - テーマ
画面のカラーを変更できます。
Holoは黒を基調とした画面、Holo.Lightは白を基調とした画面になります。

Holo

Holo.Light


・仕様

入力可能な数字
入力可能な数字の桁数に制限はありません。
商の計算など、基本的な部分については、BigIntegerクラス(http://developer.android.com/intl/ja/reference/java/math/BigInteger.html)を使用しています。

素因数分解
素因数分解については上記の通り、予め用意した素数リストで実際に割ってみて計算しています。そのため、素数リストの上限を超える大きな素数どうしの積については、素数か合成数かの判定をすることができません。
しかし、入力する数値自体に制限はないので、小さな素数どうしの積であれば大きな数についても素因数分解が可能です。例えば、54桁の数 808017424794512875886459904961710757005754368000000000 = 2^46 * 3^20 * 5^9 * 7^6 * 11^2 * 13^3 * 17 * 19 * 23 * 29 * 31 * 41 * 47 * 59 * 71 などは殆ど処理時間なく計算可能です。
また、素数と判定できた場合は「素数である可能性が高い数字」ではなく、「素数であることが確認できた数字」となります。


・その他

アプリのダウンロード(Google play)
https://play.google.com/store/apps/details?id=jp.blogspot.tsukinihinikeni.mathtool


連絡先
何かありましたら、この記事のコメント欄、あるいはメール( d.kondo.android@gmail.com )でお問い合わせください。