Hatena::ブログ(Diary)

もうカツ丼でいいよな このページをアンテナに追加 RSSフィード Twitter

2009 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 04 | 05 | 06 | 07 | 08 | 09 | 12 |
2012 | 02 | 03 | 04 | 05 | 06 | 10 | 11 | 12 |
2013 | 01 | 02 | 04 | 06 |
2014 | 06 |

2012-10-14

[][] 風邪にかからないために、あるいはかかったときにすべきこと、すべきでないこと 20:39  風邪にかからないために、あるいはかかったときにすべきこと、すべきでないことを含むブックマーク  風邪にかからないために、あるいはかかったときにすべきこと、すべきでないことのブックマークコメント

以下はジェニファー・アッカーマン著『かぜの科学』の内容のうち、感染とそれに対する対策の部分を中心に要約したものである。詳細は書籍の方を確認のこと。根拠となった研究のリストも書籍に記されている。

「風邪」について

風邪の原因の15%もがインフルエンザウイルスによるものというのは驚きである。風邪っぽい時にその都度インフルエンザの検査を受けてみると、色々面白いことになるのだろうなと考えずにはいられない。

風邪に対する感受性を減らすために

睡眠時間7時間、ちゃんと眠れた時間の割合92%というのはかなり厳しい基準のように思えるがどうだろうか。

  • 十分な睡眠
    • 睡眠時間が7時間未満の時、風邪をひく確率は3倍に跳ね上がる。
    • 就寝時間のうち、正味の睡眠時間が92%以下の人(=熟睡できない人)では罹患率は5倍にもなる。
  • 禁煙
    • 罹患率の上昇だけでなく、症状の重篤化も招く。
  • ほどほどの運動
    • 1日30分の運動をする人はしない人よりも風邪をひく回数が23%低い。秋に限って言えばこの値は30%になる。
    • 1週間に30km以上走る訓練を行うマラソンランナーは、1週間に10km程度ランニングをする人に比べて2倍の罹患率であり、運動のしすぎも良くない。
  • 控えめな飲酒
  • 休暇をとるか、もしくはとらない
    • 休暇は人によってはストレスである。そのようなタイプの人は休暇によってかえって病気になるリスクが上がる。
  • 人間関係の和を広げる
    • 対人関係の種類(人数ではなく、社会的な役割による種類の数)が1〜3種類の人は、6種以上の対人関係を持つ人よりも4倍風邪をひく。
    • 対人関係の種類が多い人は、粘液料が少なく、罹患時のウイルスの飛散量も少ない。

風邪に感染する機会を減らすために

風邪引いたら休めというのはその通り。休みたい時に休んでもそれほど責められない環境は欲しいものである。

  • 風邪をひいた人、そして子どもを避けること
  • 手を頻繁に、入念に洗うこと
    • 家に入る度に、人と手が触れるような活動の後には必ず手を洗う。
    • 握手の代わりにお辞儀をするのは「卓越した感染予防戦略(ハーリー・ロットバート)」である。
    • アルコールによる消毒はインフルエンザウイルスには有効であるが、ライノウイルスは外皮に脂質を含有しないためそれほど有効ではない。ウイルスは1個の粒子でも感染を引き起こせるため、全滅させなければ意味が無く、効果は短時間である。手の表面全てにまんべんなく刷り込むことが条件である。
  • 顔に手をやらない
    • 接触伝染が風邪の伝染に大きな役割を果たしているとする研究がある。ライノウイルスに汚染されたコーヒーカップのもち手などに手を触れた人の半数が風邪をひく。
    • 私たちの大半は5分に1から3回顔に手をやる。相当意識しないとこれを徹底するのは難しい。
  • 家族の誰かが風邪を引いたら、場所を絞り込んで物体表面をきれいにする
    • ドアノブ、トイレの水洗コック、レンジの「スタート」ボタンetc...
  • くしゃみの仕方に注意する
    • 咳やくしゃみはティッシュの中にして捨てるか、顔を袖にあててする
  • 病気のときは家にいる
    • 病気の時に出勤してしまう疾病就業(プレゼンティーイズム)によるアメリカ経済の損失は年間1500億ドルにもなる。そのうち、風邪その他の呼吸器系感染症は20%以上を占める。
    • 雇用者は病気の時は欠勤するよう徹底して教育すること。病欠で本人が不利とならない環境を作り、本人の裁量で自由にとれる有給休暇を与えること。
  • マスクは効果がない
    • マスクは風邪に対しては全く効果がない。しかし、新型インフルエンザには効果があると見られている。1日24時間、3ヶ月間の着用をするという条件つきで。

諸症状への対処

結局、風邪の症状を部分的に緩和したり風邪の期間をわずかに短縮したりする方法はあるにはあるが、愛情のこもった看病に勝る劇的なものはないということだ。というよりも、看病の効果が劇的というべきだろうか。抗生物質の処方を受けている人間は自分の周囲でも多い。わざわざ医者に行ったのに何の処方もせずにもどってきてしまうのは…という考えもあるのかもしれない。「単なる休み」に対してあまり寛容ではない職場は多いのではないだろうか。病院という場所もかなり危険であるのだから、1週間程度は様子を見て家で安静にするというのが正しい対処のように思える。

  • 喉の痛み
    • 250ccのぬるま湯にティースプーン1/2の塩を溶かしたぬるま湯でうがいをする。腫れた部分の水分が浸透圧で流れ出て一時的に痛みを押さえる。
    • のど飴も有効である。
  • 頭痛、倦怠感、微熱
  • 鼻づまり
    • 「鼻がつまった感じ」の主な原因は鼻甲介内の血管が広がり腫れ上がっているためであり、鼻水ではない。そのため、鼻をかんでも詰まった感じがとれることはない。
    • 点鼻薬またはスプレーは有効であるが、3日以上使うと粘膜の炎症を引き起こし、さらにひどい症状を招く場合がある。
    • 鼻の症状が7日から10日経過しても続く場合は、細菌感染を疑い医師の診察を受ける。
  • 鼻水とくしゃみ
    • 抗ヒスタミン薬は効くという研究も全く効かないという研究もある。効くという研究でも効くとされるのは「第1世代抗ヒスタミン薬(眠くなるタイプ)」で、眠くならないタイプは風邪の症状に対して効力がない。
    • 第1世代抗ヒスタミン薬や鼻炎薬は有効である。市販の咳止めシロップは使ってはならない
    • あらゆる鎮咳薬において主要な役割をはたしているのはプラシーボである。
    • 3週間以上続く場合は風邪以外の原因が強く疑われるので、医師の診断を仰ぐ。
  • 風邪の全ての症状に
    • 家族や友人による愛情に満ちた看護医師による患者への共感は風邪の期間を丸々一日緩和させ、さらに副作用もない。
  • 現時点で風邪に対する有効な薬剤はない。かつてプレコナリルと言う強力な薬剤が開発されたが、効果は1日から1.5日の風邪期間短縮であり、さらに安全性の問題から認可が降りなかった。現在、siRNAを利用した薬剤が有力候補と見られている。
  • 風邪の原因はウイルスであり、細菌ではないため、抗生物質は全く効果がない。細菌の二次感染を防ぐ効果すらない。
  • 風邪の症状は免疫反応である。免疫強化薬はかえって症状をひどくする場合がある。

途中にも書いたが、風邪の感染の機会を減らすのは非常に簡単なことで、「手を洗う」と「顔に手をやらない」という2つのことを実行するだけで高い効果があるという。だが、「顔に手をやらない」というのは本当に難しい。本気でやろうとしたら顔を手から物理的に隔離するしかない。ただのマスクは風邪に何の効果もないとの事だが、ホッケーマスクなら効果があるのではないだろうか。他の人のほとんどがやるようになったらやるので皆の積極的な取り組みを期待している。

2012-10-13

[][] Problem 243 00:05  Problem 243を含むブックマーク  Problem 243のブックマークコメント

分子が分母より小さい分数を真分数と呼ぶ。

どのような分母dを選んでも、d-1個の真分数がある。例えばd = 12とすると、

1/12, 2/12, 3/12, 4/12, 5/12, 6/12, 7/12, 8/12, 9/12, 10/12, 11/12

分数のうち、約分できないものをresilient(弾性のある)分数と呼ぶことにする。

さらに、分母dについて、真分数の中でresilient分数の割合をresilient(弾性)と呼ぶことにし、R(d)で表す。例えば、

R(12) = 4/11

なお、d = 12はR(d) < 4/10を満たす最小の分母である。

R(d) < 15499/94744を満たす最小のdを見つけよ。

no title

続きを読む

[][] Rでオイラーのφ関数の列挙 23:20  Rでオイラーのφ関数の列挙を含むブックマーク  Rでオイラーのφ関数の列挙のブックマークコメント

自然数nに対して、1からnまでの自然数の中でnと互いに素であるものの個数をで与えることとしたとき、このをオイラーのφ関数(オイラーのトーシェント関数:Euler's totient function)と呼ぶ(cf.オイラーのφ関数 - Wikipedia)。

具体的にの値を1から10まで求めると以下のようになる。

Wikipediaの記述そのままだが、性質としては以下の様なものがある。

  • pを素数とした時、
  • 互いに素である2数m、nについて、である
  • 以上の性質より、nの素因数分解が
  • と与えられているとき、

つまり、nとnに含まれる素因数が分かればを求めることができる。nに対し、全ての素因数について(p-1)/pを掛けていけば良い。1からnまでの全ての値で試し割りする必要はない。

一つの値について求めたいのであれば、gmpパッケージのfactorizeを使って以下のようにすれば簡単に求められる。

library(gmp)
euler.phi <- function(n){
  p <- unique(as.numeric(factorize(n)))
  n * prod((p - 1)/p)
}

10まで求めてみると

> sapply(1:10, euler.phi)
 [1] 1 1 2 2 4 2 6 4 6 4

一つ一つではなく、リストとして欲しい場合があるだろう。上述のように、nをベースとして(p-1)/pをかけて行けば良いのだから、エラトステネスの篩を使えばよい。

limit <- 1e4
# eulerのphi関数の列挙
phi <- 1:limit
for(p in 2:limit){
  if(phi[p] == p){                      # pが素数のとき
    phi[seq(p, limit, p)] <-            # pの倍数に対して
      phi[seq(p, limit, p)] * (p-1)/p   # (p-1)/pを掛ける
  }
}

プロットするとこんな感じである。

f:id:Rion778:20121013235234p:image

なお、プロットにあたってはブログが見つかりませんで知ったdensColsを使った。

2012-10-08

[] Rで最小公倍数 21:33  Rで最小公倍数を含むブックマーク  Rで最小公倍数のブックマークコメント

2数について求める時

最小公倍数(Least Common Multiple: 以下LCMと略す)を2数から求めるには、最大公約数(Greatest Common Divisor: 以下GCD)との間に成り立つ以下の関係、

を利用して、

として求めれば良い。GCDはユークリッドの互除法により簡単に求められる。RではGCD、LCMを求める関数を持つパッケージがいくつかある(例えばgmpパッケージのgcd、lcm.bigz)ので関心のある数が2つであればこれらのパッケージを利用するのが手軽。

3つ以上の数について求めるとき

パッケージに含まれる関数は基本的に引数として2つまでしか数を受け付けない。また、上述の関係は対象とする数が3つ以上になると成立しない(cf.最小公倍数 - Wikipedia)。

3つ以上の整数についてGCD、LCMを求める場合を考えよう。

証明はしないが、GCDとLCMは結合法則を満たす。つまり、

そこで、関心のある数のリストから2つずつ選んで順番に関数を適用していけば良い。

Reduce

RにはReduceという関数がある。Lispに馴染みのある人なら分かるだろうが(私は馴染みがないので分からないが)、このような動作をする関数である。

> Reduce("+", 1:5)
[1] 15

"+"は演算子や文字列ではなく、2つの引数をとる関数として見てもらいたい(Rでは「1+2」は「"+"(1, 2)」と同じであり、要するに「演算子」というのは特殊な書き方が許された関数である。)。

Reduceは要するに、

> "+"("+"("+"("+"(1, 2), 3), 4), 5)
[1] 15

という感じで順次関数を適用していく関数である。

Reduceを使えば、複数の数についてGCDやLCMを求められる。

> Reduce(gcd, c(3, 9, 300))
[1] 3
> Reduce(lcm.bigz, c(2, 6, 15))
Big Integer ('bigz') :
[1] 30

指数の形で欲しいとき

最大公約数は対象としている数より小さい値となるのでそのまま出てきても別に大した問題は無いのだが、最小公倍数は対象としている数がそんなに大きくなくても、個数が多いとかなり大きな数になる場合がある。なので、指数表現で欲しいという場合があるだろう多分。

対象とする数各々について素因数分解したとき、それぞれの素因子の指数を比べ、大きい方を採用したのがLCM、小さいほうがGCDである。例えば、

であるが、

といった具合である。

適当に書くと、

library(gmp)
get.prime <- function(n){ ## 適当注意
  (1:n)[isprime(1:n) != 0]
}
LCMcnt <- function(N){
  prime <- get.prime(max(N))
  count <- numeric(length(prime))
  names(count) <- prime
  for(n in N){
    tmp <- table(as.numeric(factorize(n)))
    for(name in names(tmp)){
      if(count[name] < tmp[name]) count[name] <- tmp[name]
    }
  }
  count[count != 0]
}

といった感じである。

> LCMcnt(c(36, 68))
 2  3 17 
 2  2  1
> LCMcnt(1:50)
 2  3  5  7 11 13 17 19 23 29 31 37 41 43 47 
 5  3  2  2  1  1  1  1  1  1  1  1  1  1  1

ちなみに説明のために適当に書いただけで、あんまりお手軽でも安心でもないので、実用上はlcmの結果をgmpのfactorizeに突っ込んでしまうのが良いと思う。

> factorize(Reduce(lcm.bigz, 1:50))
Big Integer ('bigz') object of length 23:
 [1] 2  2  2  2  2  3  3  3  5  5  7  7  11 13 17 19 23 29 31 37 41 43 47
> table(as.numeric(factorize(Reduce(lcm.bigz, 1:50))))

 2  3  5  7 11 13 17 19 23 29 31 37 41 43 47 
 5  3  2  2  1  1  1  1  1  1  1  1  1  1  1 

gmpパッケージについて

上の例で気付いたかもしれないが、bigzクラスはそのままtableに突っ込めないので、as.numericでnumericに戻してやる必要がある。

gmpパッケージのbigzやbigqなどは何も考えずに色々な計算ができて便利なのだが、集合演算など対応していない関数も多い。

tableの場合はエラーが出るのでまだいいのだが、uniqueなどではエラーもでない。いつもの調子でいつもの関数を使っていると思わぬバグが紛れ込むので、gmpパッケージを使う場合は普段以上に型に注意する必要がある。

> unique(factorize(Reduce(lcm.bigz, 1:50)))
 [1] 17 00 01 02 03 05 07 0b 0d 11 13 1d 1f 25 29 2b 2f

[][] Problem 152 21:14  Problem 152を含むブックマーク  Problem 152のブックマークコメント

http://projecteuler.net/problem=152

平方数の逆数の和として1/2を表す方法はいくつかある。

例えば、35以下の数を使うとすると、{2, 3, 4, 5, 7, 12, 15, 20, 28, 35}を用いて、

2から45までの数を使うとすると、他に2つ方法がある。

2から80までの数を使うとして、何通りの方法があるか。

続きを読む

Connection: close