[[プログラムの数理]]
**takoがレポートについてがんばっている記録。 [#hb171913]
-前置き
これは、どう考えたらいいかを考えたものだから、まるまるコピーして写すとかはしないほうがいいと思うよ。読み取るのは考え方であるべき。
-まず最初に
absint :: VInt -> Int
absint (x:xs) = mulbplus x xs
mulbplus x [] = x
mulbplus x0 (x1:xs) = mulbplus (x0 * b + x1) xs
っていうのを考えればいいことは分かった。これを…
-疑問1
どういうファイル名で保存して、どうやって実行すればいいか分からない~
現在はArithmetic.hsの下にくっつけてghci Arithmetic.hsしている。
--大きい桁のほうがリストの左側に繰るんじゃない?これだと逆になってしまうような。
---あってるよぅ、もうねむいのであした先生とか先生とか先生に教えてもらう~
-あと1,2は帰納法?3は正しいよね
-4
type VInt2 = (Bool,VInt)
-- true is >=0
vadd2 :: VInt2 -> VInt2 -> VInt2
vadd2 (xb,xs) (yb,ys)
| xb==True && yb==True = (True,vadd xs ys)
| xb==False && yb == False = (False,vadd xs ys)
| xb==True && yb ==False && vleq xs ys = (False,vsub ys xs)
| xb==True && yb ==False && vless ys xs = (True,vsub xs ys)
| xb==False && xb == True = vadd2 (yb,ys) (xb,xs)
vsub2 :: VInt2 -> VInt2 -> VInt2
vsub2 x (yb,ys) = vadd2 x ((not yb),ys)
-5
digitToInt :: Char -> Int
digitToInt c
| isDigit c = fromEnum c - fromEnum '0'
| c >= 'a' && c <= 'f' = fromEnum c - fromEnum 'a' + 10
| c >= 'A' && c <= 'F' = fromEnum c - fromEnum 'A' + 10
| otherwise = error "Char.digitToInt: not a digit"
isDigit c = c >= '0' && c <= '9'
digit c = digitToInt c
inv = pack . map digit
pack :: [Int]->VInt
pack s = foldl (time10add) [0] s
where time10add xs y = vadd (map (10*) xs) [y]
"223"をb=100にすると[2,23]になった。いいはず
-6
-- thinking b is 10000
outv (x:xs) = i2ddiv "" x ++ foldl (len4digit) "" xs
i2c :: Int -> Char
i2c x = toEnum (fromEnum '0' + x)
i2ddiv s x
| 0 <= x && x <= 9 = s++[toEnum (fromEnum '0' + x)]
| otherwise = (i2ddiv (i2ddiv s (x `div` 10)) (x `mod` 10))
len4digit s x = s ++ [i2c (x `div` 1000),i2c ((x `div` 100) `mod` 10),i2c ((x `div` 10) `mod` 10),i2c (x `mod` 10)]
-7
できない。-の数をいれるとなんかおかしくなる…理由書くのか?~
いや、そもそも-を考える必要はまだないのかな…それならできる、が正解…
-8
結合性を持つ。よねよね。foldrを使って書けるかもしれないけど、めんどくさい。が正解か。
--めんどくさくない。なぜなら結合性を持つから。そのまま置き換えておしまいじゃないかな。
---結合性を持つっていう言葉を間違えて使ったかも。演算の順番を変えると答えがひとつに定まらない。ってことは結合性を、持たない、のかな…(結合則をみたさない)ちと計算しなおしてみます。
-9
vmul2 (xb,xs) (yb,ys) = (((/=) xb yb),vmul xs ys)
**harajuneの覚書 [#k5e45745]
特定の人たちへ。
***証明の仕方: [#rd6e00b2]
正直よくわかんないけど縮約(reduction)した結果が等しいよねってことを言えばいい気がする。
たぶん。
***421 [#wde885fc]
以下のように定義すると後の説明が楽な気がします。
absint :: VInt -> Int
absint xs = mulplus nall xs
where mulplus :: Int -> VInt -> Int
mulplus n xs | n < 0 = 0
| otherwise = b^n * head(xs) + (mulplus (n-1) (tail xs))
nall = length(xs) - 1
説明としてはこんな感じ。縮約できるから~
absint([0] ++ xs) = mulplus (nall+1) ([0] ++ xs)
= mulplus nall (xs)
= absint xs
***423 [#xfce6f8e]
これもたぶん関数の定義使って変形すればOK
negate xs = norm・map neg xs
= norm [-x0, -x1, -x2, .... , -xn]
vsub [0] xs = norm (zipwith (-) (align [0], xs))
= norm (zipwith (-) [0,0,0,0,....,0] xs)
= norm [-x0, -x1, ....., -xn]
***425の意味 [#l5d0ff01]
digitは文字列から数字のリストを与えます。
"12345"→['1', '2','3','4','5']→(たぶんここがmapの意味)→[1,2,3,4,5]
後はpackでb進数に直します。VIntは[Int]という定義なのでb=2なら
[1,2,3,4,5]→[1,1,0,0,0,0,0,0,1,1,1,0,0,1]
***427 [#ebd605c5]
たぶん可能?
vmul xs ys = foldl (+) [] (psums xs ys)
= ((...( [] (+) ps1) (+) ps2 (+)...) (+) psn)
= ((....( vadd []++[0] ps1) (+) ps2 ....) (+) psn)
= (((....(ps1 (+) ps2 ) (+) ps3) .....) (+) psn)
= foldl1 (+) (psums xs ys)
***428の後半 [#p2eef6ac]
flipとreverseを使えばできます。演算子を全て入れ替えればなんでもできます。
知らんかった・・・・つまりこういうことか
vmuls xs ys = foldr1 (flip (+)) (reverse psums xs ys)
** [#z823c212]
normがバグバグです。
先生に日本語が通じません。
先生、normがまだバグバグです。
**foldl1とfoldlの違い [#wb0f1e38]
知ってる人にはあたりまえなんだろうけど、一応 ~
foldlは最初に二項演算子と「種」とリストを受け取ります~
foldl1には種はありません。リストに対してそのまま演算を行ないます。
つまり、
#mimetex(\mathrm{foldl}\ (\oplus)\ a\ [x_1,x_2,x_3] = ((a \oplus x_1) \oplus x_2) \oplus x_3)
#mimetex(\mathrm{foldl1}\ (\oplus)\ [x_1,x_2,x_3] = (x_1 \oplus x_2) \oplus x_3 )
型で書くと、
#mimetex(\mathrm{foldl}\ ::\ (\beta -> \alpha -> \beta) -> \beta -> [\alpha] -> \beta)
#mimetex(\mathrm{foldl1}\ ::\ (\alpha -> \alpha -> \alpha) -> [\alpha] -> \alpha)
ただ一つの型変数しかでてこない。
**yambiがレポートについてがんばっている記録 [#b8e692fb]
- 多倍長数のVIntを定義しようとしています.
-- 多倍長数を定義するために多倍長数を使っては意味がありません.~~
(これが許されるなら,vdivなどの定義がVIntから一度Integerに変換してから計算をしてVIntにすれば良いことになる)
-- よってgenericLengthを使うことはできない.
-b-数の基底は好きな数を使えるべきです.
-- よって基底を表すためにVIntを使う必要があります.
-型
-- type Bigit = (Bigit,[Bigit])
-- length'::VInt->VInt
-- take'::VInt->VInt->VInt