teacup. [ 掲示板 ] [ 掲示板作成 ] [ 有料掲示板 ] [ ブログ ]

 投稿者
  題名
  内容 入力補助画像・ファイル
    
 URL
[ ケータイで使う ] [ BBSティッカー ] [ 書込み通知 ] [ 検索 ]


先日(12/5)、「SQPの使い方」の改訂※について唐澤君にmailしたところ‥

 投稿者:加藤 厚  投稿日:2017年12月 7日(木)15時05分38秒 em1-115-196-216.pool.e-mobile.ne.jp
編集済
  卒論サポート@J女子大に関する以下の1.~3.の近況紹介(?)がありました。

関心のある人がいるかも、と考え、この BBSで情報提供しておきます。


1.「どういう時にどんな分析=分散・平均値比較など」が有効かを簡単に説明できることを目指しています。

 分析の目的、測定の水準、分布の特徴、変数・群の数と対応の有無などに基づく手法の使い分けの再確認と整理には、次行 URLの(率直?でマジメな)論文:「理学療法領域における統計解析法の選択」(小林 2005)が有益と考えます。
https://www.jstage.jst.go.jp/article/mpta/16/1/16_1_25/_pdf

 他方、「最小限の装備でまずまずの成果を目指す」(←SQP がそうです‥笑)観点からは、尺度は「ほぼ間隔」、分布は「まあ山型」となるように測定法を工夫してパラメトリックな手法に持ち込み、3群以上の比較は(マジメに多重比較したりはせず)平均値の図示で済ませる‥という態度・姿勢もアリ&現実的というのが「私見」です。

 適切な仮説検定は確かに「画竜点睛」ですが、本質的に重要なのは研究自体の内容と達成(←「効果量重視」と共通する姿勢)、「点の打ち方」に拘り過ぎて肝心の竜が蛇尾のようではそれこそ本末転倒でしょう。;-)
---------/---------/---------/---------/---------/---------/---------/

2.「因子分析」「重回帰」など学生が持ってきますが、私には、まだちょっと無理。私自身、「簡単にできる因子分析」などができないかと考えてしまいます。

 「使ってみたい!」という学生の気持ちはワカりますが「仕組み」を概念的に理解していない手法の使用は危険です。

 ボクなら、因子分析については「多くの項目に高く負荷している軸を重要な因子と認めるための前提条件」を、重回帰については「重回帰式から得られる重相関係数Rは何と何の相関なのか」をまず尋ね、正しく答えられないなら使わせません。

 例えば、前者の正答の1つは「項目セットによる対象概念の“均等な網羅”」です。類似した内容を含む項目が多数あればそれが因子になり、かつその因子が多数の項目に高く負荷するのは「当たり前」。逆に、項目セットに含まれていない内容は(それがどれほど重要でも)どんな分析をしようと“出て”はきません。
---------/---------/---------/---------/---------/---------/---------/

3.私は「質問項目」を丁寧に作ること・(先行研究を)読むことにこだわるのですが、学生は時間に追われ「結果」が一番になってしまいます。

 「先行研究」にはそれなりに妥当・適切な測定方法と分析手法が含まれ、また解決すべき問題、達成すべき課題なども言及されているハズです。従って、それらを参考にすることは、自分の研究の意義の確認、並びに妥当な測定と適切な分析の方法の原案確保の最も確実な方法です。それらを踏まえて「可能な進歩・改善」を目指すのが(天才ではない「普通の人」にとっての)研究というものでしょう。2500年前に孔子も言っています:思而不学則殆:思いて学ばざればすなわち殆(あやう)し:Thinking without learning is dangerous.(Confucius)

 他方、概念的理解さえあれば、処理結果は手軽に得られた方がbetter。因子分析を含む多変量解析は以下のfree toolsなどでも可能なようです(‥ただし、ボク自身は使っていません):
 HAD(関西学院大学社会学部の清水准教授作成)
http://norimune.net/had
 College Analysis(福山平成大学経営学部の福井教授作成)
http://www.heisei-u.ac.jp/ba/fukui/analysis.html
 単純な重回帰分析なら Excelでもできますネ:
https://bellcurve.jp/statistics/blog/14015.html
---------/---------/---------/---------/---------/---------/---------/

お気づきの点などあったら書き込みをよろしく!>all

それでは皆さん、お元気で!

※↓頁中ほどの 2011bの右側の青い★が最新版#(←☆のDLはまだ旧版)
http://hp.vector.co.jp/authors/VA021211/
#ver.1.0.8‥recodeやscaleは改訂なし=旧版のまま
 
 

ブラウザに計算をさせてみよう!: 14 その4 算術幾何平均法@標準機能

 投稿者:加藤 厚  投稿日:2017年12月 6日(水)08時00分5秒 em119-72-196-25.pool.e-mobile.ne.jp
   円周率を求める方法の1つに算術幾何平均(Arithmetic Geometric Mean)によるアルゴリズムがあります。ガウス(Johann Gauss 1777-1855)の算術幾何平均による完全楕円積分のアルゴリズムとルジャンドル(Adrien-Marie Legendre 1752-1833)の楕円積分に関する関係式に基づくアルゴリズムだそうですが、ボクには何のことやらわかりません。しかし、アルゴリズム(算法=演算手続き)である以上、たとえ理解できなくても使用はできます。しかも「スーパーコンピュータの(略)πの超高精度計算(略)のアルゴリズムがガウス・ルジャンドル法であることが多い」(寒川 2017)とのことで、期待が持てそうです。
http://www.oishi.info.waseda.ac.jp/~samukawa/GaussLeg2.pdf

 以下は、下の画像:上側に示した算術幾何平均によるアルゴリズムの十進BASICプログラム(寒川 2017 p.3)に基づくスクリプトの一例です:
<script>
回数=7;試行=1;a=1;b=1/Math.sqrt(2);s=b*b;t=1
while(試行<回数){
  x=(a+b)/2;y=Math.sqrt(a*b);c=(a-b)/2;t=t*2;s=s+t*c*c
  document.write(試行+": "+((2*a*a)/(1-s))+"<BR※>")
  a=x;b=y;試行++
  }
