k01ken’s b10g

He110 W0r1d!

Perlでエラトステネスの篩(ふるい)を用いる。

開発環境はWindows 7 Professional(32bit)+Perl 5.24.0。

エラトステネスの篩(ふるい)とは素数を求めるアルゴリズムです。素数を入れる配列を用意して、最初は無条件に2を入れて、次に、現在の値に対して、素数を入れた配列の要素で次々と割っていき、1回も割れなければ、素数として、配列に新たに追加します。

これを繰り返すことで、ある数までの素数を導き出します。
後になればなるほど、配列の要素数がどんどん増えていくので、素数かどうか導き出すまでに時間がかかります。

今回は、100までの素数をすべて表示するプログラムを作りました。

use strict;
use warnings;

my $num = 100;

my @arr = ();

my $flug = 1;

for(my $i = 2; $i <= $num; $i++){

	$flug = 1;

	if($i == 2){
		print $i." ";
		push(@arr, $i);
	}
		for(my $j = 0; $j < @arr; $j++){

			# 1回でも割れたらアウト
			if($i % $arr[$j] == 0){
				$flug = 0;
				last;
			}

		}

		if($flug){
				print $i." ";
				push(@arr, $i);
		}
}

素数の個数を調べてみると、
10までに4個
100までに25個
1000までに168個
10000までに1229個
100000までに9552個
と、どんどん全体の内の比率が小さくなっていきます。

Perlでユークリッドの互助法を用いる。

開発環境はWindows 7 Professional(32bit)+Perl 5.24.0。

ユークリッドの互助法とは、2つの自然数の最大公約数を求めるアルゴリズムです。

aとbの2つの自然数があって(a≧b)、aをbで割り、出現した余りをxとします。今度は、bをxで割り、出現した余りをx´とします。そして、今度は、xをx´で割り、出現した余りをx´´とします。これを、2つの数が割り切れるまで繰り返して、その時の「わる数」の部分が2つの自然数の最大公約数となります。

use strict;
use warnings;

my $a = 42;
my $b = 30;

print(ea($a,$b));


sub ea{
	my ($a,$b) = @_;

	my $dummy = 0;

    # $bの方が数値が大きい場合は入れ替える
	if($a < $b){
		$dummy = $b;
		$b = $a;
		$a = $dummy;
	}

		while($a % $b != 0){
			$dummy = $a % $b;
			$a = $b;
			$b = $dummy;
		}

	return $b;
}

上記の場合、42と30の最大公約数は6なので、結果は6と表示されます。最初、returnするのを$aと書いていたので、12が表示されて、おかしいな?と思い、$bをreturnすると6と表示されたので、こっちかと修正しました。

もし、同じ自然数だった場合は、その数が最大公約数となります。例えば、42同士だったら、42が最大公約数です。

はてなブログでソースコードをシンタックスハイライトする方法と注意点

はてなブログソースコードを貼り付ける際に、見栄えを良くするために、シンタックスハイライトというソースコードに色を装飾する方法がありますが、その方法と注意点を書いておきます。

 

1.はてなブログの記事の編集画面から、編集見たままというタブの右側にある下向きの矢印をクリックすると、はてな記法Markdownがあるので、どちらかを選択します。

 

f:id:k01ken:20171013182432p:plain

 

 2.はてな記法の場合は、

>|言語名|

 ||<

 という風に書きます。言語名の部分は、perlを使うなら、perlと入力して、このブロック内に書いたソースコードをコピペします。

Markdownの場合は、

```言語名

```

 という風に書きます。言語名の部分は、perlを使うなら、perlと入力して、このブロック内に書いたソースコードをコピペします。

 

注意点として、一度、編集見たままで、投稿してしまうと、後から、編集しようと思ったときに、はてな記法Markdownが表示されないので、ソースコードシンタックスハイライトをする場合は、記事自体を削除するか、新しい投稿しなければなりません。

 

【参考】

ソースコードを色付けして表示する(シンタックスハイライト) - はてなブログ ヘルプ

はてなブログでソースコードを記載する。(シンタックスハイライト) - kharuka2016のブログ

 

 

 

 

 

Perlで相関係数を求めるプログラムを作る。

開発環境はWindows 7 Professional(32bit)+Perl 5.24.0。

相関係数は、2つのデータの共分散を、各データの標準偏差の掛け算で割って求めます。調べたいデータのまとまりを、それぞれ配列に入れて、それぞれに対して、共分散と、標準偏差を求めています。下記の2つの配列の場合、それぞれ同じデータが入っているので、結果は1となります。

use strict;
use warnings;

my @data1 = (73.3,74.3,69.0,53.0,75.4,72.4,48.9,65.7);
my @data2 = (73.3,74.3,69.0,53.0,75.4,72.4,48.9,65.7);

print (covarience(\@data1,\@data2) / (s_d(\@data1) * s_d(\@data2)));

# 標準偏差を求めるプログラム
sub s_d{

my $e_data1 = 0; # data1の平均値

my $d_data1 = 0; # data1のある1つのデータの偏差

my $v_data1 = 0; # data1のある1つのデータの分散

my $a1 = shift;

my @data1 = @$a1;

    for(my$i=0;$i<@data1;$i++){
        $e_data1 += $data1[$i];
    }
        $e_data1 = $e_data1 / @data1;

    for(my$i=0;$i<@data1;$i++){
        $d_data1 = $data1[$i] - $e_data1;
        $v_data1 += $d_data1 * $d_data1;
    }

    return sqrt($v_data1 / @data1);
}

# 2つの同じ数のデータ配列を入力したら共分散を返すプログラム
sub covarience{

my $e_data1 = 0; # data1の平均値
my $e_data2 = 0; # data2の平均値

my $d_data1 = 0; # data1のある1つのデータの偏差
my $d_data2 = 0; # data2のある1つのデータの偏差

my $c_data = 0; # 二つのデータの共分散

my($a1,$a2) = @_;

my @data1 = @$a1;
my @data2 = @$a2;

if(@data1 != @data2){ return -1; }

    for(my$i=0;$i<@data1;$i++){
        $e_data1 += $data1[$i];
        $e_data2 += $data2[$i];
    }

    $e_data1 = $e_data1 / @data1;
    $e_data2 = $e_data2 / @data2;

    for(my$i=0;$i<@data1;$i++){
        $d_data1 = $data1[$i] - $e_data1;
        $d_data2 = $data2[$i] - $e_data2;
        $c_data += $d_data1 * $d_data2;
    }

    return $c_data / @data1;

}

TensorFlowを導入する

TensolFlowとは機械学習のためのGoogleが提供しているライブラリのことです。

ディープラーニングを自分で使ってみたいので導入することにしました。

今までは、ディープラーニングに対応したライブラリを使おうとすると、LinuxMacしかダメだったので敬遠してたのですが、改めて調べてみると、TensorFlowの場合は、Windowsでも使えるみたいでした。

自分の環境はWindows 7 Professional(32bit)。

 

  1. 公式サイトへアクセスする。
  2. ページ上部のInstallと書かれたテキストリンクをクリック
  3. 自分の場合は、OSはWindowsなので、Installing TensorFlow on Windowsと書かれたテキストリンクをクリック。Windows上でPython版のTensorFlowに対応しているのは、バージョンが3.5.xか3.6.xのみらしいです。しかも、64bitしかダメみたいで、結局、断念することにしました。くそったれ!!!

 

 

Windows 7で文字を辞書登録する手順

  1. 画面下部分の道具箱のアイコンをクリックする
  2. 『辞書ツール』をクリックし、『Microsoft IME 辞書ツール』を起動する
  3. 『編集』タブから『新規登録』をクリックする。
  4. 『読み』の部分に最初の1文字を入力。        →例えば、『あ』など。
  5. 『語句』の部分に最初の1文字から始める文章を入力  →例えば、『ありがとうございました。』など。
  6. 『登録』ボタンをクリック
  7. 実際に使うタイミングで、『あ』だけ入力して、変換キーやスペースキーを押すと、『ありがとうございます』と表示される
  8. 登録したリスト(今回はimjp10u.dic)は『C://Users/ユーザー名/AppData/Roamig/Microsoft/IMJP10』のフォルダに入っているので、それを、外付けHDDに保存しておけば、パソコンを新しくしても、いちいち再登録する必要がない。
    このフォルダの場所をデスクトップにショートカットを作成しておく。