プログラマメモ2 - programmer no memo2

サイン、コサイン、タンジェント、アークタンジェント 2008/09/12

三角関数よくわからんです。

というわけで、コードを使えば少しは理解が進むかな。



a角をもとめるのは、逆正接関数(atan,アークタンジェント)を使います。


package t005;

import static java.lang.Math.*;

public class Test1 {

public static void main(String[] args) {

System.out.println(tan(toRadians(76)));
double d = tan(toRadians(76));

System.out.println(toDegrees(atan(d)));

System.out.println(A(60, 50));

System.out.println(Pythagorean(12, 5));

System.out.println(a(100, 400));

System.out.println("======");
System.out.println(a(12, 5));
double a = a(12, 5);
System.out.println(C(a, 5));
System.out.println(Pythagorean(12, 5));
System.out.println(B(a, 12));
System.out.println(A(a, C(a, 5)));
}

/**
* <p>
* a角の大きさをもとめます。
* </p>
*
* @param A辺
* @param B辺
* @return
*/
static double a(double A, double B) {
return toDegrees(atan(B / A));
}

/**
* <p>
* A辺をもとめます。
* </p>
*
* @param a 角度
* @param C辺
* @return
*/
static double A(double a, double C) {
return cos(toRadians(a)) * C;
}

/**
* <p>
* B辺をもとめます。
* </p>
*
* @param a 角度
* @param A辺
* @return
*/
static double B(double a, double A) {
return tan(toRadians(a)) * A;
}

/**
* <p>
* C辺をもとめます。
* </p>
*
* @param a 角度
* @param B辺
* @return
*/
static double C(double a, double B) {
return B / sin(toRadians(a));
}

/**
* <p>
* ピタゴラスの定理 A辺、B辺からC辺を求めます。
* </p>
*
* @param A
* @param B
* @return
*/
static double Pythagorean(double A, double B) {
return sqrt(pow(A, 2) + pow(B, 2));
}
}

ド•モルガンの法則 - 今日も元気にどもるがん 2008/04/29

Javaです。
ド•モルガンの法則です。
深い意味はありません。検証したくなったので。





知っておくと、if条件の書き方にいろいろできることがわかります。
プログラマの癖みたいなものがでるかもしれませんね。
ちなみに僕は左辺の書き方が好みかな。

public class TestDOMORUGAN {

public static void main(String[] args) {

boolean[] bs = {true, false};
for (boolean A : bs) {
for (boolean B : bs) {
if(!(!(A || B) == (!(A) && !(B)))) throw new RuntimeException("Ouch a");
if(!(!(A && B) == (!(A) || !(B)))) throw new RuntimeException("Ouch b");
}
}

System.out.println("OK!!");
}

}

ポアソン分布の理解のための手習い。その3 2008/03/25

ますます自信がないですが...
ポアソン分布です。
PoissonGeneratorを使っているからポアソン分布です...

えーと、壱時間に平均100回おきる事象があり、それが毎分ごとどれぐらいでおきるかというのをシュミレートしてみるというのが趣旨です。

まず100を60でわって平均を求めてそれをPoissonGeneratorに渡すというふうにしてみました。
それで、毎分ごとにおきる事象の回数を求めるという感じです。

結果です。なんとなく現実でもおこりそうな感じがでてるような気がしますが、どうでしょう?

