数学者へのプログラミングの紹介[非公開]


30

私は現在プログラマーであり、ほぼ16歳であり、コンピューターサイエンスの学位または電気工学の学位を含むものにキャリアを絞り込んでいます(かなり異なることを知っていますが、この質問は私の友人に関するものです)友だちはよくわからない。

彼は非常に数学に興味を持って、それで非常に良いですし、私は彼がプログラミングを楽しむだろうと思うが、彼は(それを試して喜んでではありません編集彼はある試してみる気はなく前に行われたことはありません)。数学の問題を解決したり、ある種の数学に関与したりするために、プログラミングに手を出すことができる言語やツールについての提案を誰にも教えてもらえますか。

私は彼が数学をとても楽しんでいると言いますが、私は彼がプログラミングを楽しむだろうと思うので、問題は、メモリ割り当てなどの入門レベルでは関係のないものによって彼を先送りにしたくないことです。私はそれが非常に重要であることを知っていますが、ポイントは、数学を使って少しプログラミングを学んでもらい、興味があればプログラミングとしてプログラミングを学び始めることができることを願っています。

編集: それは彼が完全に無関心であるということではありません-それはおそらく彼が以前に積極的にそのエリアを探索したことがないということです。私は彼に彼がしたくないことを強制することを望まないだろう、私は彼がプログラミングについて学ぶことができるように、これを少しプッシュのように見ている。もし彼がそれを気に入らないなら-十分に公平で、私はそれを制御することはできませんし、望んでいませんが、彼がそれを楽しむことが判明した場合-このプッシュは正しいことでした。


17
なぜあなたはあなたの友人を彼が興味のない方向に押しやりたいのですか?
HLGEM

3
記録のために、私が一緒に働いた多くのプログラマーは数学の学位を持っています。その上、彼らは非常に良いです。
AngryBird

1
@HLGEMに同意します。誰かが純粋で理論的な数学に私を押し付けたなら、私はそれを嫌います。同様に、そのようなものを望んでいる人は、退屈な応用のものに向かってプッシュされた場合、それを嫌います。
ジョブ

4
物事にいくつかの視点を置くために-あなたは16歳です。あなたはプログラマーではなく、プログラミングを行った学生です。あなたの友人は数学者ではありません。彼は数学が好きな学生です。@ perl.jからの回答は気に入っていますが、これについては過剰に説明していると思います。
ジョエルイーサートン

2
@ perl.j:誰かが数学者ではない証拠として必要な「主要な研究分野」を示すために必要な学位を取得するまで。大学で数学を専攻している人でさえ、まだ数学者ではありません。
ジョエルイーサートン

回答:


60

数学のロゴ

「数学的な」言語が必要な場合、Haskellはあなたの親友です(親友にとって)。手間をかけずに簡単に新しい関数を作成できます。それは私があなたにあなたに与えることができる最高の言語推薦です。ここにいくつかのリンクがあります:

Mathematica

WolframのMathematicaも彼の興味の対象です。

Mathematica is a computational software program used in scientific, engineering, and mathematical fields and other areas of technical computing. It was conceived by Stephen Wolfram and is developed by Wolfram Research of Champaign, Illinois.

高価ですが、価値があります。ここにいくつかのリンクがあります:

アルゴリズム

アルゴリズムはどのプログラムにとっても重要ですが、バディは言語に慣れてきたらこれらから始めるべきです。他のリンクを次に示します。

お役に立てれば!ご質問やフィードバックがある場合は、お気軽にコメントしてください!ところで、これらのリンクはすべてリソースを解放するためのものです。印刷された本が必要な場合は、いくつかの推奨事項がありますが、コメントを残してください!



2
私は数学を専攻しており、数学の観点からすごいものとしてHaskellをお勧めできます。また、ほとんどの言語よりもはるかに多くの理論的なものを読むことも好きです。
テオベレール

2
彼はHaskellのを学習した場合、彼は後にもに進むことができAgdaで証明を行うため、適切な依存的型付けされた言語。
ピーター・C

4
@ SK-logicどうしてそんなことを言えますか?数学とは、新しい論理システムを学び、それについて推論することです(数学者チューリングマシンを発明したことを忘れないでください)。数学を扱うことができる人は、変数突然変異の考えを扱うことができないと正直に思いますか?そして、私のポイントは、Haskellで変数の突然変異のような単純なことを行うには、ストアモナドが必要です!それは単にばかげているよりも簡単だと言うx = x + 1
JeremyKun

2
@Bean、それは実際に割り当てステートメントに対する私自身の最初の反応でした(そして、当時の数学の原始線形方程式以外には何も知りませんでした)。それ以来、同じ反応を繰り返し見ました。私は、プログラミングの経験のない人々に関数型プログラミングの概念を意図的に導入しようとし、徐々に命令的なものに移りました。最初は常に簡単でしたが、すべての「WTF?!?」見た目は常に命令型とOOPの概念の導入でのみ始まりました。
SKロジック