</script>
※BRは本来は半角(brでもBRでもOK)

 反復計算の回数を 6とし、試行の値が回数=7より小さい間(つまり 6になるまで)の各時点でのπの近似値を試行回数と共に画面表示させます。このスクリプトをコピペして算術幾何平均法@標準機能.htmとして保存し、ブラウザにD&Dすると一瞬で下の画像:下側の結果が示されることでしょう。

 近似値は第4試行(4:)で既に3.14159265‥になり、フーリエ級数で1億項以降まで求めた場合に匹敵する精度が得られています。第5試行で小数第15位まで正しい値が得られる一方、第6試行でも同じ値が示され、11などでも言及した「標準機能で処理できる値」の限界に到達してしまっているようです。ということは、再び任意精度演算ライブラリの出番です。


 

ブラウザに計算をさせてみよう!: 13 その3 中学生にも納得できる「面積比と乱数」

 投稿者:加藤 厚  投稿日:2017年11月29日(水)08時00分6秒 em1-115-195-125.pool.e-mobile.ne.jp
   フーリエ級数のような「証明には積分が必要で、知らない/忘れた人にはブラックボックス」的な方法ではなく、平均的な中学生にも理解と納得が可能な円周率の求め方に「面積比を乱数で求める方法」※があります。
※「モンテカルロ法」と呼ばれる数値実験(シミュレーション)の一種

 一辺が 1の正方形とそれに内接する円を考えます(下の画像:上参照)。正方形の面積は当然 1、円の面積(=πr2乗)はπ×1/2×1/2=π/4。従って、この円(水色)の面積を何らかの方法で求めれば、面積×4=π。そして、面積は乱数による多数の点で近似が可能です!

 0 以上 1未満の乱数を発生させるMath.random()で正方形中の無作為の位置に一億個の点を打ち、円の中心から点までの距離※が 0.5未満なら円内として数え上げ、途中経過を「試行数:その時点での円周率の近似値」の書式で20回表示するスクリプトの一例は以下の通りです:
※ピタゴラスの定理:直角三角形の斜辺の長さ=√(他の辺1の2乗+他の辺2の2乗)
<script>
回数=100000000;試行=0;円内=0
while(試行<回数){試行++
  x=Math.random()-0.5;y=Math.random()-0.5
  if(Math.sqrt((x*x)+(y*y))<0.5)円内++
  if(試行%(回数/20)==0){
    document.write(試行+": "+4*円内/試行+"<BR※>")
  }
}
</script>
※BRは本来は半角(BRでもbrでもOK)

 コピペして(BRを半角にした上で)円周率@乱数.htmとして保存し、ブラウザにD&Dすると数秒で下の画像:中のような結果※が示されることでしょう。
※乱数に基づくシミュレーションの結果は毎回異なります。

 今回の場合、最初の5百万回までの近似値が3.141508、一億回=最終値も3.14150408で、この程度の試行回数では、点の個数=試行回数が増えてもπの近似値は収束しません。また、途中経過を辿ると、3.141までは一貫して得られているものの、それ以降の桁の値は真の値の3.14159‥を挟んで変動しています。

 今回のスクリプトは、中学生にも理解と納得が可能な手順で「円周率の値は2×2の正方形に内接する円の面積に等しく、その値は3.141~2程度」という内容を示せるものです。しかし、3.141~2という値の精度は、アレキサンドリアのプトレマイオス(下の画像:下参照)が2世紀前半に示した 377/120(≒3.1417)の水準に留まります。無闇に試行回数を増やすことなく、より正確な値を得る方法・工夫は無いものでしょうか?

 

実は「統計」も、ボクたちが最初に学んだ40年前とはずいぶん変わり‥

 投稿者:加藤 厚  投稿日:2017年11月26日(日)22時59分2秒 em1-115-197-234.pool.e-mobile.ne.jp
編集済
  ここ10年ほどは「仮説検定」に加えて「効果量」や「信頼区間」が重視されるようになってきています。

例えば『心理学研究』の「執筆・投稿の手びき」(2015年版)=下のlinkでも「仮説検定はデータ分析の一側面に限られ」るため「研究結果の重要性を評価できるよう効果量とその信頼区間も示す」(p.8) ことが求められたりしています‥その下のlinkは「『教育心理学研究』における p値と効果量による解釈の違い」(2015)。
https://www.psych.or.jp/publication/inst/tebiki20151019_fixed_compress.pdf
https://www.jstage.jst.go.jp/article/jjep/63/2/63_151/_pdf/-char/ja

その意味では SQPも「時代遅れ」なので、現在改訂中の 1.0.8では効果量のいくつか(Cohen's w, η^2, dD)を追加しました(‥年内には 差し替え@Vectorの予定)※。
※1.0.8 はここ↓で本体=sqp.htmのみ開示中(2011bのSQP★:右clickでDLも可)#。
http://hp.vector.co.jp/authors/VA021211/
#I.E.だと桁ズレが発生するので、Chromeなどでの起動がオススメ。

専門的なこと@学会誌はさておき、記述統計と推測統計の基本部分は「自分が実証的に考え、人に客観的≒説得的に伝える『道具』の1つ」として重要なので、「はやりすたり」とは別に自分なりにボチボチやっていきます。

連載中(?)の「ブラウザに計算をさせてみよう!」の最終(15)回でも触れる内容ですが、コンピュータとネットは「個人の能力を拡張することでその活動を支援する道具」、計算の次はクロス表&JavaScript関連、その次はRや Linux関連などであれこれ遊ぶ予定です。;-)
 

卒論ボランティアサポート

 投稿者:唐澤俊英  投稿日:2017年11月26日(日)17時28分0秒 mo220-210-0-45.air.mopera.net
  加藤厚 様

今、加藤君が作成したSQPを使ってデータ分析について学んでいます。

そして、いつもいつも相談にのってもらい感謝しています。

・・・

私は大学時代に統計をしっかり学びませんでした。

「そんな昔のことで困っているの?」「これまで何十年たっているの?」と言われることでしょう。


でも、やはり学ぶ時に学んでおかないと、なかなか難しい。

・・・・

リタイアして、これから何をしたいか! について考えました。

自分の実践活動(子どもや指導者対象の剣道指導、大学生や一般成人対象にした対人関係促進をする指導者養成=実技+調査による評価を含めて、etc.)を行うために調査・データ分析、文章を書く、といったことが必要です。