mean:1.666667
1分 起きた回数の総数:1 起きた回数:1
2分 起きた回数の総数:1 起きた回数:0
3分 起きた回数の総数:4 起きた回数:3
4分 起きた回数の総数:6 起きた回数:2
5分 起きた回数の総数:6 起きた回数:0
6分 起きた回数の総数:8 起きた回数:2
7分 起きた回数の総数:10 起きた回数:2
8分 起きた回数の総数:10 起きた回数:0
9分 起きた回数の総数:11 起きた回数:1
10分 起きた回数の総数:13 起きた回数:2
11分 起きた回数の総数:13 起きた回数:0
12分 起きた回数の総数:17 起きた回数:4
13分 起きた回数の総数:22 起きた回数:5
14分 起きた回数の総数:24 起きた回数:2
15分 起きた回数の総数:24 起きた回数:0
16分 起きた回数の総数:24 起きた回数:0
17分 起きた回数の総数:27 起きた回数:3
18分 起きた回数の総数:28 起きた回数:1
19分 起きた回数の総数:28 起きた回数:0
20分 起きた回数の総数:28 起きた回数:0
21分 起きた回数の総数:31 起きた回数:3
22分 起きた回数の総数:33 起きた回数:2
23分 起きた回数の総数:35 起きた回数:2
24分 起きた回数の総数:35 起きた回数:0
25分 起きた回数の総数:36 起きた回数:1
26分 起きた回数の総数:38 起きた回数:2
27分 起きた回数の総数:41 起きた回数:3
28分 起きた回数の総数:43 起きた回数:2
29分 起きた回数の総数:44 起きた回数:1
30分 起きた回数の総数:45 起きた回数:1
31分 起きた回数の総数:46 起きた回数:1
32分 起きた回数の総数:47 起きた回数:1
33分 起きた回数の総数:48 起きた回数:1
34分 起きた回数の総数:50 起きた回数:2
35分 起きた回数の総数:52 起きた回数:2
36分 起きた回数の総数:55 起きた回数:3
37分 起きた回数の総数:56 起きた回数:1
38分 起きた回数の総数:59 起きた回数:3
39分 起きた回数の総数:61 起きた回数:2
40分 起きた回数の総数:62 起きた回数:1
41分 起きた回数の総数:64 起きた回数:2
42分 起きた回数の総数:65 起きた回数:1
43分 起きた回数の総数:66 起きた回数:1
44分 起きた回数の総数:67 起きた回数:1
45分 起きた回数の総数:67 起きた回数:0
46分 起きた回数の総数:68 起きた回数:1
47分 起きた回数の総数:69 起きた回数:1
48分 起きた回数の総数:69 起きた回数:0
49分 起きた回数の総数:73 起きた回数:4
50分 起きた回数の総数:73 起きた回数:0
51分 起きた回数の総数:77 起きた回数:4
52分 起きた回数の総数:81 起きた回数:4
53分 起きた回数の総数:83 起きた回数:2
54分 起きた回数の総数:90 起きた回数:7
55分 起きた回数の総数:93 起きた回数:3
56分 起きた回数の総数:97 起きた回数:4
57分 起きた回数の総数:98 起きた回数:1
58分 起きた回数の総数:98 起きた回数:0
59分 起きた回数の総数:100 起きた回数:2
60分 起きた回数の総数:102 起きた回数:2


import java.util.Random;

import org.uncommons.maths.random.PoissonGenerator;

public class TestT2 {
public static void main(String[] args) {

int occured = 0;
//壱時間に平均100回おきる事象
double mean = 100d/60d;
System.out.printf("mean:%f%n", mean);
//分ごとにその事象がおきることをシュミレートしてみる
for(int i=1;i<=60;i++){
int r = r(mean);
occured += r;
System.out.printf("%d分 起きた回数の総数:%d 起きた回数:%d%n",i, occured, r);
}

}

static int r(double mean) {
Random random = new Random();
PoissonGenerator generator = new PoissonGenerator(mean, random);
return generator.nextValue();
}
}

ポアソン分布の理解のための手習い。その2 2008/03/25

ポアソン分布です。Javaです。
使ってみたライブラリは、



ポアソン分布の平均および分散は、λ に等しい。ポアソン分布 - Wikipedia


λが10とした場合、
100回生成して、生成するごとに平均をとっていきます。
なんとなく平均におさまっていきますね。
多分、そういうことだと思う。

10万回行った場合は、
count:100000 r: 6 a:998012 mean:9.980

10にますます近づく。

