Yuki Nakata's Blog

天才 中ちゃん♪

借王
不敵な笑みを浮かべる哀川翔

昔、借王(シャッキング)という映画が大好きでした。

借金で首が回らなくなった3人組が詐欺をする、という映画です。

個性を発揮して詐欺ミッションを遂行する、という意味でミッションインポッシブルに近い感覚がして面白いのです。

借王で検索しているとyoutubeでヒットします。

youtubeで映画が見られるようになっているんですね。知りませんでした。

しかも1作品たったの100円です。

72時間でしたら100円で映画を観ることができます。

もちろん映画の作品によって価格は変わると思いますが、昔の映画でしたら100円程度で見られるのではないでしょうか。

昔好きだった映画が誰にでもあると思います。ユーチューブで見ましょう。懐かしいですよ。

シャッキング2
支払い方法は簡単で、クレジットカードかpaypalで支払うだけです。

youtubeで映画が見られるというのは素晴らしい。 

最新の映画も見られるようにすればいいのに。

映画館にお金を払う人はyoutubeにもお金を払うでしょう。

1作品500円程度なら喜んで払うと思いますけど。


そんなわけで15年ぶりぐらいに借王を観ました。いやー、面白い。

人間の感覚はそんなに変わらないですね。

哀川翔が若い。かわいい。冒頭の哀川翔の顔を見てください。いい表情してるわ。

志賀勝がいい味出してる。

このまま全シリーズ見てしまいそうです。
 


コーヒーをよく飲んでいます。

コーヒーは2種類に分類できます。

カフェインの入ったコーヒーと入っていないコーヒーです。

通常コーヒーにはカフェインが入っています。

外の喫茶店やマクドナルド、スターバックスのコーヒーにはカフェインが大量に入っています。

カフェインを摂ると脳が活性化します。感覚でいうとピキピキします。

私の場合には脳が暴走します。

その時はいいのかもしれませんが、逆に脳が働かなくなって疲れます。

マクドナルドやスターバックスのコーヒーを全部飲んではいけません。

カフェインの摂りすぎになるからです。ほんの少しだけ飲んであとは捨てるようにしています。

カフェイン中毒になってしまうのです。というか企業は客をカフェイン中毒にして儲けたいのです。

砂糖中毒と同じ構図ですね。

外でコーヒーを飲む場合には本当に注意しましょう。


ですから私は家では意識してカフェインレスのコーヒーを飲むようにしています。

マウントハーゲンのオーガニックコーヒーです。インスタント。

近所のスーパーで見当たらないので、アマゾンで購入しています。

コーヒーが好きで一日で何杯も飲むんでしたらカフェインレスにして脳に気を使いましょう。






 

素数判定プログラム3 C言語GMPライブラリの続きです。

今までとは違った素数判定プログラムを書いていきます。

前回のgmpプログラムではmpz_probab_prime_p 関数を使いました。

実行すると計算が一瞬で終わります。一体どういう仕組みなのでしょうか。

mpz_probab_prime_p 関数は内部でMiller_Rabin 素数テストを行っています。

では、Miller Rabin素数テストとは何かを調べていきましょう。

Miller Rabin素数テストはフェルマーテストを改良して作られたものです。

というわけでまずはフェルマーテストの説明から。


nが素数の場合、

a ^ (n - 1) ≡ 1 (mod n)

が成立します。 a については 1 <= a < n という条件がついています。 ま、そりゃそうです。

aについては単純にa = 2 と置き換えて問題ありません。

上の式を変換すると

2 ^ (n - 1 ) mod n = 1

計算結果が1となると素数と判定します。

素数3の場合 2 ^ 2= 4,  4 % 3 = 1

素数5の場合 2 ^ 4 = 16, 16 % 5 = 1

素数7の場合 2 ^ 6 = 64, 64 % 7 = 1

素数の場合は必ず計算結果の余りが1 となります。これがフェルマーテストです。

1にならない場合は素数ではないので弾くことができます。

ところが素数でない場合も1 となることがあります。

341 = 11 * 31 は素数ではありませんが2となります。 

(2 ^ 340) % 341 = 1

前回までのプログラムは素数かどうかを割り算をして割り切れるかどうかを調べました。

フェルマーテストの場合は乗数計算となります。

しかも数が爆発します。

41が素数かどうかを調べるには 2 ^ 40です。計算すると1099511627776 になります。

2を40回掛け算しなければいけません。

これは大変、ということで簡単にするアルゴリズムがあります。

繰り返し二乗法です。

素数判定法5 繰り返し二乗法に続きます。

素数判定プログラム2 C言語GMPライブラリ の続きです。