そこで、大学生の卒論ボランティアサポーターをしながら、いっしょにお勉強することにしました。

身体的にも活動できるのは、あと10年かな。


新宿の風景を見ながら、思いつくまま書いてみました。



 

ブラウザに計算をさせてみよう!: 12 その2 フーリエ級数@多倍長小数

 投稿者:加藤 厚  投稿日:2017年11月22日(水)08時00分8秒 em119-72-196-155.pool.e-mobile.ne.jp
編集済
   任意精度演算ライブラリのbig.js※を利用すると共に打切項数と表示間隔の入力を可能にしたスクリプトの一例です:
http://mmua.html.xdomain.jp/bak/
※今回のスクリプトの作動には↑上のURLのweb頁からダウンロードした圧縮ファイル(big.js-master.zip 約1.2MB)から展開したライブラリbig.js(MikeMcl, 2017 22KB)が同一フォルダ内に必要です(下の画像:上側参照)。
<form>
  打切項数<input type="text" size="8" value=20000000><br※>
  表示間隔<input type="text" size="8" value=1000000>
  <input type="button" value="実行" onClick="計算()"><br※>
  <textarea rows="20" cols="33"></textarea>
</form>
<script src="big.js"></script>
<script>
function 計算(){
  項数=document.forms[0].elements[0].value
  間隔=document.forms[0].elements[1].value
  項=0;和=Big(0);結果="" //bigは× Bigが○
  while(項<項数){
    項++;和=和.plus(1/項/項)
    if(項%間隔==0){
      結果=結果+項+": "+(和.times(6)).sqrt()+"\n"
      document.forms[0].elements[3].value=結果
    }
  }
}
</script>
※brは本来は半角(brでもBRでもOK)

 <form>の第1要素の値を項数に、第2要素の値を間隔に代入し、多倍長小数が必要な和にbig.jsの形式で初期値0を代入し、和に関連する処理をbig.jsの形式(加算なら和=和.plus(1/項/項)、積算と平方根なら(和.times(6)).sqrt())で指定します。また項が間隔の倍数になる毎に項とその時の円周率の近似値及び改行記号("\n")を出力用の結果に追記していきます。

 コピペしてフーリエ級数@多倍長小数.htmとして保存し、ブラウザにD&Dしたら、まずは項数の値を2000000、表示間隔の値を100000(それぞれの初期値の1/10)にして実行してみましょう。数秒程度で下の画像:下側のような結果が示されます。ただし、これは項数と間隔を初期値の10倍にした結果で、その完了には1/10にした場合の100倍の時間(10分程度)が掛かっています。

 多倍長小数演算によって1億項以降も漸近は続き、1億2千万項以降は四捨五入で3.14159265になる値が得られています。他方、この方法では処理に時間が掛かるのに加え「そもそもフーリエ級数でなぜπが求まるのかが不明」という本質的な未達成感が残ります。


 

ブラウザに計算をさせてみよう!: 11 円周率に挑戦!:その1 フーリエ級数@標準機能

 投稿者:加藤 厚  投稿日:2017年11月15日(水)08時00分1秒 em119-72-198-40.pool.e-mobile.ne.jp
編集済
   素因数分解、最大公約数といった小・中学校段階の算数・数学の概念を取り上げてスクリプトを紹介してきた本資料の締め括りとして、円周率に挑戦します。

 紀元前3世紀に円周率に数学的に取り組んだアルキメデスは、正六角形を用いた3 <π<2√3から始めて順に正12・24・48・96角形の場合を求め、3と10/71<π<3と1/7(3.1408‥<π<3.1428‥)という値を示しています(下の画像:上側)。
http://tsujimotter.hatenablog.com/entry/archimedes-circle

 分数を駆使したこの考え方はスクリプトによる再現向きではないので別の方法を探すと、フーリエ級数※というのがありました。
※1/(nの2乗)をn=1~∞まで足し上げた値(1/1+1/4+1/9+‥)は(円周率の2乗)/6

 単純な処理の繰り返しこそコンピュータの得意技、そこでこの級数を指定項数まで途中経過付で求めるスクリプトを書いてみます:
<script>
  項数=120000000;間隔=10000000;項=0;和=0
  while(項<項数){
    項++;和=和+1/項/項
    if(項%間隔==0)document.write(項+": "+Math.sqrt(和*6)+"<BR※>")
  }
</script>
※BRは本来は半角

 初期値0の変数:和に 1/(項の2乗)を項=1から指定項数まで足し上げ、項の値が変数:間隔の倍数になる毎に項とその時の円周率の近似値を画面表示して改行する、という内容です。コピペして(BRを半角のBRにした上で)フーリエ級数@標準機能.htmとして保存し、ブラウザにD&Dすると数秒で下の画像:下側の結果が示されることでしょう。

 円周率の値は3.14159265358979‥ですから、計算結果は9千万項までは真の値に近づいています。しかし、1億項を超えてからは同じ値が示され、06で言及した「標準機能で処理できる値」の制約により加算ができなくなっているようです。

 円周率の値は、日常的にはアルキメデスが2千年以上昔に確定した3.14で十分でしょうが、東アジアでは5世紀に南朝の天文学者祖沖之(そ ちゅうし)が355/113(=3.14159292‥)という近似値を示し、日本でも1681年に関孝和が3.14159265359微弱という値を得ています。21世紀の我々としては、ブラウザにもう一頑張りさせたいもの、そしてそれに必要なのは小数も扱える多倍長演算ライブラリです。


 

ブラウザに計算をさせてみよう!: 10 賢い「求め方」で効率を本質的に改善

 投稿者:加藤 厚  投稿日:2017年11月 8日(水)08時00分3秒 em117-55-68-190.emobile.ad.jp
編集済
   最大公約数については、紀元前から知られている「ユークリッドの互除法」※という有名な「求め方」(アルゴリズム)があります。
※広辞苑(第六版)にも以下のように載っています:
「自然数(または整式)の最大公約数を求める方法の一つ。aをbで割った余りをrとすると、aとbの最大公約数は、bとrの最大公約数に等しい。このことを利用して、次にbをrで割る、…と次々とこの手続きを行い、余りが0となった時の除数が最大公約数である。」

 09のスクリプトを互除法に基づくそれに改訂してみます。