count: 1 r: 5 a:5 mean:5.000
count: 2 r: 6 a:11 mean:5.500
count: 3 r:17 a:28 mean:9.333
count: 4 r:11 a:39 mean:9.750
count: 5 r: 7 a:46 mean:9.200
count: 6 r: 8 a:54 mean:9.000
count: 7 r: 9 a:63 mean:9.000
count: 8 r:11 a:74 mean:9.250
count: 9 r: 6 a:80 mean:8.889
count:10 r:13 a:93 mean:9.300
count:11 r:10 a:103 mean:9.364
count:12 r:11 a:114 mean:9.500
count:13 r: 7 a:121 mean:9.308
count:14 r:13 a:134 mean:9.571
count:15 r:10 a:144 mean:9.600
count:16 r:13 a:157 mean:9.813
count:17 r: 5 a:162 mean:9.529
count:18 r:11 a:173 mean:9.611
count:19 r: 8 a:181 mean:9.526
count:20 r: 7 a:188 mean:9.400
count:21 r: 7 a:195 mean:9.286
count:22 r: 9 a:204 mean:9.273
count:23 r:11 a:215 mean:9.348
count:24 r: 6 a:221 mean:9.208
count:25 r: 6 a:227 mean:9.080
count:26 r:11 a:238 mean:9.154
count:27 r:10 a:248 mean:9.185
count:28 r:15 a:263 mean:9.393
count:29 r: 8 a:271 mean:9.345
count:30 r:11 a:282 mean:9.400
count:31 r:14 a:296 mean:9.548
count:32 r:11 a:307 mean:9.594
count:33 r:15 a:322 mean:9.758
count:34 r: 9 a:331 mean:9.735
count:35 r:10 a:341 mean:9.743
count:36 r:11 a:352 mean:9.778
count:37 r: 8 a:360 mean:9.730
count:38 r:10 a:370 mean:9.737
count:39 r: 4 a:374 mean:9.590
count:40 r:13 a:387 mean:9.675
count:41 r: 7 a:394 mean:9.610
count:42 r:11 a:405 mean:9.643
count:43 r:14 a:419 mean:9.744
count:44 r:10 a:429 mean:9.750
count:45 r:11 a:440 mean:9.778
count:46 r:11 a:451 mean:9.804
count:47 r:11 a:462 mean:9.830
count:48 r:12 a:474 mean:9.875
count:49 r: 8 a:482 mean:9.837
count:50 r:11 a:493 mean:9.860
count:51 r:14 a:507 mean:9.941
count:52 r:10 a:517 mean:9.942
count:53 r:10 a:527 mean:9.943
count:54 r: 2 a:529 mean:9.796
count:55 r: 5 a:534 mean:9.709
count:56 r:10 a:544 mean:9.714
count:57 r: 7 a:551 mean:9.667
count:58 r: 7 a:558 mean:9.621
count:59 r: 7 a:565 mean:9.576
count:60 r:11 a:576 mean:9.600
count:61 r:11 a:587 mean:9.623
count:62 r:12 a:599 mean:9.661
count:63 r: 9 a:608 mean:9.651
count:64 r:13 a:621 mean:9.703
count:65 r: 7 a:628 mean:9.662
count:66 r: 5 a:633 mean:9.591
count:67 r:11 a:644 mean:9.612
count:68 r:11 a:655 mean:9.632
count:69 r:17 a:672 mean:9.739
count:70 r: 7 a:679 mean:9.700
count:71 r:12 a:691 mean:9.732
count:72 r: 7 a:698 mean:9.694
count:73 r:17 a:715 mean:9.795
count:74 r: 8 a:723 mean:9.770
count:75 r: 7 a:730 mean:9.733
count:76 r:13 a:743 mean:9.776
count:77 r:11 a:754 mean:9.792
count:78 r: 8 a:762 mean:9.769
count:79 r:14 a:776 mean:9.823
count:80 r:12 a:788 mean:9.850
count:81 r: 6 a:794 mean:9.802
count:82 r: 7 a:801 mean:9.768
count:83 r: 7 a:808 mean:9.735
count:84 r: 7 a:815 mean:9.702
count:85 r:16 a:831 mean:9.776
count:86 r: 5 a:836 mean:9.721
count:87 r: 9 a:845 mean:9.713
count:88 r:10 a:855 mean:9.716
count:89 r:10 a:865 mean:9.719
count:90 r:10 a:875 mean:9.722
count:91 r:11 a:886 mean:9.736
count:92 r: 8 a:894 mean:9.717
count:93 r:15 a:909 mean:9.774
count:94 r: 9 a:918 mean:9.766
count:95 r: 9 a:927 mean:9.758
count:96 r: 6 a:933 mean:9.719
count:97 r: 9 a:942 mean:9.711
count:98 r:19 a:961 mean:9.806
count:99 r:15 a:976 mean:9.859
count:100 r:13 a:989 mean:9.890



import java.util.Random;

import org.uncommons.maths.random.PoissonGenerator;

public class TestT {

public static void main(String[] args) {

double a = 0d;
for(int i=1;i<=100;i++){
int r = r(10);
a += r;
System.out.printf("count:%2d r:%2d a:%.0f mean:%.3f%n", i, r, a, (a/i));
}
}

static int r(double mean){
Random random = new Random();
PoissonGenerator generator = new PoissonGenerator(mean, random);
return generator.nextValue();
}
}


