2008-11-01から1ヶ月間の記事一覧

Lockのサンプル

Javaの同期の基本はsynchronizedなのだけど、synchronizedはブロックとして使わないといけないので使いづらい場合がある。ロックの取得と開放を同じメソッド内で行わなくてはいけないし、異なるロックを自由なタイミングで取得開放できない。 そこで使うのが…

ReadWriteLockのサンプル

では、ReadWriteLockのサンプル。 読み込みスレッドは互いにロックせず、書き込みスレッドは他のスレッドとは同時に動かせない、というロックです。 サンプルでは、「か電車」が書き込みスレッド、「電車」が読み込みスレッドです。「か電車」が動くときには…

CyclicBarrierのサンプル

こないだのときは説明できなかったけど、CyclicBarrier いくつかのスレッドがバリアにたどりつくまで待ちます。 このサンプルではスピードの違う「電車」がまんなかで全ての「電車」がそろうまで待ちます。 コンストラクタでいくつのスレッドを待つかを決め…

Semaphoreのサンプル

こないだのスレッド入門のときに見せてたサンプル。 ブログ用に再構成。「電車」が3つずつ動きます。 Semaphoreは、同時に実行できるスレッド数を制限できます。 このサンプルでは3つに制限しています。 static Semaphore semaphoe = new Semaphore(3); セマ…

投機実行のやつでReadWriteLockを使ってみる

投機的実行をやってみたやつで、synchronizedを使ってたのだけど、ReadWriteLockを使ったほうが並列可能性が高くなるかもね、と思ってちょっと修正してみた。 ところで、最後のロックを次のように、ReadLockの中でWriteLock取得しようと思ったんだけど、デッ…

BigDecimal版sqrtであらかじめMath.sqrtを使う効果

ところで、前回のGauss-Legendre法でBigDecimal版sqrtを使いました。で、この中の処理である程度の精度までをdoubleで求めてるのですが、これの効果がどれだけあるか確認しました。 まず、doubleを使ったsqrtで100桁までの円周率を100回求めると、処理時間は…

ガウス・ルジャンドルの方法での円周率

もう一個だけ、円周率を求めておく 算術幾何平均というのを使う。 これは、a, bについて とすると がnが無限のときanとbnが等しくなるというもの。 で、なんかいろいろ調べてたらどこからひっぱってきたか忘れたのだけど、次のようなプログラムで円周率が出…

BigDecimalで平方根を求めてみる

唐突に平方根を求めてみます。 平方根を求めるときはを求めるとして という方程式の解を求めればいいことになります。 方程式の解はニュートン法で求めます。 http://www.akita-pu.ac.jp/system/elect/comp1/kusakari/japanese/teaching/Programming/2005/no…

スレッドで投機的実行を実現する方法を考えてみた

スレッドのロックをする場合、読み込み処理同士は他に影響を与えないのでロックをする必要がない。 Javaでは、ReadWriteLockを使うと、読み込みスレッドは同時にいくつでも動くけど書き込みスレッドは他のスレッドが動いていると処理をまち、書き込み処理中…

マルチスレッド対応カウンタ

Javaの++演算子はアトミックじゃない。つまり、++nは、n = n + 1と分解されたとき、nを読み込んだ後、1足した値をnに書き込む前に他のスレッドがnを変更していたら、すでに他のスレッドで行っていた変更が無効になる。 で、これはvolatileをつけてもだめ。 …

ただ漠然と10000時間では意味がない

10000時間くらいやったら天才になれる、ということですが。 http://lifehacking.jp/2008/11/the-law-of-10000-hours/ ぼくは小学校のころからプログラムしてるので、そこから大学の最初の4年まで、趣味だけで組んでた時期は週3時間くらいプログラムしてたと…

マルチスレッド環境でlongを共有するときの注意

このプログラムは止まるだろうか? このスレッドは、lockの上位32ビットと下位32ビットが異なると止まる。mainでは、lockに同じ乱数を上位32ビットと下位32ビットに設定する。 だから、プログラムが書いた通りに動けば止まらないはず。 import java.util.Ran…

さらに円周率を求めてみる

こないだ、積分の練習に円周率を求めてみたんだけど、もうちょっとちゃんと円周率を求めてみる とりあえず、モンテカルロでってことなので、やってみる。 円周率をモンテカルロで求めるときには、ランダムに選んだ点が円に入るかどうかで判定します。 つまり…

Java Expert #03 にNetBeans Profilerの記事を書きました

