Introdução à programação para um matemático [fechado]

30

Atualmente, sou programador, tenho quase 16 anos e reduzi minhas carreiras para algo que envolva um diploma em Ciência da Computação ou Engenharia Elétrica (eu sei que eles são bem diferentes, mas essa pergunta é sobre meu amigo), mas meu amigo não tem tanta certeza.

Ele está muito interessado em matemática e é muito bom nisso, e acho que ele gostaria de programar, mas não está disposto a tentar ( editar, ele está disposto a tentar, mas nunca o fez antes). Alguém pode me dar uma sugestão para uma linguagem ou ferramenta que ele possa usar na programação (em um nível razoavelmente básico, eu assumo) para resolver problemas de matemática ou envolver algum tipo de matemática.

Como eu digo, ele gosta muito de matemática, mas acho que ele gostaria de programar, o problema é que não quero que ele se deixe levar por coisas que não são relevantes nos níveis introdutórios, como alocação de memória et al. Eu sei que isso é muito importante, mas o ponto é que eu quero que ele aprenda um pouco de programação com matemática, então, se estiver interessado o suficiente, pode começar a aprender programação como programação.

Edit: Não é que ele esteja completamente desinteressado - mais do que ele não tenha explorado ativamente a área antes, talvez porque não esteja informado sobre isso. Eu não gostaria de forçá-lo a fazer algo que ele não quer; vejo isso como um pequeno empurrão para que ele possa aprender sobre programação. Se ele não gostar - é justo, eu não posso controlar isso e não quero, mas se ele se divertir - esse empurrão será a coisa certa.

ell
fonte
17
Por que você quer empurrar seu amigo em uma direção em que ele não está interessado?
HLGEM
3
Para constar, muitos dos programadores com quem trabalhei têm diplomas de matemática. Além disso, eles são muito bons.
AngryBird
11
Eu concordo com @HLGEM. Eu odiaria se alguém me empurrasse para uma matemática pura e teórica. Da mesma forma, aqueles que gostariam dessas coisas odiariam se fossem empurrados para as coisas chatas aplicadas.
Job
4
Para colocar uma perspectiva sobre as coisas - você tem 16 anos. Você não é um programador, é um estudante que fez alguma programação. Seu amigo não é matemático, é um aluno que gosta (e aprendeu um pouco) de matemática. Embora eu goste da resposta de @ perl.j, acho que você pode estar exagerando nessa questão.
Joel Etherton
2
@ perl.j: Até que alguém tenha o grau necessário para mostrar a "área principal de estudo" necessária como evidência, ele não é um matemático. Mesmo alguém na universidade, que é majoritário em matemática, ainda não é matemático.
Joel Etherton

Respostas:

60

Math Logo

Se você quer uma linguagem "matemática", Haskell é seu melhor amigo (para seu melhor amigo). Você pode facilmente criar novas funções sem problemas. É a melhor recomendação de idioma que posso oferecer a você, amigo. Aqui estão alguns links:

Mathematica

O Mathematica de Wolfram é outro interesse que ele pode ter.

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.

Embora seja caro, vale a pena. Aqui estão alguns links:

Algoritmos

Os algoritmos são importantes para qualquer programa, mas seu amigo deve começar com eles quando se sentir confortável com um idioma. Aqui estão mais alguns links:

Espero que isto ajude! Se você tiver alguma dúvida ou feedback, sinta-se à vontade para comentar! A propósito, todos esses links são para liberar recursos. Se você quer um livro impresso, tenho algumas recomendações, deixe um comentário!

