web-dev-qa-db-ja.com

数学者へのプログラミングの紹介

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

彼は数学に非常に興味があり、とても上手で、プログラミングを楽しんでくれると思いますが、彼はそれを試す気がありません(編集です試してみたいが、前に行ったことがない)。誰かが、数学の問題を解決したり、ある種の数学に関与したりするために、プログラミングで手を出すことができる言語やツール(私が想定するかなり基本的なレベル)を提案してくれませんか。

彼は数学をとても楽しんでいると言いますが、プログラミングを楽しんでくれると思いますが、問題は、メモリ割り当てなどの入門レベルでは関係のないものに彼を先延ばしにしたくないということです。私はそれが非常に重要であることを知っていますが、要点は、彼に数学を使って少しプログラミングを学びたいと思っているということです。

編集:彼は完全に興味がないというわけではありません-彼が以前にその地域を積極的に探索したことがないということより、おそらく彼はそれについて知らされていないのでしょう。私は彼に彼がしたくないことを強制したくありません、私はこれを小さなプッシュのように見て、彼がプログラミングについて学ぶことができるようにします。彼が気に入らない場合-十分に公正で、私はそれを制御できず、したくありませんが、彼がそれを楽しむことが判明した場合-このプッシュは正しいことでしょう。

31
ell

Math Logo

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

Mathematica

Wolfram's Mathematica は彼が興味を持つかもしれないもう1つの興味です。

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.

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

アルゴリズム

アルゴリズム はどのプログラムにとっても重要ですが、バディが言語に慣れたら、これらのプログラムから始める必要があります。ここにいくつかのリンクがあります:

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

60
Dynamic

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

18
AProgrammer

彼が数学を専攻している場合、彼は間違いなくかなりのプログラミングを行うことになります。C++のような低レベルの言語ではないとしても、高レベルの数学固有の言語である Maple または- Mathematica 彼が何をしているかによります。

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

14
aceinthehole

彼にハスケルを教えなさい。数学と同じように考えることができる言語です。

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

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

12
FUZxxl

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

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

プロジェクトオイラーは一連の挑戦的な数学/コンピュータープログラミング問題であり、数学的洞察以上の問題を解決する必要があります。数学はエレガントで効率的な方法にたどり着くのに役立ちますが、ほとんどの問題を解決するにはコンピューターとプログラミングのスキルが必要です。

これは言語固有の提案ではありませんが、プログラミングを始めるための大きな動機になります(特に、すでに数学に関心がある場合)。問題は非常に簡単で親しみやすいものから始まりますが、すぐに非常に扱いにくくなったり、困難になったりします。両方が楽しむ可能性が高い良い挑戦と動機。

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

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

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

10
SHOUBHIK BOSE

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

抽象代数または組合せ論にもっと興味があるなら、複雑な型システムがさまざまな数学の直接プログラミングを可能にするので、彼はおそらくHaskellを望みます。 [〜#〜] ats [〜#〜] もオプションの場合があります。

私は、導入チュートリアルとして Great YouのHaskellを学ぶ とアルゴリズムについて Purely Functional Data Structures をお勧めします。

彼がマトリックス分析、微分方程式、または動的システムに詳しい場合は、 MatlabNumPy 、または Octave をお勧めします。 APLは Dyalog を介しても可能です。でも私は彼については触れません。 数値レシピ 、C++ではアルゴリズムのガイドとして機能するように調整できます。

彼が統計を行いたい場合、 [〜#〜] r [〜#〜] が自然な選択です。

10
World Engineer

私は数学の大学院生で、コンピュータサイエンスの学部生をしました。私は 数学∩プログラミング と呼ばれるブログを続けています。そこでは、数学のプログラミングへの応用(およびその逆)を探っています。そして、コンピュータサイエンスのほとんど数学的でない側面のほとんどが乾燥していて、インスパイアされていない(基本的に、業界での私の経験でシステムプログラミングに入るとんでもないハックのすべてに対する私の反対)。

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

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

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

PythonとMathematicaは非常に親しみやすくなり、Mathematicaは学習ライブラリが最も浅くなっています。これは、すべてのライブラリが素晴らしいドキュメントを備えたニースユーザーインターフェイスにパッケージ化されているためです(F1を押すだけです)。一方、私は聞いたことがある(しかし読んではいない)本の1つがあります 高度な数学への移行とHaskellへの紹介の両方 の両方を提供します。それは肯定的なAmazonレビューを持っているようですので、あなたはそれをチェックしたいかもしれません。彼はC#やJavaなどの言語に移行できます。もし業界のことをやりたいのであれば、ジャングルに入る必要はないでしょう(そして多くの業界の数学のことは純粋なMatlabです)とにかく)。

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

5
JeremyKun

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

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

次にPrologはオフになり、与えられた事実と関係のみを使用して質問に回答できるかどうかを確認し、回答できる場合は回答を伝えます。

それで、「トムは猫」と「すべての猫は動物です」と言って、「動物はトムですか?」と尋ねます。答えは「真」になります。

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

もちろん、構文はそれより少し複雑ですが、一般的な考え方はわかります。

3
Bill Michell

友達に試してみるように勧める最善の方法は、彼がプログラミングしているという事実についてあまり考えずに彼にプログラミングを開始させることかもしれません。

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

SICPは MIT Press web site で自由に閲覧できます。

友達が数学的に傾いていれば、LISPは問題なく、特別な構文を学ぶ必要がなくなります。 LISPはHaskellよりも学習が容易だと思います。

2
The Programmer

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

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

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

1
dsmith

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

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

1
Danny Varod

私はあなたがあなたの友人にいくつかの異なる変種を見せるべきだと思います:

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

CとLISPは良い出発点だと思います。異なる言語が異なるタスクにより適していることを示しています。私はすべてにHaskellやErlangを使うことを信じていません。

単純なプロセッサのマシンコード(またはアセンブラ)も興味深いかもしれません。最初のマシンコードから始めたときはいつも満足しています C64 。 ( MOS 651 )「ムダ」までの時間が限られた大人にはなかなか体験できない体験。

0
MattBianco

あなたの友人がプログラミングを試そうとしないなら、なぜあなたが問題を強制したいのか分かりません。プログラマーになるための鍵は学ぶ意欲があることだと思います。もし彼が学びたくないのなら、プログラミングはおそらく彼には向かないでしょう。

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

もし彼がソースコードに少しでも興味を示したなら、彼に彼自身のものを書く方法を見せてください。個人的には、習得が容易でドキュメントが豊富であれば、言語自体は問題ではないと思います。

0
Rachel

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

0
Bill K

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

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

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

  • 「私はすべての音楽をカタログ化したいし、私が見たどのツールも私が望む方法でそれを行っていない」ので、データベースについて学びます。

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

ドライブが実際に存在するためには、根本的な問題がhimから発生する必要があります。私は問題を見つけようとします解決したいので、彼がソリューションを自動化/プログラムできるツール/言語/システムを選択します。

0
David Weinraub