追記
eagletmtさんにwriteArray ary pos $! (v+1)したらと教えていただいた.
maxNでも落ちなくなりました. ありがとうございます. $!は何カ所にはつけてみたのだけど駄目だった.
前回のときもそうだけど, どうもどこにつけていいのかよく分からない.
うまく行ってもちょっとコード変えたら挙動が変わるし, 基本的な関数も自分で再定義しないといけなくなるし(適当につけてるからや>自分). うーん.
ちなみにmaxN = 100000にしたときの速度はHaskellがCの57倍ぐらい遅い.
中で何やってるのかな. またGC系?
// C++版
#include <stdio.h>
#include <algorithm>
const int N = 50000;
const int limit = 1000;
static int countTbl[N];
int main()
{
for (int a = 1; a <= (N - 2)/4; a++) {
for (int b = 1; b <= std::min(a, (N/2 - a)/(a+1)); b++) {
for (int c = 1; c <= std::min(b, (N/2 - a*b)/(a+b)); c++) {
int p = a + b + c;
int q = a * b + (a + b) * c;
int n = 1;
for (;;) {
int s = 2 * q + 4 * (n-1) * (p + n - 2);
if (s >= N) break;
countTbl[s]++;
n++;
}
}
}
}
const int *pos = std::find(countTbl, countTbl + N, limit);
if (pos != countTbl + N) {
printf("found %d\n", (int)(pos - countTbl));
} else {
puts("none");
}
}
// 0.41秒
Haskell版
import Control.Monad.ST
import Data.Array.ST
import Data.List
maxN::Int
maxN = 50000
limit = 1000
ls = [(a,b,c)|a<-[1..quot (maxN-2) 4],
let maxN2 = quot maxN 2, b<-[1..min a (quot (maxN2 - a) (a+1))],
c<-[1..min b (quot (maxN2 - a * b) (a+b))]]
genPos (a,b,c) = takeWhile (<maxN) [2 * q + 4 * (n-1) * (p + n - 2)|n<-[1..]]
where p = a + b + c
q = a * b + (a + b) * c
inc ary pos = do v <- readArray ary pos
writeArray ary pos (v+1)
count = do
ary <- newArray (0,maxN-1) 0 :: ST s (STArray s Int Int)
mapM_ (inc ary) $ concatMap genPos ls
getElems ary
main = print.findIndex (==limit).runST $ count
// 15.97秒
目茶目茶おもろかった. つい言ってしまう「私は無宗教です」の意味を考える. 著者によると「無宗教」とは「無神論者」ではなく「特定の宗派の信者ではない」という意味にすぎないという.
なるほど, 特定の既成宗教の枠にはめられるのが嫌だからそう言ってるというのは当たってる気がする. 私は初詣も墓参りもお盆も葬式も普通にするしね.
まず著者は「創唱宗教」と「自然宗教」という言葉を定義し区別する. 前者はいわゆるキリスト教やイスラム教を指し, 教祖, 教典, 教団などで成り立っているもの. 後者は特定の教祖によるものではなく, 自然発生的に現れ, 無意識のうちに受け継がれてきたものとする. そして, 日本人の大多数は「自然宗教」の「信者」であると主張する.
では何故, 普通「自然宗教」, つまり神前結婚式や地鎮祭, 葬式仏教などの風俗や習慣を「宗教」とみなさないのか, それがどういう問題を起こすかという議論に移る.
中世に遡り, 当時の考え方を考察する. 死んだらホトケの「ホトケ」の意味, 死者の霊魂はカミサマなのか. 本来の仏教と日本に元々あったケガレの概念, 中国の「考」やインドのしきたりなどがごちゃまぜ(?)になっていくところなどのトピックも興味深い.
三章では, 脈絡と受け継がれてきたその「自然宗教」が, 明治以降どのようにおとしめられたかを考える. 明治時代は天皇を中心とする中央集権的国民国家を作る必要があった. そのため本音はキリスト教を禁止し, 「神道」を国教にしたかった(このあたりはこないだ読んだ『武士道の逆襲』の話と関連するなあ).
だが, 欧米の手前もあるし「信教の自由」を認めるも必要もあるのでそれができない. そこで「(キリスト教などを)信じることは許す」が「布教や礼拝などの社会的行為を禁止」し, 「神道」を「宗教」とみなさないことにした(これは物凄い論理だな). 「政教分離」が難しいわけだ.
ちなみに「宗教」という用語はキリスト教などのものを扱う概念としてこのとき作られたそうな. 最初から「自然宗教」は考慮外だった.
さて古来の日本の伝統的な信仰は, 身の回りのものそれぞれにカミがいて, 仏壇もあって, その外側により強いカミ(神社)がいるという構造だった.
そこに「天皇崇拝」が降りてきた上, 神道の儀礼が「宗教でない」となったのでワケワカメになってしまった. そんな中では「無宗教」は身の安全を保証する方便だった. うむ, 恐ろしい.
後半は「平凡指向」, ムラの知恵, 沖縄の大神島の祭りの話になる. 最後の方はいまいち散漫でよく分からないところもあった. でもまあ, 「自分は無宗教」と言ったことがある人, 読んでみたらいいと思う.