dinâmico
fonte
2
Sou formado em matemática e posso recomendar Haskell como impressionante do ponto de vista matemático. Também gosto de ler algumas das coisas teóricas que a acompanham, muito mais do que a maioria das línguas.
Theo Belaire
2
Se ele aprende Haskell, ele pode mais tarde até mesmo passar para Agda , uma linguagem dependente-digitado adequado para fazer provas no.
Peter C
4
@ SK-logic Como você pode dizer isso? A matemática tem tudo a ver com aprender novos sistemas lógicos e raciocinar sobre eles (não esqueça que os matemáticos inventaram a máquina de Turing). Você honestamente acha que alguém que pode lidar com matemática não pode lidar com a idéia de mutação variável? E o que quero dizer é que fazer algo tão simples quanto a mutação variável em Haskell requer uma mônada de loja! Dizer que é mais fácil do que x = x + 1ridículo.
JeremyKun
2
@ Bean, essa foi realmente a minha primeira reação a uma declaração de atribuição (e eu não sabia nada além de equações lineares primitivas da matemática naquela época). Desde então, vi a mesma reação repetidamente. Eu deliberadamente tentei introduzir conceitos de programação funcional para aqueles que não tinham experiência anterior em programação, passando gradualmente para as coisas imperativas. Sempre foi fácil primeiro, e todo esse "WTF?!?" parece sempre iniciado apenas com a introdução dos conceitos imperativos e OOP.
SK-logic
18

Programação funcional e linguagens na família ML ou Haskell tendem a se encaixar muito bem na mente dos matemáticos.

AProgrammer
fonte
Muito verdadeiro! Listas infinitas e tudo o que é ótimo para as mentes da matemática.
14

Se ele se especializa em matemática, ele sem dúvida acabará fazendo um pouco de programação, se não em linguagens de baixo nível como C ++, então em um nível superior, específico de matemática, linguagens como Maple ou Mathematica, dependendo do que está fazendo.

Além disso, dependendo de sua área de pesquisa, ele pode acabar fazendo matemática aplicada ou análise estática, os quais exigirão uma quantidade significativa de programação. É melhor ele se acostumar à programação agora, independentemente do que ele decidir.

aceinthehole
fonte
11
Você também pode tentar furtar o Python à mente dele com Sage ( sagemath.org ).
Anton Barkovsky
Aqui está outra linguagem específica de matemática de nível superior: math.uiuc.edu/Macaulay2
RyanTM
Eu sugiro que você permita que ele descubra a programação. Quando ele é exposto a ele, e certamente precisará fazer algo que exija que ele faça algo em uma linguagem matemática específica, ele vai gostar ou odiar. Se ele gostar quando isso acontecer, ele poderá selecionar os idiomas que melhor lhe convier. Não é que você não deva ajudar seu amigo, se não demonstrou interesse, você deve abandoná-lo.
Ramhound 18/11/11
12

Ensine-o Haskell. É uma linguagem em que você pode pensar como na matemática:

  • Uma função é algo que mapeia a entrada para a saída
  • O material é avaliado conforme necessário
  • Inferência de tipo e um sistema de tipos malucos
  • Sintaxe conveniente
  • Ótima comunidade (por exemplo, no StackOverflow )
  • Mônadas

Eu sugiro que você mostre a ele http://learnyouahaskell.com , um dos melhores tutoriais para Haskell.

FUZxxl
fonte
11

Como alguém que estudou matemática (eu tenho um bacharelado em matemática pura e acabei de receber meu MS em Matemática Aplicada / Estatística) e depois percebi a diversão / praticidade / importância da programação ao longo da minha carreira, eu realmente aprecio essa pergunta. Eu gostaria de ter um amigo como você há 10 anos para me empurrar para a programação.

Você deve verificar o Project Euler . O que é isso?

O Project Euler é uma série de problemas desafiadores de matemática / programação de computadores que exigirão mais do que apenas insights matemáticos para resolver. Embora a matemática o ajude a chegar a métodos elegantes e eficientes, será necessário o uso de um computador e habilidades de programação para resolver a maioria dos problemas.

Embora não seja uma sugestão específica da linguagem, seria um grande motivador para começar a programar (especialmente se já houver interesse em matemática). Os problemas começam muito fáceis e acessíveis, mas rapidamente se tornam muito difíceis e / ou difíceis. Um bom desafio e motivação que vocês provavelmente irão gostar.

