[過去ログ] 「数学」をプログラミングするには (1002レス)
1-

このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
81
(1): デフォルトの名無しさん [sage] 2024/03/23(土) 19:08:33.11 ID:HOjMmtFw(1) AAS
配列こそプログラミングやコンピュータ都合の邪道なものだね
配列は有限しか扱えないから不要

イテレータは自然数イテレータだけでなく例えばフィボナッチイテレータなど無限を扱える
イテレータは数学とも相性がいい
82
(2): デフォルトの名無しさん [] 2024/03/23(土) 20:19:21.71 ID:g/HfMmmn(6/9) AAS
>>78
78(2): デフォルトの名無しさん [] 2024/03/23(土) 17:30:00.10 ID:g/HfMmmn(5/9) AAS
>>77
イタレータは配列の各要素を走査しながら操作する道具、つまり写像を逐次的に作っていくための操作手順を表したものに過ぎない。
>>81
イタレータの意味を分かっているのか。反復子だぞ。反復子が写像のわけないだろ。
写像を実行するための操作手順でしかない。

反復子の遅延評価により無限の操作手順をコードとして書くことはできても、実際には
実行が途中で終わるので無限を扱えるわけではなく、有限を無限に見せている構文上の
まやかしに過ぎない。
83
(2): デフォルトの名無しさん [sage] 2024/03/23(土) 21:27:18.93 ID:u0/iUo5p(1) AAS
>>82
あんさんボケとるな
ここまで読んで反復子(iterator)が写像(map)と書いているのは君しかいない
他の人たちは以下を正しく理解して書込みしている

>>72
72(4): デフォルトの名無しさん [sage] 2024/03/23(土) 14:11:05.89 ID:O64Y227M(2/5) AAS
>>70
普通mapは配列に対してではなく
もっと一般的にイテレータに対して適用
結果もイテレータとする

その結果を例えばfor文で使う場合
わざわざ結果を配列に入れても無意味だったことになるからだ
mapを多段にした使った場合も同様で中間結果配列は無意味になる
だからmapの入力も出力もイテレータが使われる
>> だからmapの入力も出力もイテレータが使われる
84
(1): デフォルトの名無しさん [] 2024/03/23(土) 22:23:29.86 ID:g/HfMmmn(7/9) AAS
>>83
>>74
74(3): デフォルトの名無しさん [sage] 2024/03/23(土) 15:36:22.16 ID:O64Y227M(3/5) AAS
>>73
配列から配列なんて嘘つきだな
例えば写像の入力を数学でもよくある自然数とする
これは配列では表現できない
イテレータならば表現できる
出力も同様で配列は不可能だがイテレータなら可能
はごっちゃにしているようだが。

反復子を使っても遅延評価をしなければ、mapを多段に使った場合の効率は良くならない。
例えば、C++ STLのtransformがそう。

>>70
70(3): デフォルトの名無しさん [] 2024/03/23(土) 12:47:39.65 ID:g/HfMmmn(2/9) AAS
>>69
機械語に識別子はないからできないだろ。Cでは長さnの配列aの各要素に関数fを適用した結果を
配列bに格納する関数 map(f, a, n, b) を簡単に自作できる。
のような配列のmap関数でも、引数fとして複数の関数の合成関数のポインタを渡せば、
効率は良くなる。あるいは、引数fとして関数ポインタの配列を受け入れるようなmap関数を
書いても良い。
85: デフォルトの名無しさん [] 2024/03/23(土) 22:27:51.62 ID:g/HfMmmn(8/9) AAS
>>83
>>74はごっちゃにしているようだが。

反復子を使っても遅延評価をしなければ、mapを多段に使った場合の効率は良くならない。
例えば、C++ STLのtransformがそう。

>>70のような配列のmap関数でも、引数fとして複数の関数の合成関数のポインタを渡せば、
効率は良くなる。あるいは、引数fとして関数ポインタの配列を受け入れるようなmap関数を
書いても良い。

そもそもCでmap関数を書けるかという話だから、書けるという回答で何の問題ないだろ。
86
(1): デフォルトの名無しさん [sage] 2024/03/23(土) 22:32:25.46 ID:/PCiT6cf(1/2) AAS
>>84
根本的な勘違いをしているようなのでアドバイス
イテレータは抽象的な概念に過ぎないのでそこに遅延評価などという話は一切出てこない
イテレータの実装の一つに遅延評価の有無を持ち出すケースがあるようだがそんな特殊などうでもいい話をしても意味がない
87: デフォルトの名無しさん [] 2024/03/23(土) 22:36:40.17 ID:g/HfMmmn(9/9) AAS
>>86
そんなことは分かっている。>>72に言ってくれ。
88: デフォルトの名無しさん [sage] 2024/03/23(土) 22:43:57.14 ID:/PCiT6cf(2/2) AAS
>>72は正しいよ
89: デフォルトの名無しさん [sage] 2024/03/23(土) 22:56:10.99 ID:sCrZk0I5(1) AAS
iteratorは可算無限を扱える
mapは入力も出力もiterator

例えば
2倍にするというmapに対して
入力を自然数のiteratorとすると
出力は偶数の自然数のiteratorとなる