18

関数型プログラミングとMLファミリまたはHaskellの言語は、数学者の心に非常によく適合する傾向があります。


本当だ!無限のリストと数学の心に最適なすべて。

14

彼が数学を専攻している場合、C ++などの低レベル言語ではなく、数学に特化した高レベルの数学、MapleMathematicaなどの言語に依存していなければ、間違いなくかなりのプログラミングを行うことになります。

また、研究分野によっては、応用数学または静的解析を行う場合がありますが、どちらもかなりの量のプログラミングが必要になります。彼は、彼が何を決めたかに関係なく、今すぐプログラミングに慣れる必要があります。


1
また、Sage(sagemath.org)でPythonを彼の心に忍び込ませることもできます。
アントンバルコフスキー

数学固有のより高いレベルの別の言語を次に示し
RyanTM

彼にプログラミングの発見を許可してください。彼がそれにさらされて、数学特有の言語で何かをすることを彼に要求する何かをすることを彼が確かに要求されるとき、彼はそれを好むか嫌うでしょう。これが起こったときに彼がそれを好めば、彼は彼に最適な言語を選択することができます。それはあなたがあなたの友人を助けてはいけないということではなく、興味を示していないなら、あなたはそれを落とすべきです。
ラムハウンド

12

彼にハスケルを教えてください。数学のように考えることができる言語です。

  • 関数は、入力を出力にマップするものです
  • スタッフは必要に応じて評価されます
  • 型推論とクレイジーな型システム
  • 便利な構文
  • 素晴らしいコミュニティ(StackOverflowなど
  • モナド

Haskellの最高のチュートリアルの1つである彼にhttp://learnyouahaskell.comを見せることをお勧めします。


11

数学を学んで(私は純粋な数学で理学士号を取得し、応用数学/統計学で修士号を取得しました)、後で私のキャリアの中でプログラミングの楽しさ/実用性/重要性を理解した人として、この質問に本当に感謝しています。10年前にあなたのような友人が私をプログラミングに向かわせてくれたらと思います。

両方ともProject Eulerをチェックアウトする必要があります。それは何ですか?

Project Eulerは、数学/コンピュータープログラミングの一連の困難な問題であり、解決するには単なる数学的な洞察以上のものが必要です。数学はエレガントで効率的な方法を見つけるのに役立ちますが、ほとんどの問題を解決するにはコンピューターの使用とプログラミングのスキルが必要です。

言語固有の提案ではありませんが、プログラミングを始めるための大きな動機付けになります(特に数学に興味がある場合)。問題は非常に簡単で親しみやすいものから始まりますが、すぐに非常にトリッキーかつ/または困難になります。両方が楽しむ可能性が高い良い挑戦と動機。

どの言語を使用するかについては、数学コミュニティで広く使用されているC ++、R、Matlab、およびMathematicaの経験があります。しかし、より具体的には、数学に非常に役立つが、他のいくつかのように数学に制限されていないPython学ぶことを強くお勧めします(将来彼がより多くのオプションを望んでいる場合)。Pythonを使い始めるのは簡単ですが、学ぶべきことがたくさんあります。他の一部とは異なり、無料です。C ++も良い選択かもしれませんが、最初からより多くのハードルがあるかもしれません。


プロジェクトオイラーの+2は、私があなたの答えを見るまで、メインの質問にコメントとして追加するつもりでした。OPと彼の友人は間違いなく一緒にこれに入るべきです。
コバルトダック

10
  • 数学者にとって、最大の成果はアルゴリズムです。あなたの友人はPythonでそれらを実装し始めなければなりません(その友好的)。

  • MATLABのような数値計算環境は、行列の操作、関数とデータのプロット、アルゴリズムの実装に役立ちます。


10

それは彼が興味を持っている数学の分野に依存します。

彼が抽象代数や組み合わせ論にもっと興味があるなら、彼はおそらくHaskellを好むでしょう。複雑な型システムはさまざまな数学の直接プログラミングを可能にするからです。ATSもオプションです。

イントロチュートリアルとアルゴリズムの純粋に機能的なデータ構造のために、Haskellを大いに学ぶことをお勧めします

マトリックス分析、微分方程式、または動的システムにもっと興味があるならMatlabNumPy、またはOctaveをお勧めします。APLはDyalog経由でも興味があるかもしれません。私はそれで彼を開始しませんでしたが。Numerical Recipesは、C ++ではアルゴリズムの優れたガイドとして機能するように適合させることができます。

統計を行いたい場合は、Rが自然な選択です。


5

私は数学の大学院生で、コンピューターサイエンスの学部を卒業しました。Math∩Programmingと呼ばれるブログを開いて、数学のプログラミングへの応用(およびその逆)を探ります。私の業界での経験でシステムプログラミングを行うとんでもないハックのすべて)。