Quanto à linguagem a ser usada, tenho experiência com C ++, R, Matlab e Mathematica, que são excelentes e amplamente utilizados na comunidade matemática. Mas, mais especificamente, sugiro fortemente o aprendizado de Python, que é muito útil para a matemática, mas não é tão restrito à matemática quanto alguns outros (caso ele queira mais opções posteriormente na vida). É fácil começar a usar o Python, mas há muito o que aprender. Também é gratuito, diferente de alguns outros. O C ++ também pode ser uma boa escolha, mas pode ter mais obstáculos desde o início.

bnjmn
fonte
+2 para o Projeto Euler, adicionaria como comentário a questão principal até que eu visse sua resposta. OP e seu amigo definitivamente deveriam entrar nisso juntos.
Cobaltduck 17/06/2013
10
  • Para os matemáticos, a maior excitação é o algoritmo. Seu amigo deve começar a implementá-los em Python (é amigável).

  • Ambientes de computação numérica como o MATLAB serão úteis para manipulação de matrizes, plotagem de funções e dados, implementação de algoritmos.

SHOUBHIK BOSE
fonte
10

Depende da área de matemática em que ele está interessado.

Se ele gosta mais de Álgebra Abstrata ou Combinatória, provavelmente gostaria de Haskell, pois o sistema complexo de tipos permite a programação direta de uma variedade de matemáticas. ATS também pode ser uma opção.

Eu recomendaria Learn You a Haskell for Great Great para um tutorial de introdução e estruturas de dados puramente funcionais para Algoritmos.

Se ele gosta mais de análise matricial, equações diferenciais ou sistemas dinâmicos, recomendo Matlab , NumPy ou Octave . APL é via Dyalog também pode ser interessante; embora eu não o iniciasse nisso. Receitas Numéricas , enquanto em C ++, podem ser adaptadas para servir como um bom guia para algoritmos.

Se ele quer fazer Estatística, então R é a escolha natural.

Engenheiro Mundial
fonte
5

Sou estudante de graduação em matemática e fiz minha graduação em ciência da computação. Eu mantenho um blog chamado Math ∩ Programming no qual exploro aplicações da matemática na programação (e vice-versa), e tenho que admitir que acho a maioria dos aspectos menos matemáticos da ciência da computação bastante secos e sem inspiração (basicamente, minha oposição a todos os hacks ridículos que entram na programação de sistemas na minha experiência na indústria).

Por outro lado, no meu blog, analiso problemas como reconhecimento facial (um pouco de álgebra linear), métodos de criptografia, máquinas de Turing e autômatos celulares, modelos para prever a atividade de serial killers, mecanismos de busca e vários outros conceitos matemáticos . A melhor parte é que eu consigo implementar as idéias, e todas as minhas!

Para fazer com que seu amigo goste de programar como todos nós, ache-o realmente interessanteprojeto. O aspecto da programação não ficará sem ele trabalhar em direção a um produto que ele considera bonito. Quanto aos idiomas, recomendo o Mathematica, o Racket (um derivado do Scheme muito amigável, mas ainda poderoso), o Python e o Haskell. O Mathematica é provavelmente o melhor, porque ele pode implementar seletivamente suas próprias funções matemáticas e usar as bibliotecas incorporadas do Mathematica para concluir o projeto (por exemplo, escreva uma função que calcule os coeficientes de Fourier e use o Mathematica para o restante da análise, como como filtragem, geração de imagens etc.). Até os tópicos básicos como integração oferecem alguns projetos fascinantes (regras de quadratura diferentes, integração monte carlo, uma transição suave para o aprendizado de máquina com grandes conjuntos de dados).

Além disso, parece que muitas das respostas aqui são de pessoas que não praticam matemática ou que não usaram as linguagens sugeridas para fazer software matemático. A razão pela qual as pessoas recomendam Haskell é porque é o mais próximo possível de uma implementação literal da teoria das categorias e se encaixa bem com algumas definições matemáticas de alguns conceitos básicos. Mas se o seu amigo tem quase a sua idade, ele não está pronto para a teoria das categorias matematicamente (essa maturidade é mais ou menos inútil até a faculdade, e muito difícil de ensinar a si mesmo) e, como primeira língua, Haskell é o mais inclinado.curva de aprendizado das línguas sugeridas (talvez o Prolog seja mais íngreme). Eu usei Haskell para implementar um compilador Javascript e acabei com um belo e elegante código, mas para coisas intuitivas como mutação variável, você já precisa se envolver em mônadas não triviais.