<form>
  小さい数<input type="text" size="24" value=76543210>
  大きい数<input type="text" size="24" value=9876543210>
  <input type="button" value="実行" onClick="計算()">
  <textarea rows="2" cols="40"></textarea>
</form>
<script src="bigint.js"></script>
<script>
function 計算(){
  小=bigint(document.forms[0].elements[0].value)
  大=bigint(document.forms[0].elements[1].value)
  積=小.mul(大)
  while(大.mod(小)!=0){余=大.mod(小);大=小;小=余}
  結="最大公約数="+小+"\n" //"\n"は改行記号
  果="最小公倍数="+積.div(小)
  document.forms[0].elements[3].value=(結+果)
}
</script>
注:<form>の2行目と4行目の末尾には本来<BR>(←半角文字で)があるのですが、BBSでは半角の<BR>は「改行」として表示されてしまうので削除してあります。下の画像:上側と同じ表示にしたい場合は各行末に半角の<BR>を追加してください。

 変更点は、入力値を変数:小と変数:大に代入する、両値の積を変数:積に残す(→最小公倍数の計算に使用)、その上で(小、大、余の値が入れ替わる)互除法を行う、の3点です。

 コピペして互除法@多倍長整数.htmとして多倍長整数ライブラリbigint.jsのあるフォルダに保存したらブラウザにD&Dし、初期値の76543210と9876543210のまま[実行]をクリックしてみましょう。今度は、一瞬で下の画像:上側の結果が示されることでしょう。

 大きい数を小さい数で割り、その余りで今度は小さい数を割り‥という手続きで最大公約数が得られる理由を、377と299を例にした下の画像:下側で考えてみます。この場合、入れ替え3回目の小さい数65は余りの13で割り切れます(65/13=5)。65+13の78も13で、78x3+65の299も13で、そして299+65+13の377も13で割り切れます。つまり互除法とは、大きい数×小さい数の長方形に隙間なく敷き詰められる最大の正方形を「隅への追い込み」で求める手続きなのです。


 

ブラウザに計算をさせてみよう!: 09 桁数制限無しの最大公約数と最小公倍数@多倍長整数

 投稿者:加藤 厚  投稿日:2017年11月 1日(水)08時05分1秒 em119-72-199-11.pool.e-mobile.ne.jp
編集済
   04の素朴な考え方のスクリプトを、最大公約数と最小公倍数を桁数制限無しに求めるそれに改訂してみます。
<form>
  小さい数<input type="text" size="24" value=76543210>
  大きい数<input type="text" size="24" value=9876543210>
  <input type="button" value="実行" onClick="計算()">
  <textarea rows="2" cols="40"></textarea>
</form>
<script src="bigint.js"></script>
<script>
function 計算(){
  小さい数=bigint(document.forms[0].elements[0].value)
  大きい数=bigint(document.forms[0].elements[1].value)
  候補=小さい数
  while(小さい数.mod(候補)!=0||大きい数.mod(候補)!=0)候補--
  結="最大公約数="+候補+"\n" //\nは改行記号@script
  果="最小公倍数="+小さい数.mul(大きい数).div(候補)
  document.forms[0].elements[3].value=(結+果)
}
</script>
注:<form>の2行目と4行目の末尾には本来<BR>(←半角文字で)があるのですが、BBSでは半角の<BR>は「改行」として表示されてしまうので削除してあります。下の画像と同じ表示にしたい場合は各行末に半角の<BR>を追加してください。

 <form>の部分では、順に2つのテキスト欄が第1・第2、実行ボタンが第3、そして40文字×2行のテキストエリアが第4要素になります。ライブラリを組み込んだ後、bigint()として代入を行い、剰余を.mod()・積算を.mul()・除算を.div()の形式で指定し、改行="\n"を含む文字列の結と果を結合して第4要素のテキストエリアに代入=出力させます。

 コピペして最小公倍数など@多倍長整数.htmとして多倍長整数ライブラリbigint.jsのあるフォルダに保存したらブラウザにD&Dし、数値は初期値の76543210と9876543210のまま[実行]をクリックしてみましょう。計算終了まで時間がやや掛かります※が、やがて下の画像の結果が示されるハズです。
※「ページが応答しません」などのメッセージに対しては[待機]などで続行。

 小さい数・大きい数とも1の桁が0なので10で割り切れることは自明ですが、最大公約数も10しかないようです。また、最小公倍数の75598232099710410※は17桁(7京5598兆2310億‥)で、多倍長整数ライブラリの組み込みによって標準機能ではできない処理が正しく行われていることが示されています。
※75598232099710410=7654321×987654321×10

 ただし、「素朴な考え方」に基づくこのスクリプトでは、計算終了までにかなりの時間がかかります(環境にもよりますが1分程度?)。もっと効率のよい「求め方」は無いのでしょうか?
 

ブラウザに計算をさせてみよう!:08 桁数制限無しの素因数分解@多倍長整数

 投稿者:加藤 厚  投稿日:2017年10月25日(水)08時00分5秒 em119-72-199-11.pool.e-mobile.ne.jp
編集済
   今度は、03のスクリプトを桁数制限無しの素因数分解スクリプトに改訂してみます。
<form>
  数値<input type="text" size="32" value=9007199254740992>
  <input type="button" value="実行" onClick="分解()">
  <textarea rows="3" cols="45"></textarea>