GMPライブラリを使って素数判定プログラムを書いていきます。

gmpには素数を判定する関数が用意されています。

int mpz_probab_prime_p(mpz_t n, int reps);

戻り値で素数かどうかを判定します。

2が帰ってきたときは絶対素数 (definitely prime)
1のときは素数っぽい、(probably prime)
0のときは合成数つまり素数ではない、です。

repsはミラーラビン法のパラメータですが、通常25を指定しておけばいいそうです。

実行してみてください。一瞬で計算が終わりますよ。

$ gcc prime4.c -o prime4 -lgmp

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <gmp.h>

int main(void)
{
mpz_t number;
int answer = 0;

  mpz_init(number);

mpz_set_str(number, "940461086986004843694934910131104208392131088686023657900173332902199657733778583489", 10);
 
answer =  mpz_probab_prime_p(number, 25); 

mpz_out_str(stdout, 10, number);
if (answer) {
printf(" は素数だよ\n");
} else {
printf(" は素数じゃないよ\n");
}
return 0;
}

素数判定プログラム C言語の続きです。

今度はGMPライブラリを使って素数判定プログラムを書いていきます。

GMPプログラミング初めてです。

ぶっつけ本番でも大丈夫でしょう。

変数をそれぞれ保存しないといけないのでプログラムが汚くなってしまいました。

C言語風のコメントも書いておきました。見づらくなったかも。w

GMPライブラリーもマスター出来ました。

//$ gcc prime3.c -o prime3 -lgmp

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <gmp.h>

int isPrime(mpz_t number)
{
mpz_t i, four, twomod, threemod, sqrt, tmpmod, tmpmod2, iplus2;

mpz_init(i);
mpz_set_str(i, "5", 10); //10進数 5で初期化 i = 5;

mpz_init(sqrt);
mpz_sqrt(sqrt, number); 

mpz_init(four);
mpz_set_str(four, "4", 10);//10進数 4で初期化 four = 4;
mpz_init(twomod);
mpz_set_str(twomod, "0", 10);//10進数 0で初期化 twomod = 0;

mpz_init(threemod);
mpz_set_str(threemod, "0", 10);//10進数 0で初期化 threemod = 0;

mpz_init(tmpmod);
mpz_init(tmpmod2);
mpz_init(iplus2);

mpz_mod_ui(twomod, number, 2); //twomod = number % 2;
mpz_mod_ui(threemod, number, 3); //threemod = number % 3;

if (mpz_cmp_ui(number, 1) > 0 && 0 < mpz_cmp(four, number)) {
return 1;
} else if (mpz_get_ui(twomod) == 0 || mpz_get_ui(threemod) == 0) {
return 0;
} else {
for (i; 0 <= mpz_cmp(sqrt, i); mpz_add_ui(i, i, 6)) {
mpz_mod(tmpmod, number, i); //tmpmod = number % i;
mpz_add_ui(iplus2, i, 2); //iplus2 = i + 2;
mpz_mod(tmpmod2, number, iplus2); //tmpmod2 = number % iplus2;
if (mpz_get_ui(tmpmod) == 0 || mpz_get_ui(tmpmod2) == 0) {
return 0;
}
}
}

mpz_clear(i);
mpz_clear(sqrt);
mpz_clear(four);
mpz_clear(twomod);
mpz_clear(threemod);
mpz_clear(tmpmod);
mpz_clear(tmpmod2);
mpz_clear(iplus2);
return 1;
}

int main(void)
{
mpz_t number;
int answer = 0;

  mpz_init(number);

mpz_set_str(number, "150094772735952593", 10);

answer = isPrime(number);

mpz_out_str(stdout, 10, number);
if (answer) {
printf(" は素数だよ\n");
} else {
printf(" は素数じゃないよ\n");
}
mpz_clear(number);
return 0;
}

150094772735952593 は18桁の素数です。

ここに判定する数字を入力してください。
 
素数サンプル 楽勝レベル
31389448217
282437925089
1853028778786433
5559077746424707
150094772735952593

PCだと厳しい 一気に時間がかかります。終わらないかもね。
8862938260389989451257
26588814640432479998443

実はGMPライブラリには素数を判定する関数が用意されています。

それを呼べば一発で素数かどうかを判定することができます。

次回に続きます。 素数判定プログラム3 C言語GMPライブラリ

参考サイト
多倍長整数演算ライブラリ (GNU MP) 

素数一覧 1000万 

素数表 

素数を判定するプログラムを書いていきます。

単純にC言語で書いたのがコレ。

//$ gcc prime1.c -o prime1

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int isPrime(unsigned long number)
{
int i;
for (i = 2; i < number; i++) {
if (number % i == 0) {
return 0;
}
}
return 1;
}