Python e Mathematica serão muito mais amigáveis, e o Mathematica tem a curva de aprendizado mais superficial simplesmente porque todas as bibliotecas são empacotadas em uma ótima interface de usuário com documentação incrível (basta pressionar F1!). Por outro lado, há um livro que ouvi (mas não li) que fornece uma transição para a matemática avançada e uma introdução a Haskell simultaneamente . Parece ter avaliações positivas da Amazon, então você pode querer dar uma olhada. Ele pode mudar para linguagens como C # e Java se quiser fazer coisas da indústria, mas é mais provável que ele nunca precise entrar nessa selva (e muita coisa da matemática da indústria é pura Matlab).

Mas, como eu disse, com o projeto certo, aprender o idioma se torna uma alegria, qualquer que seja o projeto.

JeremyKun
fonte
3

Se seu amigo gosta de lógica formal e acha interessante a Inteligência Artificial, ele pode dar uma olhada no Prolog .

Com esse idioma, você declara seus predicados (suposições iniciais, "fatos") e regras de inferência ("relações") e depois faz perguntas.

O Prolog dispara e descobre se a pergunta pode ser respondida usando apenas os fatos e as relações fornecidas e, nesse caso, indica a resposta.

Então você diz que "tom é um gato" e "todos os gatos são animais" e pergunta "é tom um animal?" e você obterá a resposta "verdadeira".

Ou você pode pedir para "listar todos os animais que você conhece" e você obterá a lista de itens únicos "tom".

Claro que a sintaxe é um pouco mais complicada do que isso, mas você entende a ideia geral.

Bill Michell
fonte
O prólogo é frustrantemente próximo da lógica de primeira ordem, mas é realmente incompatível, pois não tem como distinguir "não comprovado" e "falso". É uma linguagem interessante, de certa forma, mas eu não insistiria com um matemático e chamaria de lógica de programação.
David Thornley
Você não pode simplesmente testar a negação?
Bill Michell
2

A melhor maneira de incentivar seu amigo a tentar fazer isso é fazê-lo começar a programar sem pensar muito no fato de ele estar programando.

Quando ele estiver pronto para lidar mais com a "programação", você poderá começar com o mesmo livro e aprender programação a partir de uma base mais matemática. Dois dos meus livros favoritos atuais são:

O SICP pode ser visto livremente no site da MIT Press .

Se o seu amigo é matematicamente inclinado, o Lisp não apresentará nenhuma dificuldade e liberará você de ter que aprender qualquer sintaxe especial. Acho que Lisp é mais fácil de aprender do que Haskell.

O programador
fonte
1

Concordo com Haskell, mas, do ponto de vista prático, ele também deve aprender um idioma em uma máquina abstrata amplamente usada. Quero dizer uma linguagem JVM ou .NET, é claro.

Existem idiomas nessas plataformas que são um pouco mais interessantes do que os idiomas principais. Na JVM, dê uma olhada em Clojure e Scala. Na plataforma .NET, dê uma olhada no F #.

Havia também uma linguagem .NET da Microsoft Research chamada c-omega que era muito interessante, mas era apenas um projeto de pesquisa.

dsmith
fonte
1

O Matlab é comumente usado para programação matemática e científica. É uma linguagem baseada em script, não é difícil de aprender e todos os problemas de memória estão ocultos do usuário.

Engenharia de Software e Engenharia Elétrica podem ser combinadas em Engenharia de Computação.

Danny Varod
fonte
0

Se seu amigo não estiver disposto a tentar programar, não vejo por que você deseja forçar o problema. Eu acho que a chave para ser um programador é estar disposto a aprender, e se ele não estiver disposto a aprender, provavelmente a programação não é para ele