</form>
<script src="bigint.js"></script>
<script>
function 分解(){
  被除数=bigint(document.forms[0].elements[0].value)
  結果=被除数+"="
  while(被除数!=1){
    除数=bigint(2)
    while(被除数.mod(除数)!=0){
      除数++;if(Math.sqrt(被除数)<除数)除数=被除数
    }
  結果=結果+除数+"x";被除数=被除数.div(除数)
  }
document.forms[0].elements[2].value=結果.slice(0,結果.length-1)
}
</script>
注:<form>の3行目の末尾は本来、onClick="分解()"><BR>(←半角文字で)なのですが、BBSでは半角の<BR>は「改行」として表示されてしまうので削除してあります。下の画像と同じ表示にしたい場合は行末に半角の<BR>を追加してください。

 <form>の部分では(素数判定ではないので)「候補」を「数値」とし、(出力が長くなる場合を想定して)第3要素を1行のtextから複数行のtextareaに変更します(rows="3" cols="45"は3行45文字)。

 ライブラリの組み込みは07と同様です。ボタンのクリックで実行されるfunction 分解の部分では、代入をbigint()として行い、剰余を.mod()・除算を.div()の形式で記述し、出力をformの3つ目の要素のelements[2]のvalueとして行うように書き換えました。

 コピペして素因数分解@多倍長整数.htmとして多倍長整数ライブラリbigint.jsのあるフォルダに保存したらブラウザにD&Dし、数値は初期値の9007199254740992のまま[実行]をクリックしてみましょう。9007199254740992=2x2x(中略)x2と最初の2に続いて52回のx2が出力されます(JavaScriptの標準機能の上限)。続いて、候補の末尾に0を追加して[実行]をクリックしてみましょう。下の画像の結果が示されるハズです。初期値を10=2x5倍した結果が2の54乗x5と示され、標準機能ではできない処理が多倍長整数ライブラリの組み込みによって正しく行われています。


 

ブラウザに計算をさせてみよう!:07 多倍長整数ライブラリで桁数制限無しの素数判定

 投稿者:加藤 厚  投稿日:2017年10月18日(水)09時50分2秒 em119-72-199-11.pool.e-mobile.ne.jp
編集済
   2の53乗≒九千兆は日常感覚では「無制限」に近いのですが、暗号関連の目的などには不足なため、より大きい数を扱える様々な拡張機能(=多倍長演算ライブラリ)が作成・公開されています※。
※GoogleなどでJavaScript用多倍長演算ライブラリを検索してみましょう。

 ここでは、上限値の制約の本質的改善を目的として、多倍長整数ライブラリであるbigint.jsを利用するスクリプトを作成します※。
http://mmua.html.xdomain.jp/bak/
※今回のスクリプトの作動には↑上のURLのweb頁からダウンロードした圧縮ファイル(js-math-bigint-master.zip 約6KB)から展開したライブラリbigint.js(Dan Kogai, 2014)が同一フォルダ内に必要です(下の画像:上側参照)。
<form>候補
  <input type="text" size="32" value=100160063>
  <input type="button" value="実行" onClick="判定()">
  <input type="text" size="44">
</form>
<script src="bigint.js"></script>
<script>  //<form>中の
=breakは改行記号@web頁
function 判定(){
  被除数=bigint(document.forms[0].elements[0].value);除数=bigint(2)
  while(被除数.mod(除数)!=0){
    除数++;if(Math.sqrt(被除数)<除数)除数=被除数
  }
  結果=被除数+"="+除数+"x"+(被除数.div(除数))
  document.forms[0].elements[2].value=結果
}
</script>
注:<form>の3行目の末尾は本来、onClick="判定()"><BR>(←半角文字で)なのですが、BBSでは半角の<BR>は「改行」として表示されてしまうので削除してあります。下の画像:下側と同じ表示にしたい場合は行末に半角の<BR>を追加してください。

 前回のスクリプト(値確認付素数判定.htm)との機能上の相違は①ライブラリbigint.jsの組み込み(</form>の次の行)、②被除数と除数のbigint(値)形式での代入、③剰余の被除数.mod(除数)形式・除算の被除数.div(除数)形式での指定※の3点です(不要なif()alert()行は削除)。
※bigint用には値をx=bigint()、y=bigint()の形式で代入の上、+はx.add(y)、-はx.sub(y)、*はx.mul(y)、/はx.div(y)、%(剰余)はx.mod(y)と指定。

 コピペして素数判定@多倍長整数.htmとして保存したらブラウザにD&Dし、候補に9007199254740995を入力の上実行ボタンをクリックしてみましょう。今度は(前回06の結果とは異なり)下の画像:下側に示した正しい結果「5で割り切れる=素数ではない」が表示されるハズです(1の桁が5の整数は当然5で割り切れます)。


 

ブラウザに計算をさせてみよう!:06 本質的な改善とあまり意味のない「改善」

 投稿者:加藤 厚  投稿日:2017年10月12日(木)11時49分59秒 em1-115-198-84.pool.e-mobile.ne.jp
   05のスクリプトの初期値100160063の素数判定は一瞬(1秒未満)で終わることでしょう。では、1の桁の3を9(=100160069)にして実行ボタンをクリックしてみてください。環境にもよりますが、出力欄に100160069=100160069x1(つまり素数)と出力されるまで若干(十秒程度)の時間が掛かることでしょう。そして、素数の場合の処理時間は桁が1増すごとに10倍ずつ増えてゆきます(4桁増えたら約一万倍)!

 これまでのスクリプトの「割り切れないなら除数=被除数になるまで除数+1」という素朴な手順は(実は)大きな無駄を含んでいます。100を例にするとその約数は順に2,4,5,10,20,25,50、そして各約数は2x50,4x25,5x20のように10=√100の上下で対を成します。この性質を踏まえれば、nの約数の検討は√nまでで十分、そこまでに約数がなければその先にも約数はありえずnは素数なのです。

 そこで、05のスクリプトのwhile(被除数%除数!=0)除数++の1行を以下の3行に書き換えます({から}までが一組の指示)。
  while(被除数%除数!=0){
    除数++;if(Math.sqrt(被除数)<除数)除数=被除数
  }
 つまり、除数の値が被除数の平方根を超えたら(それ以上の値は無視して)被除数を除数に代入、被除数%除数==0なのでwhile終了です。

 書き換えた内容を素数判定改.htmというファイル名で保存したらブラウザにD&Dし、初期値を100160069に変えて実行ボタンをクリックしてみましょう。100160069=100160069x1という結果が、今度は一瞬(1秒未満)で表示されるハズです。

 また、JavaScriptには標準機能で処理できる値は9007199254740992(2の53乗)までという制約があります。そこで不適切な入力値に対しその旨表示する機能を追加したのが以下のスクリプトです:
<form>
  候補<input type="text" size="16" value="9007199254740995">
  <input type="button" value="実行" onClick="判定()">
  <input type="text" size="36">