Java Expert #03にNetBeans Profilerの記事を書きました。 たぶん、今日発売。 Java Expert #03:書籍案内|技術評論社 今回は「まるごとNetBeans」 半分以上NetBeansです。 けど、見本誌をながめてみて思ったのですが、id:shinさんが書かれているように、い…

誕生日が++ageではなくage++の理由

まず++演算子のおさらい。 ++演算子は、変数の前につけて++aとすることも、後ろにつけてa++とすることもできる。このふたつには違いがある。 この違いは、print(++a)やprint(a++)とするとわかる。++aは式としてはaを1増やした値に、a++は式としては増やす前…

フェルマーテストは乱数の性能にあんまり影響されない

試しにフェルマーテストが乱数の質で性能に違いがあるかやってみました。 1千万までの合成数について、何回の判定で合成数と認識されるかというのを、100回やってみました。 1回 - 433428013 2回 - 97607 3回 - 7565 4回 - 2207 5回 - 1160中略213回 - 1 223…

longの乱数を指定範囲で得る方法、intと同じでよかった

結局、ちょっと勘違いがあって、nextInt(int)と同じことをやればよかったことがわかりました。 long nextLong(long n){ long bits, value; do{ bits = r.nextLong(); if(bits < 0) bits -= Long.MIN_VALUE; val = bits % n; } while (bits - val + (n - 1); …

プログラマなら、フェルマーテストは一度書いておくべき

gcdは再帰の良い例だし、modPowの反復二乗法ではビット演算を意識する。 そして、フェルマーテスト自体は乱択アルゴリズムのひとつだ。 微分積分は使わない分野では全く必要ないし、使う分野というのも狭い。 けども、整数演算は、プログラムとは切り離せな…

カーマイケル数を求めてみる

やっぱ、どの数がカーマイケル数か気になるので、1千万までのカーマイケル数を求めてみました。全部で105個です。 561 1105 1729 2465 2821 6601 8911 10585 15841 29341 41041 46657 52633 62745 63973 75361 101101 115921 126217 162401 172081 188461 25…

フェルマーテストで素数判定

longの乱数が欲しかったのは、素数判定がやりたかったからなのですが、確認のためにエラトステネスの篩との比較をしたので、結局intの範囲までしか使いませんでした。 素数判定には、フェルマーテストを使います。で、今回は、わざと判定回数を少なくしてみ…

longで指定範囲の乱数

結局、乱数が一様であれば、それを分割した部分も一様になるはずなので、基本的にはgetLong() % nで大丈夫そうです。ただ、そうするとlongの範囲が割り切れなかった部分で、乱数にムラができるので、考慮する必要があります。 で、結局そうすると、nがintの…

longで、範囲指定した乱数を得るにはどうすればいいの?

ところで、Javaの乱数ではnextInt(int)というメソッドがあるので、intだと範囲指定して乱数を得ることができます。 けどもnextLong(long)というメソッドはないので、longだと範囲指定して乱数を得ることができません。 なにも考えなければ nextLong() % n; …

Javaの乱数

最近、乱数について興味があって、いろいろ調べてたら、java.util.Randomはひとつめの値が乱数としては使い物にならないくらい偏りがあるらしい。 試しにこんなプログラムを書いてみます。 public class RandomRange { public static void main(String[] arg…

2の100乗の階乗とか

具体的な計算はid:smoking186さんがlog_{10} (2^{100})!を推定する - 186 @ hatenablogで書かれてますが、とりあえず。 まあ、2の何乗かが何桁になるかは、プログラマのたしなみなんで、2の100乗が何桁になるかは基本として。 何ビットで何桁が扱えるかとか…

小室哲哉の人とそのバックバンドだった人

1980年から1990年の歌謡曲って、阿久悠から小室哲哉の流れで、これは役割的には作詞から作曲への流れと見れるんだけど、阿久悠の詞は、朝が来ても夜が来ても夏が来ても冬が来ても、どんな歌が来てもいけるよ的な、すんごい力強さがあったのに対して、小室の…

簡単めの問題

・2^100の一の位の数字は何になるか ・(2^100)!の一億の位の数字は何になるか

2の100乗の階乗が何桁になるかを暗算で計算するにはどうするか

というのをだいぶ前にお風呂でやってたことがあって、こないだ思い出してついったに書いたんだけど、連休ヒマな人は考えてみると楽しいと思う。 いま流行りのフェルミ推定ですかね。 結局お風呂でやってたやつは計算間違いがあったことがわかったんだけど。