これだけの話だろ
>>82の人だけ理解できてないようだが
90: デフォルトの名無しさん [] 2024/03/24(日) 10:28:13.06 ID:8D2Drt3S(1) AAS
でもC言語は圏論じゃないよね
91: デフォルトの名無しさん [sage] 2024/03/24(日) 10:35:26.13 ID:GMGvnUD/(1/3) AAS
20年前の議論草
92: デフォルトの名無しさん [] 2024/03/24(日) 11:18:58.82 ID:dsXIuIWc(1) AAS
それは間違い
FORTRANが今もなお科学技術計算に使われてる
93: デフォルトの名無しさん [sage] 2024/03/24(日) 11:32:06.58 ID:GMGvnUD/(2/3) AAS
言葉のお遊びwww
94: デフォルトの名無しさん [] 2024/03/24(日) 11:34:31.12 ID:yjeBPx06(1) AAS
集合論はラッセルのパラドックスで矛盾した
だから集合と写像に基づくC言語やRubyは数学を扱うのに不適切
よってハスケルなどは圏論に基づくから関数型言語が正解
95
(1): デフォルトの名無しさん [] 2024/03/24(日) 11:46:51.50 ID:BUlt442E(1/6) AAS
プログラム言語は機械語→アセンブラ→高級言語 と進化してきたが、高級言語にも高級度の段階があって
gotoジャンプ→構造化ループ→map→ベクトル演算 という序列になっている。

y = x.map(i => 2 * i) のように冗長な記述をしなければならない言語よりは、ベクトル演算で y = 2 * x と
すっきり書けるFortranの方が進化している。
96: デフォルトの名無しさん [sage] 2024/03/24(日) 14:10:14.72 ID:S5dROhf0(1) AAS
まったくトンチンカンな話してんな
プログラミング言語にmapがあったところでそれで数学ができるわけじゃないだろ
何を解きたいんだよ?
定理証明か?仕様記述か?
ド文系のふわっとした思考やめな
97
(2): デフォルトの名無しさん [sage] 2024/03/24(日) 14:30:14.37 ID:rmOZT0bw(1) AAS
>>95
それはarrayを入出力とするmapだね
それは遅延評価もできず可算無限列を扱えない古い劣化タイプ
一方でiteratorを入出力とするmapはarrayだけでなく可算無限列など任意のものを対象にできる
98: デフォルトの名無しさん [] 2024/03/24(日) 14:58:03.83 ID:iK6Wk5rB(1) AAS
この完全なデタラメな話をここまで長々とする気力がどこから湧いてくるのかがわからない
99: デフォルトの名無しさん [sage] 2024/03/24(日) 15:27:25.02 ID:pjttU2nz(1) AAS
所有権を複製したいんやろw
100: デフォルトの名無しさん [sage] 2024/03/24(日) 15:28:49.95 ID:4Iqs5Xee(1) AAS
>>97
昔は配列に対するmapしか無かったから、遅延評価できず、有限列しか扱えず、中間生成配列のムダなど、悲惨だったな
今はイテレータに対してmapその他を適用するプログラミング言語が増えたので、扱える対象が広がるとともに、効率も良くなったな
101: デフォルトの名無しさん [sage] 2024/03/24(日) 16:53:04.14 ID:GMGvnUD/(3/3) AAS
そんな低レベルの話してるんとちゃうんやで
102: デフォルトの名無しさん [] 2024/03/24(日) 18:55:43.95 ID:qF9URZLj(1) AAS
そもそも高階関数のmapは、数学の集合論における写像のことではない
103: デフォルトの名無しさん [] 2024/03/24(日) 19:36:33.57 ID:WsANI0D/(1) AAS
ゴミみたいな話しかしてないな、定理証明系とかの話をしているのかと思ったら
104
(2): デフォルトの名無しさん [] 2024/03/24(日) 20:58:49.18 ID:BUlt442E(2/6) AAS
>>97 >> 100
Ruby厨、Haskell厨が他の言語を貶めるのに必死だなw

Fortranのプログラム

 program test
   integer :: x(3), y(3)
   x = (/1, 2, 3/)
   y = 2 * x + 1
   print "(i0)", y
 end program

の y = 2 * x + 1 の行で中間配列が作成されて、

   integer :: temp(3)
   temp = 2 * x
   y = temp + 1

のような非効率な動作になるとでも思ってるのか? STLで提供しているC++のvalarrayと違って、
Fortranはベクトル演算に言語仕様レベルで対応しているから、そんなことするはずないだろ。
105
(1): デフォルトの名無しさん [] 2024/03/24(日) 20:59:19.43 ID:BUlt442E(3/6) AAS
Visual Stduioで y = 2 * x + 1 の行の逆アセンブリを見てみると、

 mov  qword ptr [rbp + 68h], 1
 mov  rax, qword ptr [rbp + 68h]
 cmp  rax, 3
 jg  TEST + 105h
 mov  rax, qword ptr [rbp + 68h]
 imul rax, rax, 4
 lea  rdx, [X]
 add  rdx, rax
 add  rdx, 0FFFFFFFFFFFFFFFCh
 mov  eax, dword ptr [rdx]
 imul eax, eax, 2
 inc  eax
 mov  rdx, qword ptr [rbp + 68h]
 imul rdx, rdx, 4
 lea  rcx, [Y]
 add  rcx, rdx
 add  rcx, 0FFFFFFFFFFFFFFFCh
 mov  dword ptr [rcx], eax
 mov  eax, 1
 add  rax, qword ptr [rbp + 68h]
 mov  qword ptr [rbp + 68h], rax
 jmp  TEST + 0B7h

というコードが生成されていて、中間配列なんて作成せず合成関数を1回だけ適用し、Cの

 for (i = 1; i <= 3; i++) y[i] = 2 * x[i] + 3;

に相当する効率的な処理になっている。(add rdx, 0FFFFFFFFFFFFFFFCh を見ると、
配列の添字が1始まりなのは非効率なのかと思ってしまうが…)
1-
あと 897 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル

ぬこの手 ぬこTOP 0.020s