goo blog サービス終了のお知らせ 

にわか庭師びより in 東京 II

子育ては終盤です。今は好きなことを好きな時につづります。

ディモルフォセカとオスティオスペルマム(本編)

2007年03月22日 23時20分00秒 | にわか庭師のガーデニング
オスティオスペルマムディモルフォセカ
以前に、この2つの花について記事を書くと約束しました。それから、随分と長い時間が経ってしまいました。それというのも、妻のゴトが「どうしても私が記事を書きたい」と言っていたので、その申し出を入れて、待っていたのです。

ところが、ゴトときたら、あーでもないこーでもない、四の五の言って、ちっとも書こうとしません。いくらなんでも待つのも限界なので、やっぱり私が書いてしまいます

さて、上の2枚の写真、どちらがディモルフォセカでどちらがオスティオスペルマムかわかりますか? 答えはマウスポインタを写真の上に持っていけばわかります。そっくりで区別がつかないですよね。。。

このそっくりの2つの花、実は大きな相違点があります。ディモルフォセカは一年草、オスティオスペルマムは多年草なのです。

ディモルフォセカは夏を越せず、枯れてしまいます。花から種をとっておき、それを秋に蒔いて春の開花を待ちます。

一方、オスティオスペルマムは、花が終わった6月頃に、少し大きめの鉢に植え替えます。水はけの良い土を使うのが良いようです。また、種がとれにくいので、さし芽で増やします。

この2つの花は、下の写真のように夜になると閉じてしまいます。なかなかカワイイですね
夜のオスティオスペルマム夜のディモルフォセカ

にほんブログ村 花ブログ 庭・花壇づくりへ ←あなたのクリックが励みになります!

エラトステネスの篩

2007年03月22日 00時01分00秒 | にわか庭師の戯言
妻が、料理用の篩(ふるい)が欲しいと言うので、インターネットで検索してみました。すると、素数判定アルゴリズムエラトステネスの篩」というページが目に飛び込んできました。

ソフトウェア開発技術者受験時に、ソートや探索など、様々な古典的アルゴリズムを勉強しましたが、エラトステネスの篩というのは、恥ずかしいことに聞いたことがありませんでした。なんでも、ヘレニズム時代(紀元前200年頃)のギリシア人学者であるエラトステネスが考案したもので、要約すると、以下のようなものらしいです。

与えられた数(n)までの素数を見つける~エラトステネスの篩
① 2からnまでの数値をリストアップする。
② pに2を代入
③ pより大きく、n以下のpの倍数をリストから間引く(つまり、pは間引かない)
④ ③で間引かれなかった数値のうち、pの次に小さい数を、新たなpとする
⑤ pの2乗がn以下の場合、③に戻る
⑥ ここまでで間引かれなかった数が、n以下の素数すべてである

 
ほほぅ、これは面白そう にわか庭師は技術屋魂をくすぐられてしまいました。。。では、EXCELのVBA(マクロ)でプログラミングしてみますか。。。

 
Sub Eratosthenes()

  '概要:ユーザから入力された数値以下の素数を求め、A列に表示する
  '作者:つんつん

  '''計算用の変数宣言
  Dim flg() As Boolean  '素数かどうかを格納する
              '素数ではないと判明するとTrueになる
  Dim n As Long  'ユーザが入力した数値を格納
  Dim p As Long  '未検証の最小の数値を格納
  Dim q As Long  'pの倍数(素数でない、除去すべき数)を格納
    
  
  '''表示用の変数宣言
  Dim r As Long  '素数出力用添字
  Dim s As Long  '行用添字
  
  
  '''初期処理 sheetのクリア
  Cells.Select
  Selection.ClearContents
  Range("A1").Select
  
  
  '''調べる数値を受け取る
  n = CLng(InputBox("入力した数以下の素数をすべて出力します。" _
        & "数を入力してください。"))
  
  
  '''2より小さい素数は存在しないので、終了
  If n < 2 Then
    MsgBox "該当する素数は存在しません。"
    Exit Sub
  End If
  
  
  '''エラトステネスの篩 本処理
  p = 2
  ReDim flg(n)  '素数かどうかのフラグ用の配列の大きさ確定
          '初期値は False
    
  Do Until p * p > n '探索終了条件  入力値よりも
            '未検証数値の平方が大きくなると終了
    If flg(p) = False Then 'フラグがFalseなら
      q = p * p      'その倍数を篩にかける
      Do Until q > n 'その数の倍数>入力値 になるまで
        flg(q) = True  '素数ではないと判定
        q = q + p  '倍率を上げる
      Loop
    End If
    p = p + 1  '次の検証値へ
  Loop
  
  
  '''セルへの表示処理
  s = 1 '表示行の初期化
  For r = 2 To n '配列を巡回する
    If flg(r) = False Then 'フラグがFalse なら素数
      Range("A" & s).Select  'A列に書き出し
      ActiveCell.FormulaR1C1 = r
      s = s + 1  '次の行へ
    End If
  Next r
  
  '''終了メッセージ
  MsgBox "A列に " & n & "以下の素数を表示しました。"
  
End Sub

 
これ、ちゃんと動きますよ
遊び方は以下のとおりです。

①EXCELを起動して、ツール→マクロ→Visual Basic Editor を選択
②左側のThisWorkBookをダブルクリックして、白い入力画面を表示させる
③Sub Eratosthenes() から End Sub までをコピーして②の画面に貼り付け
④EXCELのSheetに戻って、ツール→マクロ→マクロの実行
⑤ThisWorkbook.Eratosthenes を選択して実行ボタンをクリック
⑥数値をきいてくるので、そこに任意の数値を入力
⑦⑥で入力された数値以下の素数をA列にひたすら表示

 
…で、何が面白いって? 単なる自己満足です。ただ、情報処理の勉強してる人は、知ってて損はないかもしれませんよ

にほんブログ村 資格ブログ スキルアップへ ←クリックしてみてください!