一方、私のブログでは、顔認識(かなり線形代数)、暗号化方法、チューリングマシン、セルオートマトン、シリアルキラーアクティビティを予測するためのモデル、検索エンジン、その他の数学的概念のような問題に注目しています。 。最良の部分は、私がアイデアを実装できるようになることです。

他の人と同じようにあなたの友人にプログラミングを愛させるには、彼が本当に面白いと思うプロジェクト。プログラミングの側面は、彼が美しいと感じる製品に向けて努力することなしには固執しません。言語に関しては、Mathematica、Racket(非常に友好的だが強力なScheme派生物)、Python、およびHaskellをお勧めします。Mathematicaはおそらく最高です。彼は独自の数学関数を選択的に実装し、Mathematicaの組み込みライブラリを使用してプロジェクトを完了することができるためです(たとえば、フーリエ係数を計算する関数を作成し、Mathematicaを使用して残りの分析を行うなど)フィルタリング、画像生成など)。統合のような基本的なトピックでさえ、いくつかの魅力的なプロジェクトを提供します(異なる求積規則、モンテカルロ統合、大きなデータセットを使用した機械学習への穏やかな移行)。

また、ここでの回答の多くは、数学をしない人、または数学ソフトウェアを行うために提案している言語を使用していない人からのものであるようです。人々がHaskellを推奨する理由は、それが可能な限りカテゴリー理論の文字通りの実装に近く、いくつかの基本的な概念のいくつかの数学的な定義によく適合するためです。あなたの友人が近くにあなたの年齢にある場合でも、その後、彼は数学的に圏論のための準備ができていない(成熟度は、多かれ少なかれ役に立たない大学院まで、そして邪悪なハード自分自身を教えることであること)、そして第一言語としてHaskellはあり最も急提案された言語の学習曲線(おそらくPrologはより急です)。Haskellを使用してJavascriptコンパイラを実装しましたが、非常に美しいエレガントなコードになりましたが、変数の突然変異などの直観的なもののためには、重要なモナドに手を出さなければなりません。

PythonとMathematicaははるかに使いやすく、すべてのライブラリが素晴らしいドキュメントを備えた素晴らしいユーザーインターフェイスにパッケージ化されているため、Mathematicaは最も浅い学習曲線を持っています(F1を押すだけです!)。一方、私が聞いた(しかし読んでいない)本には、高度な数学への移行とHaskellの紹介の両方を同時に提供しているものがあります。アマゾンで好評を博しているようですので、ぜひチェックしてみてください。業界のものをやりたいと思ったら、C#やJavaなどの言語に移行できますが、そのジャングルに入る必要はないでしょう(そして、とにかく多くの業界の数学のものは純粋なMatlabです)。

しかし、私が言ったように、正しいプロジェクトで言語を学ぶことは、プロジェクトが何であれ、喜びになります。


3

あなたの友人が正式な論理を楽しんでいて、人工知能が面白いと思うなら、彼はPrologを見てみたいかもしれません。

この言語では、述語(初期仮定、「事実」)と推論規則(「関係」)を述べてから質問します。

次に、Prologはオフになり、与えられた事実と関係だけを使用して質問に回答できるかどうかを判断し、回答できる場合は回答を示します。

あなたは「トムは猫だ」と「すべての猫は動物だ」と言い、「トムは動物ですか?」と尋ねます。答えは「true」になります。

または、「知っているすべての動物を一覧表示する」ように依頼すると、単一のアイテムリスト「tom」が表示されます。

もちろん、構文はそれよりも少し複雑ですが、一般的なアイデアを得ることができます。


Prologは1階のロジックにイライラさせられますが、「未確認」と「偽」を区別する方法がないため、実際には互換性がありません。いくつかの点ではきちんとした言語ですが、数学者に押し付けてプログラミングロジックとは呼びません。
デビッドソーンリー

単純に否定をテストすることはできませんか?
ビルミシェル

2

友人に試してもらうように勧める最善の方法は、友人がプログラミングをしているという事実をあまり考えずにプログラミングを開始することです。

彼が「プログラミング」をもっと処理する準備ができたら、同じ本から始めて、より数学的な基礎からプログラミングを学ぶことができます。私の現在のお気に入りの本は次の2つです。

SICPは、MIT PressのWebサイトで自由に閲覧できます

もしあなたの友人が数学的に傾いていれば、Lispは困難を示さず、特別な構文を学ぶ必要からあなたを解放します。LispはHaskellよりも学習しやすいと思います。


1

Haskellには同意しますが、実用的な観点から、彼は広く使用されている抽象マシンで言語を学ぶべきです。もちろん、JVM言語または.NET言語を意味します。