ポアソン分布の理解のための手習い。 2008/03/25
2008/03/25

待ち行列の説明をみてて、「ポアソン分布」というのがでてきたので、ちょっと勉強。

使ったライブラリは、


ポアソン分布で値を生成して生成した回数で割ってみる。
結果は
mean:1000
ポアソン分布でだした値の平均:998.928

もちろん繰りかえせば値もちょっとかわる。
平均をとることに意味があるかは、わからないけど...



このライブラリ使うとポアソン分布の値が手軽にとれるよってことで。

package t;

import java.util.Random;

import org.uncommons.maths.random.PoissonGenerator;

public class TestRandomOccur {

public static void main(String[] args) {
int mean = 1000;
System.out.println("mean:" + mean);
//print_random(mean);
print_poisson(mean);
}

static void print_poisson(int mean) {
double m = 0d;
int cnt = mean;
for (int i = 0; i < cnt; i++) {
double g = r(mean);
// System.out.println(g);
m += g;
}
System.out.println("ポアソン分布でだした値の平均:" + (m / cnt));
}

// static void print_random(int mean) {
// double m = 0d;
// int cnt = mean;
// for (int i = 0; i < cnt; i++) {
// double g = r2(mean);
// System.out.println(g);
// m += g;
// }
// System.out.println("ランダムでだした値の平均:" + (m / cnt));
// }

static int r(int mean) {
Random random = new Random();
PoissonGenerator poissonGenerator = new PoissonGenerator(mean, random);
return poissonGenerator.nextValue();
}

static int r2(int mean) {
Random random = new Random();
return random.nextInt(mean);
}
}

指数的な増え方 2008/03/24

利子が7%ついた場合の5年後


1.07かけてそれを5回くりかえして合計するか、1.075してそれをかけてもとめることができる。



public class TestA {

public static void main(String[] args) {
System.out.println(a(5));
System.out.println(b(5));
}

static double d = 1.07;
static final double base = 10.77;
static double a(int c){
double b = base;
for(int i=0;i<c;i++){
b *= d;
}
return b;
}

static double b(int c){
return base * Math.pow(d, c);
}
}

独立事象が同時に起こる確率は... 2008/03/17

独立事象が同時に起こる確率は、それぞれの確率の積に等しい.


それで、独立事象とは、起きる事象同士が、えーと、影響を与えないようなことを指していまして、たとえば二回サイコロをふりますと、最初の一回目の結果が、二回目に影響を与えないし、二回目のサイコロの目が一回目のサイコロの目に影響を与えないって感じしょうか(あたりまえか....)。

外延的記法、内包的記法 2008/03/15

A = {a1,a2,...,an}
って感じで書くのが外延的記法
列挙的定義ともいいます。

で、それに対して、
条件P(x)を満たしているx全体の集合Xを
X = {x|P(x)}
って感じに書く方法を内包的記法っていいます。

参考

流水算 2008/01/14

流水算は算数の文章問題でよくでてくるようですね。

式は、

静水での速さ=(下りの速さ+上りの速さ)/2
流れの速さ=(下りの速さ-上りの速さ)/2
上りの速さ=静水時の速さ-流れの速さ
下りの速さ=静水時の速さ+流れの速さ


速さを求める式は、
速さ=道のり/時間



参考
流水算 - Wikipedia

半径をrとしたときの、円周の長さをlとして、l = 2πr 2008/01/12
2008/01/12

半径6400kmの地球の赤道に沿ってロープを張るとします。地表から1m離してロープを張ると、何m余分に必要でしょう。これだけは知っておきたい数学の公式・定理 p.28


円周の長さを求める式は、「半径をrとしたときの、円周の長さをlとして、l = 2πr」です。

Javaで求めてみます。

public class A20080112 {

public static void main(String[] args) {
a();
}

public static void a() {
double d = circumferentialLength((6400 * 1000) + 1)
- circumferentialLength(6400 * 1000);
System.out.printf("%gm%n", d);
System.out.printf("%.5gm%n", d);
System.out.printf("%.3gm%n", d);
System.out.printf("%em%n", d);
System.out.println(d + "m");
}

/**
* <p>
* 円周を求めます
* </p>
*
* @param radius
* @return
*/
public static double circumferentialLength(double radius) {
return 2 * radius * Math.PI;
}
}


結果
6.28319m
6.2832m
6.28m
6.283185e+00m
6.283185310661793m


あと、
System.out.printfで小数点を表示させるときは、%fを使用。


参考
円 (数学) - Wikipedia
半径 - Wikipedia
円周率 - Wikipedia

n進法 2008/01/07
2008/01/08

n進法とは、nのかたまりで位が上がること。


n進数で表現してみます。

簡単ルールで行えます。
(1)対象の数をnで割ります。余りを記録しておきます。
(2)1.の商をnで割ります。余りを記録しておきます。
(3)2.を割れなくなるまで続けます。
記録した余りを、最後に記録した順に右から書いていけば、n進数で表現できると思う...
※まちがってないとは思うけど...

お手軽Javaコード
5213を5進数で表示
public class B {

/**
* @param args
*/
public static void main(String[] args) {

int t = 5213;//対象数字
int n = 5;//n進数
int[] a = {t, 0};
StringBuilder builder = new StringBuilder();
while(a[0] != 0){
a = a(a[0], n);
//System.out.println(a[0] + " " + a[1]);
builder.insert(0, a[1]);
}
System.out.println(builder);
}

static int[] a(int t, int b){
return new int[]{t / b, t % b};
}

}



参考
n 進数について
位取り記数法 - Wikipedia
すぐるゼミ・N進法

単利と複利 2008/01/06

単利計算:(元金) x {1 + (利率) x (期間)}
複利計算:(元金) x {1 + (利率)}期間

単利とは元金だけに利子がつく計算方法
複利とは元金と前についた利子を合わせた金額に対して利子がつく計算方法

複利 - Wikipedia

以前作成したコードを使用して計算させてみます。
プログラマメモ2: javascriptで逆ポーランド記法

すべて逆ポーランドで書かずに、途中で、Math.powを使いました。



元金:
利率:%
期間:
実行をクリックすると上記の入力したスクリプトが実行されます。
実行

 

長方形のカードを並べて最も小さい正方形をつくるとき 2007/12/29

長方形のカードを並べて最も小さい正方形をつくりたければ、長方形の縦、横の最小公倍数を求めればいいわけです。

縦:6cm
横:8cm

24cmの正方形になります。

Groovyで

def lcm(l, r){
return (l * r) / (l.gcd(r));
}

print lcm(6G, 8G)


Groovyでは
数のうしろにGをつけると、BigInteger,BigDecimalとしてあつかわれます。

Groovy - Groovy Math

参考
プログラマメモ2: 最小公倍数の検索結果
これだけは知っておきたい数学の公式・定理 - プログラマの本棚

日にちを7でわったときの余りが同じ数は、同じ曜日になっている 2007/12/27

日にちを7でわったときの余りが同じ数は、同じ曜日になっているこれだけは知っておきたい数学の公式・定理


calコマンドで出力
   December 2007
S M Tu W Th F S
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


7日が金曜日です。それで、27日は何曜日と質問されたら、
27 % 7 します。すると6余るので木曜日って感じでもとめらます。

約数の個数の求め方 2007/12/26

公式

ある整数nが、ap * bq * cr表されるとき、約数の個数は、(p + 1)(q + 1)(r + 1)個


素因数分解
小さい素数から順にわっていく方法を連除法という。

とりあえずJavaのコード。
import java.math.BigInteger;

public class S1 {

public static void main(String[] args) {

int a=360;
int k = 1;

for(int i=2;i<=a;i++){
// 素数になるまで...
if(!isPrime(i)) continue;
int c = 0;
// 割れる間は...
while((a % i) == 0){
a = a / i;
c += 1;
}
System.out.println(i + "^"+c);
k *= c + 1;
}
System.out.printf("約数の個数:%d", k);
}

public static boolean isPrime(long l){
return BigInteger.valueOf(l).isProbablePrime(1);
}

}

交換法則 結合法則 分配法則 2007/12/20

交換法則
a+b=b+a a*b=b*a

結合法則
a+b+c=(a+b)+c=a+(b+c)
a*b*c=(a*b)*c=a*(b*c)

分配法則
a*(b+c)=a*b+a*c

ユークリッドの互除法 2007/09/16

ユークリッドの互除法 - Wikipedia

wikipediaに載っていたアルゴリズムをコードにしてみました。

ユークリッドの互除法

static int gcd(int m, int n) {
if (m < n)
return gcd(n, m);
if (n == 0)
return m;
int r = m % n;
if (r == 0)
return n;
// mをnで割った余りを新たにmとし、更にmとnを取り替えて3に戻る
return gcd(n, r);
}