Mas, dito isso, sua melhor aposta pode ser criar um pequeno programa e mostrar a ele. Talvez deixe algumas partes inacabadas e veja se você pode interessá-lo em ajudá-lo a terminar. Sei por mim que os algoritmos e a lógica por trás de um programa são muito mais interessantes do que escrever a sintaxe, então talvez tente ajudá-lo com a lógica do programa e depois codifique a coisa e deixe-o ver o resultados disso.

Se ele mostrar algum interesse no código fonte, mostre a ele como escrever suas próprias coisas. Pessoalmente, acho que o idioma em si não importa, desde que seja fácil de aprender e tenha muita documentação.

Rachel
fonte
0

Existe toda uma biblioteca matemática gratuita e comunidade construídas em torno do Python. Eu começaria com "Sage", ele realmente deveria gostar de usá-lo e aprenderá a programação em Python por acaso.

Bill K
fonte
0

Eu acho que você deve mostrar ao seu amigo algumas variantes diferentes, como:

  • C
  • LISP / Esquema
  • BASIC
  • bourne-shell
  • Prolog

Eu acho que C e LISP são bons pontos de partida, mostrando que idiomas diferentes podem ser mais adequados para tarefas diferentes. Não acredito em usar Haskell ou Erlang para tudo.

O código da máquina (ou montador) para um processador simples também pode ser interessante. Sempre fiquei feliz por começar com o código da máquina no meu primeiro C64 . ( MOS 6510 ) Experiência prática difícil de obter quando adulto com tempo limitado para "desperdiçar".

MattBianco
fonte
Eu tenho que discordar. Por que um garoto jovem, interessante em matemática, seria atraído pelo código de máquina? E por que C? Assembly pressupõe muito conhecimento sobre processadores. C também cria muitos requisitos que devem ser deixados para quem deseja aprender programação séria: ponteiros, registros, escopo, tipos. Para uma primeira introdução à programação para essa pessoa, algo que se concentre em algoritmos ou em aplicações de idéias matemáticas (probabilidade, aleatoriedade, simulações) é muito melhor. Python, Lisp / Forth, Básico mesmo. Bourne-shell ?? Por quê? ...
Assad Ebrahim
0

Para mim, a programação começa por querer "fazer alguma coisa", um "e se?" questão:

  • "Gostaria de criar meu próprio site", então aprenda sobre HTML etc.

  • "Detesto ter que clicar no X ou ver Y neste site toda vez que o visito. Não existe uma maneira de automatizar isso?" Então você aprende sobre bookmarklets ou como escrever extensões de navegador.

  • "Quero catalogar todas as minhas músicas e nenhuma das ferramentas que vi fazem da maneira que quero", para que você aprenda sobre bancos de dados.

  • "Quero acompanhar as despesas do meu Clube de Matemática", para aprender sobre planilhas, macros de programação ou talvez até bancos de dados.

Para que a unidade realmente esteja lá, o problema subjacente tem que vir dele . Eu tentaria encontrar um problema que ele quisesse resolver e depois escolheria uma ferramenta / linguagem / sistema que lhe permitisse automatizar / programar a solução.

David Weinraub
fonte
-2

Haskell e Mathematica são o caminho a percorrer, na minha opinião. A maioria das linguagens funcionais também é boa para matemática. Python também é bom, confira a documentação matemática .

Este módulo está sempre disponível. Ele fornece acesso às funções matemáticas definidas pelo padrão C.

Essas funções não podem ser usadas com números complexos; use as funções com o mesmo nome do módulo cmath se precisar de suporte para números complexos. A distinção entre funções que suportam números complexos e aquelas que não suportam é feita, já que a maioria dos usuários não deseja aprender a matemática necessária para entender números complexos. O recebimento de uma exceção em vez de um resultado complexo permite a detecção anterior do número complexo inesperado usado como parâmetro, para que o programador possa determinar como e por que foi gerado em primeiro lugar.

As seguintes funções são fornecidas por este módulo ...

Billjk
fonte