はてなキーワード: 離散数学とは
数列における中間項の特定を暗号学的に実現する方法論は、現代の情報セキュリティ理論と離散数学の融合領域に位置する。
本報告では、数列n, x, n+kの構造分析から始め、暗号学的保証を伴うxの特定手法を体系的に解説する。
特に、一方向性関数の活用からゼロ知識証明に至るまで、多角的な視点で解法を探求する。
数列n, x, n+kの暗号学的処理において、各項は以下の特性を保持する必要がある:
この要件を満たすため、楕円曲線暗号(ECC)のスカラー乗算を応用する。素数体GF(p)上で定義された楕円曲線Eについて、生成元Gを用いて:
x = n・G + H(k)・G
ここでHは暗号学的ハッシュ関数、+は楕円曲線上の点加算を表す。これにより、kを知らない第三者によるxの逆算が離散対数問題の困難性に基づき阻止される。
ポスト量子暗号時代を見据え、Learning With Errors(LWE)問題に基づく方式を導入する。mod q環上で:
x ≡ A・s + e (mod q)
ここでAは公開行列、sは秘密ベクトル、eは小さな誤差ベクトル。nを初期状態、n+kを最終状態とする線形関係を構築し、xの算出にLWEの困難性を利用する。
Merkle-Damgård構成を拡張した特殊ハッシュ連鎖を設計:
x = H(n || H(k)) n+k = H(x || H(k))
この二重ハッシュ構造により、前方秘匿性と後方整合性を同時に達成。SHA-3のスポンジ構造を適用し、256ビットセキュリティを保証する。
Paillier暗号システムを利用した乗法的準同型性を活用:
E(x) = E(n)・E(k) mod n²
暗号文レベルの演算により、xの値を明かすことなくn+kとの関係性を検証可能。ゼロ知識証明と組み合わせることで、完全な秘匿性下での検証プロトコルを構築。
1. コミットメント段階:nとkのペダーセンコミットメントC=G^nH^rを生成
4. 検証:C・G^{n+k} = G^xH^s
このプロトコルにより、x = n + kの関係を明かすことなくその正当性を証明可能。
これらのパラメータ設定により、NIST SP800-57推奨のセキュリティレベル3(192ビット対称強度)を満たす。
3. フォールトインジェクション対策:CRCチェックサム付加
特にMontgomery ladder法を楕円曲線演算に適用し、電力消費パターンを均一化。
これにより、xの生成速度を従来比3倍向上させつつ安全性を維持。
現行のLWEベース方式では、量子コンピュータによるGroverアルゴリズムの影響を試算:
1. 同態暗号による動的数列生成
2. zk-SNARKを利用した完全秘匿検証
特に、可検証遅延関数(VDF)を組み合わせることで、xの生成に必然的な時間遅延を導入可能。
暗号学的数列中間項特定法は、現代暗号理論の粋を集めた高度な技術体系である。
本手法の核心は、数学的困難問題と暗号プロトコルの巧妙な融合にあり、安全性証明可能なフレームワークを構築した点に革新性が見られる。
今後の発展方向として、量子耐性の強化と効率化の両立が重要な研究課題となる。実用面では、ブロックチェーン技術や秘密計算分野への応用が期待される。
エドワード・フレンケル教授によれば、最先端の数学はゴッホのようなものですが、小手先の応用はペンキ塗りに喩えられています。
また、ティモシーガワーズ教授は、数学の2つの文化、つまり「問題解決者」と「理論構築者」に分けて考察しています。
私のようなプログラマーというのは、問題解決者として小手先の応用へ取り組む人がほとんどです。
例えば量子力学の理論やラングランズ・プログラムなどの「深淵」に取り組んだ経験が圧倒的に少ないのです。
学ぶ事柄が見つからないということは起こり得ません。むしろ多すぎて選ぶのに苦労しています。人生は限りがあるので、選ばなければならないのです。
しかし数学の経験が未熟であるために、取り組む価値のあるトピックがどれであるのか、その審美眼が鍛えられていないのです。
プログラマーは離散数学のことばかりやっています。だから逆に、連続とか無限とかそういうことへの憧れが湧いてきます。
しかし、超弦理論は最近批判に晒されているようで、つまり実験によって反証しにくいので、理論が結局どう有用なのかわからなくなっているようなのです。
人間がこの先、微細な弦の構造を発見できるくらい巨大なエネルギーをもった加速器を作ることがあるでしょうか。希望は薄そうです。
フレンケル教授が言うように、「一部のエリートだけがゴッホを理解するのではなく、一般市民も作品に触れる」ことに希望を持っています。
高校で懇切丁寧に教わった数学もろくにできるようにならなかった人たちが、離散数学を勉強してコーディングに活かせるわけがない。
学習能力が低い人(といっても普通の人)は、陳腐化しやすい場当たり的なことしか勉強できないの。
Flashで書いたアプリはもうまったく動かないし、その頃に覚えたブラウザごとの挙動の違いなんてもうどうでもいい。
クライアントとサーバの役割分担に対する考え方だって、もう役に立たない。
それは他の職種でも一緒?
違うよ。
たとえば経理で、IFRSでも役に立つような会計学は、誰でも勉強して理解できるわけじゃない。
だけど、商業高校で教わる程度の簿記の知識が、10年20年程度では陳腐化しない。
定量化して比較するのは困難だけど、普通に接点があれば、ICTの知識が劣化する速度と程度が段違いなのは誰でもわかる。
わからないっつーなら、関係ないところで関係ない仕事をしていればいいんだよ。
余計なことに首を突っ込むな。
コンピューターサイエンス自体がふんわりしていて、範囲が広すぎるから分からんでもない。
(ある程度アルゴリズムとデータ構造は既知のものとして)、計算理論や離散数学辺りを浅くてもいいから、さらっておくといいよ。
よさげなのを探してみた。
https://www.youtube.com/@hayamizu
「計算の仕組み 〜オートマトンからラムダ計算まで〜」 関山 太朗 - 国立情報学研究所 2020年度 市民講座 第3回 - YouTube
https://www.youtube.com/watch?v=DaiUQvE8O1U
Yoshio Okamoto - YouTube
https://www.youtube.com/@okamoto7yoshio
世の中にはプログラマー35歳定年説というものがあった。昔からそんなのはないという人と、あるという人がいた。40代も半ばになったときに「あぁ、これが35再定年説の根拠か」というものがなんかちらほら見えるようになってきたので書いてみようと思った。
世の中にはものすごいプログラマーというのはやっぱりいる。なんなら死ぬまでプログラミング書いていられるという人たちもいる(ブラック的な意味ではなく)。そんな彼らからしたらプログラマー35再定年説とか意味がわからない都市伝説にしか映らないだろう。
だが、普通に職業プログラマとして生きている俺のような人からすると、この35歳定年説はかなりの真実味を帯びている。
だが、そんな俺でも40代半ばまで延命できたのはやはり技術革新のおかげかもしれないが、結局平均寿命が伸びただけとも言えるだろう。
まず、技術に対する姿勢が変わる。正直言うとプログラミングとかもうしたくなくなる。というか、そもそも一生プログラミングを仕事にしたいと思う最初の頃は好きだと思っていたが、仕事にしてしばらく経ったら大して好きでもなかったな、と思うようになる。
大して好きでもないことを仕事にし続ける体力はやはり年とともになくなり、体力がなくなった分「自分が本質的にしたいと思うこと」が見えてくる。そしてそれはプログラミングではないため、ギャップがきつくなっていく。
おそらく、この辺が35歳くらいのあたりに来るのではないだろうか。35歳定年説と言ったら35歳ピッタリしか想像できないのが離散数学の世界で生きているプログラマらしいといえばらしいが。
そんな感じでやってても、20年もやればそれなりにスキルも身につく。さすがにGoogleの一線で働くような大天才たちと渡り合うことはできないが、もしかしたらGoogleの片隅で働ける程度のスキルはあるかもしれないが、正直もういいっす、っていう気持ちのほうが大きくなる。
次に、自分がどうにか身につけてきた知見というものがなかなか広まらない。コンセンサスが取れない、という状況にも苦しくなってくる。
自分がやってきたプロジェクトでこういうことをやったらうまく働いた、というような知見は共有するが、なかなか価値観が共有できないことに気がつく。若いうちは「だったら俺が全部やりますわ」くらいの気合を見せられたものだが、年を取ってくると「あ、そうですか・・・」となってしまう。純粋に体力も気力もなくなっていく。
プログラミングをやっているだけありみんな論理的な思考が大変上手だ。「皆さんホント論理的でいはりますなぁ」と言いたくなるわけだが、悲しいことに自分たちの振りかざす論理が、単なる正論、飛躍、極論、屁理屈、と言ったものであることに気づけない人も結構多い。こういうのを各個撃破するのも疲れる。
これからプログラミングを仕事にする人たちに言っておきたいことがある。もしこの世界で長く働きたい、定年までコード書いていたい、と思うなら、常に勉強をしなくてはならない。もしあなたがFラン出ているなら、他の人の倍努力しなくてはならない。できないならそこそこで転職したほうがいい。この世界にいるといかに若いうちの勉強が大事だったかを日々痛感する。
実務の上での俺の感じていることを書く。DDDだとかクリーンアーキテクチャだとかも大事だがもっとそれ以前に俺が根源的に重要だと考えているポイントだ。この辺をないがしろにしたらDDDもクリーンアーキテクチャも絶対に崩壊する。
まず、心得てほしいのはどんなにすごいプログラマでも意図の通じないコードは本当の意味で直せないということだ。
まず、引数チェック、状態チェックは必ずやれ。コードが語る、というようなことを言ってやらないやつが昔は多かったが、今もいるんだろうか。悲惨なバグやメンテナンス性の低下はそういった自分の意図の表明を横着したコードから起こり始める。「俺はこれをやる、だからこの機能を呼び出すならこういう状態にした上でこういう情報を渡せ、じゃないならやらない」とはっきり言え。もしこの辺を冗長だと考える同僚がいるならもう辞めたほうがいい。
引数チェックや状態チェックのコードで画面の半分が埋まったならそのコードは設計がおかしい。一旦手を止めてよく考えろ。一つの機能を動かすのにそんなに引数がいるのか、そんなにチェックする状態が多いのか、そしてそれらは本当に必要か検討しろ。
テストコードは絶対に書け。テストコードが書けない技術は絶対に使うな。意味のあるテストが書けないならやめたほうがいいという輩もいるが、とにかく意味があろうとなかろうと書け。引数にこれを入れたらこうなる、こういう状態でこういう事したらこうなる、というお前の意図はとにかく示せるだけ示せ。
だいたいこの辺を横着したやつは翌年酷く後悔するか、そこのメンテを担当した同僚を攻撃している。
コードが書けなくても大丈夫、という会社は、コードが書けたほうが有利な会社ではなく、本当にコードを書かない会社だというこは肝に銘じておけ。身につくスキルはEXCELの方眼紙を最低限の手数で作れるようになることか、本気でやればビジネスを理解できるかもしれないが、お前の技術者としてのキャリアはそこで止まる。
仮に憧れのスーパーハッカーがいる会社を目指しているとして、彼らがそこでどう働いているか、なにが泥臭いのかを想像できない、聞くことができないならやめておけ。浮かれ過ぎだ。
仮にGithubのURLを教えろという会社を目指しているとして、そこのリポジトリを飾り立てようと考えたならやめておけ、そういう会社はGithubにアウトプットすることを日常的な趣味として苦ではなくやり続けられる人を求めている。
年収をその会社の選択基準にしているならそこはおまえには分不相応な会社だからやめておけ。仮に入れたとしても馴染めることはまず無い。これは年収が低くても同じだ。
嫌いな人がいるならその会社はやめていい
コメントを観てこの「最小且つ単一の論理でなにか否定できた気になる」という輩への対処が一番疲れる
一晩立ってみたらこんなにブクマついててびっくりした。気になったブコメもあったのでちょっと追記しておく。
いきなり視点がミクロに、と言うやつなんだが、結局若いうちにこういうのできてないやつはあとで苦労するが、最初のうちは体力でカバーできている。体力でカバーできなくなったときに本当の意味でつけを払う羽目になるという意味で言ったり、あとオレみたいなおっさんが大変つらい思いをする、という意味でも言っている。
Fラン関係なくねっていうやつだが、昭和世代のステレオタイプかもしれない、ごめん。勉強する習慣もなければ大してやってきてもいないやつはこの業界だと倍苦労する羽目になるというふうに言いたかったと思う。どんな業界でもそうだとは思うが。
返す刀で結論づけしたがる人々がやっぱり現れるな、君たちはそう思わない人なんだろうし議論する気もないが何かしら言いたい人なんだろう。別にそれはそれでいいよ。お仕事頑張ってね。
「俺は大して辛くないけどなー」っていう人もやっぱり現れるな。辛くないんだったらいいことだと思う、お仕事頑張ってね。
4Kモニターでものすごく細かい文字を読んでいる若者を見た、という人、俺も同意する。もう見ていられないんだよね。
関白宣言っぽいな、というのは俺も思った。
結局の所、プログラマ35歳定年説は俺も打ち破りたいと思っていた口なんだが、打ち破れる人とそうでない人がいる、ということで、俺は後者だった、ということだ。当然50過ぎてもプログラマやっている人は見かけるので、数学的な真理というわけではなく、統計的な傾向なんだろうと思っている。
若いうちから、いい環境で働かないと、気持ちのほうがどこかで先にギブアップする。いくら大好きで転職だと思う仕事だとしても、体力や若さで捻じ曲げていることはなかなか気づかない。色んな本を読んで客観的な指標で判断したほうがいい。
遺言とか言って書いておいて追記したら俺はソンビか亡霊なんだろうか?
びっくりした。こんなおっさんの愚痴みたいなエントリーがこんなにブクマされるとは思ってなかった。いくつか気になったブコメがあったのでやはり書いてみたくなったので書く。
まず、この遺言を最後にいなくなるのかという話だが、おそらくいなくなる。ゾンビで居続ける体力ももはやない。
次の準備はすでにしている。それは俺が本質的にやりたかったことに近いことだと思うのをピックアップしている。
本質的にやりたかったことって何かという話なんだが、まず俺が感じるプログラマーという仕事は「良き作り手であり続けること」が根本的なモラルだと思っている。若手で右も左もわからないような状態でも、それこそやっとフィズバズが理解できたような状況でも今持っているレベルで最大限にできうる一番いいものを模索し続ける仕事だと思っている。初心者にはチェックコード書け、意図はできるだけ込めろというのはそういう意味でもある。これを真正面から受け止めてくれる職場を探したほうがいいというのは追加しておきたい。
プログラム論とかそういう話がしたいんじゃないということだけは言っておく。
俺も体力があるうちは良きつくり手を目指していたのだが、本質的にやりたいこと、もうちょっと言うなら、俺のモラルの軸は作ることにではなく使うことにあった。プログラミングというアクティビティを挟んでこっちにつくり手がいてあっちに使い手がいる。仕組みを理解して作るのがプログラマーなら、作ったプログラムを理解してよりよい日常を模索するのが使い手、と言ってもいいかもしれない。いいフィードバックループのあっちとこっち、と言ってもいいかもしれない。俺は「良き作りてが使ったものを使う良き使い手でいたい」ということに気づいたので、遺言を書くことにした。少なくともこれに気づいた時点でプログラマーとしての俺は死んだ。
まだ直感的なものでしか無いので、うまく言語化できていないのは申し訳ないんだが、今後10年位はそれを模索していくのではないだろうか。
お前は浅学非才無能怠惰であるが、親の教育の賜物で国立大学に入れた。
しかしデータサイエンティストになりたいなどと夢を見たせいでお前のスキルはボロボロである。まず、お前の学部で学ぶ、経済学であるが、経済学はマクロ経済学もミクロ経済学もテスト問題を解けるようにしただけで本質は掴めず、データサイエンスに少しでも近づこうと取った計量経済学の講義はコーディングのテストは余裕でクリアしたが、面接で理論を答えられず落単した。
プログラミングは学部のまわりのやつらよりは多少できたが、それでも1番ではなく、当然外の世界を見れば、底辺もいいところである。
肝心の機械学習についてであるが、情報学部のパターン認識の講義をとったものの、ただコードが動くように書き、手書きの数字を識別できるようになっただけで、SVMの理論的背景もNNがなんたるかということも理解できぬまま、C評価の単位がきたのみである。
かといって努力せず、まわりの人と交流することもなければ、無理やり実績を作ってインターンに行くようなこともしなかった。
よくて数行のコードとGoogle Analyticsを使う程度の仕事しかできないお前はそうして雪かきをして一生を終えるだろう
学部1, 2年でやること。
3, 4年からはロボットとか人工知能みたいに専門を決めていくらしい。
日本の情報系も変わらないのかな?まあ、あんまり知らないけど。
以下そのリンク。
そのslideshareの人はただのgiftedなのでもう少し他のを参考にした方がいいと思う。
機械学習に興味を持ってビショップ本に行くのもあまりお勧めできない。
過剰にベイジアンだし実際問題あそこまで徹底的にベイズにする必要は無いことも多いから。
よく知らんけどMRIとかの方面もだいぶ魑魅魍魎なので(DTIとか微分幾何学的な話がモリモリ出てくる)、
近づくなら覚悟と見通しを持ってやった方がいいんじゃないかなあという気はする。
オライリーの本は読んだことないけど悪くなさそう。「わかパタ」とか「続パタ」とかは定番でよい。
ビッグデータがどうとか世間では言ってるけど、データのビッグさはあんま気にしなくていいと思う。
ビッグデータを処理するためのインフラ技術というものはあるけど、数理的な手法としては別に大して変わらない。
(オンライン学習とか分散学習とかの手法はあるけど、わざわざそっち方面に行く意味も無いと思う。
超大規模遺伝子データベースからパターン検出したい、とかだとその辺が必要かもしれないけど…)
数学については、線形代数は本当に全ての基礎なのでやはり分かっておくとよい。
「キーポイント線形代数」とか「なっとくする行列・ベクトル」とか、他にも色々わかりやすいいい本がある。
(まあ固有値と固有ベクトルが計算できて計量線形空間のイメージがわかって行列式とかトレースとかにまつわる計算が手に馴染むくらい。ジョルダン標準形とかは別にいらん)
プログラミングはそのくらいやってるならそれでいいんじゃないか、という気はする。行列演算が入る適当なアルゴリズム(カルマンフィルタとか)が書けるくらいか。かく言う俺もあまり人の事は言えないけど。
処理をなるべく簡潔かつ構造的に関数に分割したり、抽象化して(同じ処理をする)異なるアルゴリズムに対するインターフェースを共通化したりとかのプログラミング技術的なところも意識できるとなおよい。
ggplot2は独自の世界観ですげえ構造化してあるんだけどやりすぎてて逆に使いづらい…と俺は思う…。
遺伝子のネットワークとかなんかそれ系の話をし出すと離散数学的なアルゴリズムが必要になってきて一気に辛くなるが、必要性を感じるまでは無視かなあ。
プログラミングの学習は向き不向きが本当に強烈で、個々人の脳の傾向によってどうしたらいいかが結構異なる気がしてる。
向いてるなら割とホイホイ書けるようになっちゃうし、向いてないなら(俺もだけど)試行錯誤が必要になる。
まあせいぜい頑張りましょう。
Web開発などをやっており,文系で修士を出てから就職,最近放送大学に在籍しています.
実際その状況で学位が役に立つのかはわからないので,実践面でコメントします.
基本的には,各技術を支えるメカニズムや,根本にある理論,数学などが大学で学べる特有の内容だと思います.
例えば,離散数学,計算論,アルゴリズムとデータ構造,プログラミング言語論,オペレーティング・システム,リレーショナル・データベースなど.
これらは,具体的に役に立つかというと,例えば深いレベルのチューニングなどでは必要になると思います.内部の構造が影響してくるので.
また,技術,特に新しく出てきたものを素早く理解するためには,体系的に例えば「データベース技術とはこういうものだ」という概念があると非常に役に立ちます.
なので
>トレンド技術を習得しにくくなることは、デメリットが大きいのではと感じる。
また,ソフトウェア工学に関する科目は,意外に大学特有の知識が多いです.
具体的に何が学べるかは,カリキュラムやシラバスが参考になります.逆に見ないと何もわかりません.
基本的には通信制の大学では,時間割はありません.スクーリングは別ですが.
なので,「毎週時間を作って〜〜する」というのは,最終的にはかなりモチベーションを減らしてしまうと思います.
いわゆる一流大学を出た人でも,大学では試験前のみ勉強するなど,気を抜いています.
ちゃんと勉強したいものはいくら勉強しても足りませんが(だから研究というものがあります),
下手に気負いしないで楽にやれば,そんなに大きな負担にはならないと思います.
例えば仕事で半年忙しいことが確定したなら,履修をしなければ良い話です.
基本的には「論理的にものを考えられる」ようにとられがちですが,
専門分野以外のことについては一気に瓦解する人も多いです.
敢えて言うなら,大学を出た後の環境の違いも大きいと思います.
大学を出てストレートに上場企業に入った方は,ずっと頭をつかう立場に配属される場合があります.
そのため,頭を使うこと自体に経験があり,慣れています.そうでない場合ももちろん多いのですが.
今の状況を活かして頭を使っていけば,大学を出なくても十分知性のある人間として尊敬されると思います.
恐らく,私の見立てでは大学を出てもあまり変わらないと思います.
しかし,今そういう思いがあるなら,やってみてはいかがでしょうか.
若く無いと大学に入れないということはないので.
ドットインストールなりrailsのチュートリアルなり、golangなりやって見るんだ。
そうやってブートストラップしていくとどう情報を掴んでいけば良いか分かるようになってくる。
とりあえず学部3年なら簡単なTODOリスト管理アプリを作れるぐらいでバイトも普通に見つかるだろう。
それが難しければ、パソコンのサポートなら出来るだろう。なんでも良いからやらせて貰え。
数学は最低、離散数学でブール代数はきちんと練習すること。あと集合。
ハード系だと
の辺りを意識的に取り組んで欲しい。
その他は、
あたりを読んで、分からないところを先生や詳しい同級生に聞く。
あと、5000万行ぐらいのテキストファイルで、マージソートをUNIXのコマンドでやってみるとかお勧め。
ただし、そうやっていく中で、もし「楽しい」と思えない時間が3ヶ月〜半年なり続くようであれば、
適性を求めて (例えば) 経済学部などに行くが良かろう。