</form>
<script>
function 判定(){
  被除数=document.forms[0].elements[0].value;除数=2
  if(被除数<2||9007199254740992<被除数)alert("値が不適切!")
  while(被除数%除数!=0){
    除数++;if(Math.sqrt(被除数)<除数)除数=被除数
  }
  結果=被除数+"="+除数+"x"+(被除数/除数)
  document.forms[0].elements[2].value=結果
}
</script>

 2未満(素数は2から)や上限を超える値には注意を表示した上で処理しますが、下図の通り結果は誤りで「有意味な改善」とは言えません。

 

ブラウザに計算をさせてみよう!:05 用紙(form)を使って値を入力

 投稿者:加藤 厚  投稿日:2017年10月 9日(月)12時00分1秒 em1-115-195-36.pool.e-mobile.ne.jp
   これまでのスクリプトでは、処理する値(例:被除数、小さい数)の変更には.htmファイルの書き換えが必要でした。様々な値の処理を連続して行うにはこれでは不便、「欄に入力した値をボタンのクリックで処理」という使い勝手の方がずっと便利です。

 そのために必要な入力欄と実行ボタン、ついでに出力欄を追加した素数判定の手順の一例が以下のスクリプトです:
<form>
  候補<input type="text" size="12" value="100160063">
  <input type="button" value="実行" onClick="判定()">
  <input type="text" size="30">
</form>
<script>
function 判定(){
  被除数=document.forms[0].elements[0].value;除数=2
  while(被除数%除数!=0)除数++
  結果=被除数+"="+除数+"x"+(被除数/除数)
  document.forms[0].elements[2].value=結果
}
</script>

 コピペして入力値の素数判定.htmというファイル名で保存したらブラウザにD&Dし、実行ボタンをクリックしてみましょう。下の画像の結果が表示されるハズです。

 <form>から</form>までの5行で、ブラウザの起動画面に示される文字列、1行入力欄、ボタン、出力欄を指示しています(form=用紙)。

 type="text"で一行欄(inputとありますが入出力「両用」)を、type="button"でボタンを用紙に設定します。sizeは(半角の文字数で)欄の長さの指定、valueはtextでは初期値、buttonではボタンの名前の指定で、onClickでボタンがクリックされた時に何をするか(今回はfunction 判定()の実行)を指定します。

 <script></script>ではfunction(関数・機能)が1つ指定され、その処理の内容は(被除数の指定及び結果の出力の部分を除いて)01・02の素数判定.htmと同一です。被除数に代入される値と結果を代入=出力する場所で使われているdocument(中略)valueという長々しい表現はdocument(=ブラウザ画面)のforms[0](=最初のform)のelements[n](=n番目の要素)のvalue(値)という指定で、具体的には被除数には用紙の最初(n=0)の要素である一行欄の値(初期値のままなら100160063)が代入され、また結果は3番目(n=2)の要素である一行欄に代入=出力されます(JavaScriptでは順番は0から数え始めます。ちなみに、2番目(n=1)の要素はボタン)。

 つまり、このスクリプトでは、計算処理を1つの関数とし、用紙の入力欄に指定された値をその関数で処理して結果を用紙の出力欄に代入する、という流れで仕事が指示されています。

 

ブラウザに計算をさせてみよう!:04 素朴に求める最大公約数と最小公倍数

 投稿者:加藤 厚  投稿日:2017年10月 5日(木)10時55分2秒 em1-115-196-172.pool.e-mobile.ne.jp
   小学校で、連除法(すだれ算、はしご算‥)などで求めたことを思い出す人も多いことでしょう。実際的な意味まで説明してくれる先生は少ないかもしれませんが、整数aとbの最大公約数・最小公倍数は例えば以下の現実場面に該当します:最大公約数は「a×bcmの長方形の壁に隙間無く敷き詰められる最大の正方形タイルの一辺の長さ」、最小公倍数は「a×bcmの長方形タイルを同じ向きに隙間無く敷き詰めて作れる最小の正方形の一辺の長さ」。(下の画像:上側参照)

 最大公約数は整数aとbの両者を割り切れる最大の整数ですから、素朴に考えれば01・02の素数判定のスクリプトの条件を「aもbも割り切れる値まで小さい方の値-1を繰り返す」にするだけです。また、2つの整数の最小公倍数は、試し割を繰り返さなくても「aとbの最小公倍数=a×b/最大公約数」で求められます。

 以下のスクリプトはその手順の一例です:
<script>
  小さい数=45;大きい数=54;候補=小さい数
  document.write(小さい数+"と"+大きい数+":")
  while(小さい数%候補!=0||大きい数%候補!=0)候補--
  document.write("最大公約数="+候補+" ")
  document.write("最小公倍数="+小さい数*大きい数/候補)
</script>

 コピペして最大公約数など.htmというファイル名で保存したらブラウザにD&Dしてみましょう。下の画像:下側の結果が表示されるハズです。

 今回の手順では、まず「小さい数」の値を「候補」に代入し、その値が小さい数と大きい数を共に割り切れるまで候補の値-1を繰り返しています。新しい指示の表現は1つ(||)のみで、その意味は「あるいは=or=論理和」つまり2つの剰余のいずれかが0でない間(=2つとも0になるまで)」という条件指定です。

 具体値で辿っていくと、まず候補=45で小さい数(=45)は割り切れますが大きい数(=54)は割り切れないので候補--で44、これでは両数とも割り切れないので43、(中略)9で初めて両数とも割り切れるので文字列"最大公約数="+9+" "と"最小公倍数="+270を画面表示※。
※45x54/9=270(補足の②も参照:45=9x5、54=9x6。最小公倍数=最大公約数(共通要素の3x3)×独自要素(5x6)=9x30=270)


補足4:「あるいは」と「かつ」など

①あるいは=or=論理和は||、かつ=and=論理積は&&。

②連除法  3) 45 54
      ─────
      3) 15 18    最大公約数=3x3=9
      ─────
        5  6    最小公倍数=3x3x5x6=270


 

ブラウザに計算をさせてみよう!:03 素数判定を繰り返せば素因数分解

 投稿者:加藤 厚  投稿日:2017年10月 2日(月)09時25分2秒 em119-72-199-63.pool.e-mobile.ne.jp
   01・02の手順で可能なのは素数か合成数かの判定でした。剰余が最初に0になった時点の除数は確かに「被除数の素因数」の1つです。しかし、その時点の商が合成数(素数の積)なら素因数分解としてはまだ途上、商が素数になって初めて完了です。従って、ブラウザに素因数分解をさせるには、被除数を割り切る除数を順に求めて記録しつつ、その商を次の被除数にして商が素数になるまで素数判定を繰り返す「手順」の指示が必要です。

 以下のスクリプトはその手順の一例です:
<script>
  被除数=223092870;結果=被除数+"="
  while(被除数!=1){
    除数=2
    while(被除数%除数!=0)除数++  //{}は無くてもOK
    結果=結果+除数+"x";被除数=被除数/除数
  }
  document.write(結果.slice(0,結果.length-1))  //補足の③参照
</script>

 <script>から</script>までの9行をコピーしてメモ帳などに貼り付け、素因数分解.htmとして保存したらそれをブラウザにD&Dしてみましょう。下の画像のような結果が表示されるハズです。

 今回の手順では、まず被除数と共に結果という変数を設定しています。これは素因数分解の過程を「被除数=除数x除数x除数x‥」という文字列として記録するためのものです。

 次行のwhileの{から4行下の}までの一組の指示によって、被除数が1になるまで以下の手順を繰り返させています:
「剰余が0になる(=割り切れる)まで除数を2から1ずつ増やす」→「割り切れた時の除数と"x"を結果に追加し、商(=被除数/除数)を次の被除数に代入する」

 商が素数になるとその次の商は1(02の例を参照)、従って被除数==1となるためwhileの条件は満たされず、その時点の結果の文字列から末尾の一文字(=過剰な"x")を削除した部分がブラウザに表示されます(結果.slice(0,結果.length-1)=結果の文字列の最初(0)~長さ-1文字まで)※。
※「元値=被除数として除数=2;if(元値!=被除数)結果=結果+"x"」が別案。

 1234321、123454321、12345654321などの適当な数を被除数にして素因数分解し、結果を電卓などで確認してみましょう。


補足3:文字列関連の指示など

①引用符("")で括った数字、文字、記号は文字列として扱われます。
②内容が数値の変数に文字列(例:"="、"x")を結合すると全体が文字列になります(123+"456"→"123456" vs. 123+456→579)。
③○.slice(開始位置,終了位置)で○の内容の一部を抜き出します(○.lengthが○の内容の長さなので、その値-1で最後の1文字が削除されます)。


 

ブラウザに計算をさせてみよう!:02 基本は「基準達成まで処理を反復」

 投稿者:加藤 厚  投稿日:2017年 9月28日(木)18時32分37秒 em119-72-196-142.pool.e-mobile.ne.jp
   01でブラウザに与えた以下の5行の指示はどんな「手順」だったのでしょうか?
<script>
  被除数=100160063;除数=2
  while(被除数%除数!=0)除数++
  document.write(被除数+"="+除数+"x"+(被除数/除数))
</script>

 最初の<script>と最後の</script>は「手順」の始まりと終わりの決り文句です(script=台本・脚本)。

 まず、被除数=100160063と除数=2で変数「被除数」と「除数」への値の代入を指示します(;は指示の区切り)。

 次のwhile(被除数%除数!=0)除数++は「()内の条件が成り立つ間()に続く処理を繰り返しなさい(=不成立なら処理はせず次の指示へ)」という指示です(while=~の間)。条件内の%は剰余(割算の余り)、!=は≠なので、被除数%除数!=0 は「被除数÷除数の余りが0でない間」(=割り切れるまで)、()に続く処理である除数++は「除数の値を1ずつ増やしなさい」という指示です。

 そしてdocument.write()は()内をブラウザの画面に表示しなさいという指示です(数値に+"="※などすると全体が文字列になります)。
※文字である等号("=")を数値の後ろに付ける(+)。

 具体値で辿っていくと、被除数に対し除数2では余り≠0 なので+1して3、3でも余り≠0なので4(中略)、除数10007で初めて余り=0になるので次行に進み、被除数、除数と被除数/除数の3値を文字の"="と"x"とで結合した100160063=10007x10009が画面表示されます。

 ここで、被除数に素数を指定(例:被除数=10007)して適切なファイル名(例:被除数=10007.htm)で保存の上ブラウザにD&Dしてみましょう。被除数が素数なら除数++を繰り返しても剰余≠0が続き、除数=被除数になって初めて商=1で割り切れるため、ブラウザには10007=10007x1 と表示されます(下の画像参照)。この結果は、被除数が(1とその数以外に約数を持たない)素数であることを示しています。


補足2:数値関連の指示及び本資料でのscriptの書き方※など

 ①=は(「等しい」ではなく)代入です。従って、例えば除数=除数+1という表現もOKです(意味は除数++と同じく「値を1 増やす」)。
 ②「等しくない」が!=であるのに対し、「等しい」は==です。
 ③加減乗除(+-*/)に加えて、剰余(%)が使えます。
※本資料では、「正式」な書き方に拘らず、無くても大丈夫な表現は省略しています(例:行末の;)。また「手順」は効率よりも単純さ≒理解し易さを重視します(例:除数++を被除数の平方根で打ち切らない)。


 

ブラウザに計算をさせてみよう!:01 手順の指示はスクリプトで

 投稿者:加藤 厚  投稿日:2017年 9月25日(月)14時15分0秒 em119-72-199-112.pool.e-mobile.ne.jp
   ネット検索やブログ閲読などで日常的に使っているブラウザは「手順」さえ指示してやれば高速&高機能な計算機としても使えます。

 例えば、ある数が素数(=1とその数以外に約数を持たない正の整数)かどうかを調べたいとします。63なら63=3x21なので「素数ではない(=合成数)」と簡単に判断できますが、100160063だったらどうでしょう。奇数なので2では割り切れない、各桁の値の和が17なので3でも割り切れない、下二桁=63が4の倍数ではないので4でも割り切れない‥という具合で暗算では判断困難、電卓で÷6、÷7‥と試みても割り切れる値にはなかなか辿りつきません。

 100160063は10007で割り切れるので、素数ではなく合成数です。でも、割算を延々と繰り返すような作業は面倒なので自分ではしたくありません。そこで以下のように「手順」を書き並べ、そのファイルをブラウザにdrag & drop(以下、D&D)すると、今回の処理=数万回程度の試し割りなら1秒以内で実行してくれます。
<script>
  被除数=100160063;除数=2
  while(被除数%除数!=0)除数++
  document.write(被除数+"="+除数+"x"+(被除数/除数))
</script>

 <script>から</script>までの5行をコピーしてメモ帳などに貼り付け、スクリプトの一例.htm※というファイル名で保存したらそれをブラウザにD&Dしてみましょう。下の画像の結果が表示されるハズです。
※.txtではなく.htmとして保存(文字コードはUTF-8がオススメです)。

 変数名に漢字(例:被除数、除数)が使えて用語も簡単な英語(例:script、while、document、write‥)、エディタ(メモ帳など)で書けて身近なブラウザで動く(従ってOS不問)といった点で、この「手順」の書き方(JavaScriptといいます)は近頃話題のプログラミングをかじるにも最適な言語の1つと考えます※。
※ただし、小学校などでの利用が想定されているScratchや文科省提供の「プログラミン」とは異なり、JavaScriptは(見ての通りの)テキスト言語です。

 それでは、これから素因数分解、最大公約数と最小公倍数、円周率といった懐かしい(?)計算を例にしながらJavaScriptの書き方を順を追って紹介していきます。


補足1:I.E.におけるスクリプトの「実行制限」の回避方法

 Windows 8.1まで標準ブラウザだったInternet Explorerは、スクリプトのhtmファイルをD&Dしても「このWebページは‥」という実行制限メッセージを表示し、許可ボタンをクリックするまで実行しません。
 毎回のクリックが面倒なら以下の1行を<script>の上に追加しましょう。
<!-- saved from url=(0008)about:internet -->


 

3月からの連載(?)内容に若干の加筆を行って‥

 投稿者:加藤 厚  投稿日:2017年 4月25日(火)17時43分35秒 em119-72-195-45.pool.e-mobile.ne.jp
  「簡単に楽しむ電子書籍」を冊子↓※にまとめました。
http://mmua.html.xdomain.jp/kato/pdf/kantan_e-book.pdf
※kantan_e-book.pdf(2.96MB)

リンクのクリックで pdfを開き、PCなどに保存※の上、全画面見開き閲読#してもらえたら幸いです。
※方法はブラウザによって異なります(IE・FFならフロッピーの、Chromeならダウンロードのアイコン)。
# Kinoppy, SumatraPDFなどで‥
 

簡単に楽しむ電子書籍:15 画像を圧縮した書庫ファイルの閲読: ZipPla

 投稿者:加藤 厚  投稿日:2017年 4月21日(金)10時20分2秒 em1-115-197-27.pool.e-mobile.ne.jp
   「画像化した頁を圧縮した書庫ファイル」を閲読するポータブルツールとしてはZipPlaがオススメです。
https://sites.google.com/site/riostoolbox/
http://www.vector.co.jp/soft/winnt/art/se513079.html

 ZipPlaはRio's Toolboxさん作成のWindows用書庫リーダーで、DLしたZipPla_x.x.x.x.zip(今回は1.6.3.8で2MB強)をWクリックしてUSBメモリなどに展開します。

 [送る]の選択肢にZipPla.exeを登録してzipファイルを開き[F11]キーを押すと、全画面見開き表示に切り替わります(左綴じ/右綴じの切り替えは[L]/[R]キー、次/前頁は[→]/[←]など)。

 このツールの最大の長所は[Z]キーによる見開き⇔拡大の表示切り替えです。見開きで全体の様子を把握し、「ここを拡大したい」という所で[Z]キーを押してみましょう。見開き表示を維持したまま、下図の例なら右側の図9の細かい内容が明瞭に読める表示が得られます※。
※拡大表示での画像移動はポインタの移動(スライド)で。

 ZipPlaはrarを含む多数の圧縮形式に対応しているので、zip以外の書庫ファイルもとまどうことなく楽しめます。

 さて、今回の紹介は以上です。内容がWindows用の無料ポータブルツール中心だったのは、それが筆者の活動と関心の領域であり、より確実な情報提供ができると思われたからです。その偏りを意識しつつ、この領域について、また他の領域について、一層詳しい皆さんからの補足・補完を期待してこの連載(?)の結びとします。
 

簡単に楽しむ電子書籍:14 PDFの画像化と圧縮: PDF-XChange Viewer Portable

 投稿者:加藤 厚  投稿日:2017年 4月18日(火)14時45分0秒 em119-72-199-81.pool.e-mobile.ne.jp
   PDFの「レイアウトの再現」という長所(09参照)を最大限追求したいなら「画像化」も選択肢の1つになりえます。

 他方、画像化するとテキスト(文字)情報が失われるため、語句の検索やlink(=URL)からのネットアクセスはできなくなり、またファイルサイズもPDFより大きくなってしまいます。

 このように、PDFファイルの画像化は短所が多いため、それを自ら行う必要性は少ないことでしょう。しかし、画像を圧縮した書庫ファイルは、実際には多数存在します。従って、その仕組みと閲読方法に関する知識・技能の紹介には一定の価値がありそうです。

 PDFの作品を画像化するポータブルツールとしてはPDF-XChange Viewer Portable(Windows XP以降で作動)がオススメです。
http://portableapps.com/apps/office/pdf-xchange-portable

 Tracker Software Productsという会社の製品(多機能PDF viewer)の機能限定無料版のポータブル版で、DLしたPDF-XChangeViewer-Portable_x.x.x.x.paf.exe(今回は2.5.318.1で8MB弱)をWクリックして 100MB程度以上の空き容量のあるUSBメモリなどに展開します※。
※「インストール」の実態が「展開」なのは10のLibreOffice Portableと同様。

 12の後半で紹介した方法で[送る]の選択肢にPDF-XChangeViewer-Portable.exeを登録してPDFファイルを送り、下図のように[イメージへエクスポート]を選択して①イメージの種類(例:JPEG/PNG)、②保存先のフォルダ(例:デスクトップのtest)、③ファイル名(例:<Page Number>)を指定して[エクスポート]をクリックすると、各頁の画像が連番をファイル名として②のフォルダに保存されます。

 全頁の正しい画像化を確認したら、②のフォルダを右クリックして[送る]から[圧縮(zip形式)フォルダー]を選択すれば、フォルダ名.zipの圧縮ファイルがデスクトップに作成されます。
 

レンタル掲示板
/2