int main(void)
{
unsigned long number = 9999991;
int answer = 0;
answer = isPrime(number);
if (answer) {
printf("%lu は素数だよ\n", number);
} else {
printf("%lu は素数じゃないよ\n", number);
}
return 0;
}

numberのところに判定する数字を入力してください。

3箇所アルゴリズムを改良して早くしていきます。 

1. まず2や3で割り切れるなら素数ではありません。
 候補ではない数字を最初に除外します。これをエラトステネスの篩といいます。

2. 判定する数字を最後までチェックする必要はありません。
 判定する数字を2つの積で表します。
 たとえば100を2つの積で表してみましょう。
 2 * 50     2で素数かどうかチェック済み
    4 * 25 4で素数かどうかチェック済み
    5 * 20 5で素数かどうかチェック済み
   10 * 10 10で素数かどうかチェック済み

 つまりわざわざ100まで調べなくても良いのです。100のルートを取り10を上限とします。
 素数かどうかを調べるには10以下まで調べれば良いです。
  
3. 素数の数字に注目する。
 5以上100までの素数を書いてみます。
 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97
 素数というのは6の倍数の隣の数字になります。確認してください。
 6k ± 1で表せます。

 この3つを考慮してプログラムを書くと次になります。

//$ gcc prime2.c -o prime2

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int isPrime(unsigned long number)
{
unsigned int i;
if (number <= 3 && number > 1) {
return 1;
} else if (number % 2 == 0 || number % 3 == 0) {
return 0;
} else {
for (i = 5; i * i <= number; i += 6) {
if (number % i == 0 || number % (i + 2) == 0) {
return 0;
}
}
}
return 1;
}

int main(void)
{
unsigned long number = 9999991;
int answer = 0;
answer = isPrime(number);
if (answer) {
printf("%lu は素数だよ\n", number);
} else {
printf("%lu は素数じゃないよ\n", number);
}
return 0;
}


これでだいぶ早くなったはずです。
for分がややこしいかもしれませんが、一度紙に書いてトレースして確認してみてください。
 
次回はGMPライブラリーを使って素数判定プログラムに改良していきます。

素数判定プログラム C言語 GMPライブラリー


Raspberry Piに初音ミクの声でしゃべらせよう。

もちろんウェブからコントロールできるようにします。

21世紀的ですね。

必要なものはOpen Jtalk と初音ミクの声データ。

$ sudo apt-get install open-jtalk open-jtalk-mecab-naist-jdic htsengine libhtsengine-dev hts-voice-nitech-jp-atr503-m001

以下のサイトを参考にしてください。
jsay スクリプトを保存して

$ sudo chmod +x jsay
$ sudo cp jsay /usr/bin/


MMDAgend Example-1.3.1をダウンロード

$ unzip MMDAgend_Example-1.3.1.zip
$ sudo cp -R MMDAgend_Example-.1.3.1/Voice/* /usr/share/hts-voice/

これで話すようになります。
$ jsay こんにちわ

今度は初音ミクの声をダウンロードしましょう。

ここからTYPE-βの方をダウンロード 解凍して声データを
/usr/share/hts-voice/mei_happy/
に上書きしてください。

初音ミクの声で話すようになります。

私の環境ではhttp://192.168.0.101/miku/
にindex.phpを置いてウェブからコントロールできるようにしています。


<?php
//Miku Talk

if($_POST["talk"]) {
exec("jsay ".$_POST["talk"]);
}
?>

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Miku Talk</title>
<link rel="stylesheet"
  href="http://code.jquery.com/mobile/1.4.2/jquery.mobile-1.4.2.min.css" />
<script src="http://code.jquery.com/jquery-1.11.1.min.js"></script>
<script src="http://code.jquery.com/mobile/1.4.2/jquery.mobile-1.4.2.min.js">
</script>

<style type="text/css">  
<!-- 
    #header, #footer {
          background-color: #f09199;
color: #ebf6f7;
}
-->  
</style>
</head>
<body>
<div data-role="page">
  <div data-role="header" id="header">
    <h1>Miku Talk</h1>
  </div>
  <div role="main" class="ui-content">
    

<form action="index.php" method="post">
  
  しゃべる内容:<br />
  <textarea name="talk" cols="30" rows="5"></textarea><br />
  <br />
  <input type="submit" value="しゃべる" />
</form>


  </div>
  <div data-role="footer" id="footer">
    <h3><a href="http://www.nakatayuki.com/" >nakata yuki</a></h3>
  </div>
</div>
</body>
</html>


参考サイト

↑このページのトップヘ