これらのプラットフォームには、主力言語よりも少し興味深い言語があります。JVMでClojureとScalaを見てください。.NETプラットフォームでは、F#をご覧ください。

c-omegaと呼ばれるMicrosoft Researchの.NET言語もありましたが、これは非常に興味深いものでしたが、単なる研究プロジェクトでした。


1

Matlabは一般に数学および科学プログラミングに使用されます。これはスクリプトベースの言語であり、学ぶのは難しくなく、すべてのメモリの問題はユーザーから隠されています。

ソフトウェア工学と電気工学は、コンピューター工学に組み合わせることができます。


0

あなたの友人がプログラミングを試してみたくない場合、なぜあなたは問題を強制したいのかわかりません。プログラマーになるための鍵は、喜んで学ぶことであり、もし彼が学びたくない場合、プログラミングはおそらく彼にとってはないでしょう

しかし、そうは言っても、あなた自身が小さなプログラムを作成し、それを彼に見せることが最善の策かもしれません。おそらく、それのいくつかの部分を未完成のままにして、あなたが彼にあなたがそれを終えるのを手伝うことに興味を持ってもらうことができるかどうか見てください。私は私にとって知っている、プログラムの背後にあるアルゴリズムとロジックは構文を書くよりもはるかに興味深いので、おそらく彼にプログラムのロジックを手伝ってもらおうとしますその結果。

もし彼がソースコードにまったく興味を示したら、彼に彼自身のものを書く方法を見せてください。個人的には、習得しやすく、ドキュメントが豊富にある限り、言語自体は重要ではないと思います。


0

Pythonを中心に構築された完全な無料の数学ライブラリとコミュニティがあります。私は「Sage」から始めて、彼はそれを使うのを本当に楽しむべきであり、ついでにPythonでプログラミングを学ぶでしょう。


0

私はあなたの友人にいくつかの異なるバリエーションを見せるべきだと思う:

  • C
  • LISP /スキーム
  • ベーシック
  • ボーンシェル
  • プロローグ

CとLISPは良い出発点であり、異なる言語が異なるタスクにより適していることを示していると思います。HaskellやErlangをすべてに使用することは考えていません。

単純なプロセッサのマシンコード(またはアセンブラ)も興味深いかもしれません。私は最初のC64でマシンコードを使い始めたことにいつも満足しています。(MOS 6510)「浪費」する時間が限られている大人として取得するのが難しいハンズオンエクスペリエンス。


私は反対しなければなりません。数学に興味のある若い子供が、マシンコードに惹かれるのはなぜですか?そしてなぜCなのか?アセンブリは、プロセッサに関する知識が多すぎると考えています。Cは同様に、ポインター、レジスター、スコーピング、型など、深刻なプログラミングを学びたい人に任せるのに最適な多くの要件を作成します。そのような人のためのプログラミングの最初の紹介として、アルゴリズムまたは数学的なアイデア(確率、ランダム性、シミュレーション)のアプリケーションに焦点を当てたものがはるかに優れています。Python、Lisp / Forth、Basicさえも。ボーンシェル?? なぜ?...
アサドエブラヒム

0

私にとって、プログラミングとは、「何かをする」、「もしも」ということから始まります。質問:

  • 「自分のWebサイトを作りたい」ので、HTMLなどについて学びます。

  • 「Xをクリックしなければならない、またはこのWebサイトにアクセスするたびにYが表示されるのが嫌いです。それを自動化する方法はありませんか?」そのため、ブックマークレットやブラウザ拡張機能の作成について学びます。

  • 「すべての音楽をカタログ化したいのですが、これまで見たどのツールも思い通りの方法でカタログを作成したくない」ので、データベースについて学びます。

  • 「数学クラブの費用を追跡したい」ので、スプレッドシート、プログラミングマクロ、またはデータベースについても学習できます。

ドライブが本当にそこにあるためには、根本的な問題がから来なければなりません。が解決したい問題見つけて、ソリューションを自動化/プログラミングできるツール/言語/システムを選択します。


-2

私の意見では、HaskellとMathematicaが道のりです。ほとんどの関数型言語は数学にも適しています。Pythonも優れています数学のドキュメントをご覧ください。

このモジュールは常に利用可能です。C標準で定義されている数学関数へのアクセスを提供します。

これらの関数は、複素数では使用できません。複素数のサポートが必要な場合は、cmathモジュールの同じ名前の関数を使用してください。ほとんどのユーザーは、複素数を理解するのに必要なほど多くの数学を学びたくないので、複素数をサポートする関数とそうでない関数を区別します。複雑な結果の代わりに例外を受け取ると、パラメーターとして使用される予期しない複素数を早期に検出できるため、プログラマーはそもそも生成された方法と理由を判断できます。

このモジュールでは、次の機能が提供されます...

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.