[[プログラムの数理]]

**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

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS