SAWP
Software Advice Working Party
  • Home
  • Links
  • MyTwitter
  • About
  • Computational Methods[44 artigos]

    • [570] 0.1 Miscelânea — Enésima Raiz
      Este artigo demonstra uma aplicação direta do Método de Newton, que é a expressão para obtenção da enésima raiz de "fi" através de uma implementação computacional.
    • [375] 1.1.1 Raízes de Equações — Métodos Intervalares — Método da Bissecção
      Neste artigo é apresentada uma introdução aos métodos intervalares de busca de raízes. Para tais métodos, a primeira exposição é feita sobre as buscas incrementais, que consistem basicamente em testar a nulidade da imagem da função após cada incremento feito dentro do intervalo.

      basicamente todos os métodos intervalares fazem uma busca incremental, modificando apenas os seus critérios de teste. Desta forma, surge naturalmente o Método da Bissecção como consequência da busca de raízes dentro de um intervalo.
    • [403] 1.1.2 Raízes de Equações — Métodos Intervalares — Regula Falsi
      O método conhecido como Regula Falsi, ou "da Falsa Posição" é uma técnica que busca de raízes de funções dentro de um intervalo pré-definido, diferindo-se do Método da Bisecção por avaliar a intersecção entre o eixo abicisso e um segmento de reta produzido através de dois intervalos consecutivos, nos pontos [xi, f(xi)] e [xi+1, f(x_i+1)].

      Para algumas funções, este método possui convergência mais veloz que o Método da Bisecção, servindo no refinamento de algumas outras técnicas compostas.

      Este artigo faz uma apresentação do método e segue com uma discussão sobre a implementação e as possíveis melhorias computacionais que podem ser aplicadas à ele.
    • [563] 1.1.3 Raízes de Equações — Métodos Intervalares — Método de Rider
      O Método de Ridder consiste em avaliar a aproximação parcial -- obtida em cada iteração pelo Método da Falsa Posição -- em uma função de ajuste exponencial, a fim de otimizar a busca pela raiz.
    • [435] 1.2.1 Raízes de Equações — Métodos Abertos — Ponto Fixo
      O Método do Ponto Fixo é o primeiro e mais básico dos métodos abertos para busca de zeros em funções.

      Diferente dos métodos intervalares, onde exige-se um conhecimento prévio da localização da raiz para delimitação do intervalo de busca, os métodos abertos, em geral, necessitam apenas de uma estimativa inicial para convergir à raiz.

      Este artigo apresenta uma breve explanação sobre os métodos abertos -- cuja maioria dos métodos numéricos derivam -- e uma implementação do Método do Ponto Fixo.
    • [439] 1.2.2 Raízes de Equações — Métodos Abertos — Newton Raphson
      O método de Newton-Raphson é um método aberto, pois a convergência que ele provê à raiz não depende da delimitação de um intervalo, possuindo as propriedades descritas para Método do Ponto Fixo.

      Provavelmente é o método numérico mais aplicado computacionalmente para a aproximação de raízes, graças à sua capacidade de rápida convergência, associada à simplicidade de sua formulação.
    • [450] 1.2.3 Raízes de Equações — Métodos Abertos — Método da Secante
      Este artigo demonstra matematicamente a função de iteração do Método da Secante e disponibiliza um algoritmo implementado na linguagem Python.
    • [485] 1.2.4 Raízes de Equações — Métodos Abertos — Método de Halley
      O método inventado pelo físico Edmond Halley, é um algoritmo que consiste em aplicar o Método de Newton-Raphson duas vezes, gerando uma fórmula de aproximação com dependência da função, da primeira e da segunda derivada, possuindo a vantagem de convergir cubicamente à raiz.
    • [497] 1.2.5 Raízes de Equações — Métodos Abertos — Método de Steffensen
      O Método de Steffensen é uma técnica de busca de raízes de funções muito semelhante ao Método de Newton-Raphson, mas que substitui a derivada da função por uma aproximação.

      Este método se difere do Método da Secante por permitir que o delta-quadrado de Aitken seja usado para permitir a aceleração da convergência em alguns casos.

      Neste artigo, é apresentado a demonstração do Método de Steffensen, seguido de um comentário sobre o processo de Aitken e como isto é implementado em um programa.
    • [549] 1.2.6 Raízes de Equações – Métodos Abertos – Método de Householder
      Assim como o Método de Newton exige a derivada de primeira ordem e apresenta uma taxa de convergência quadrática; o Método de Halley leva a primeira e segunda derivada e possui convergência cúbica; o Método de Householder é um algoritmo de busca de raízes que permite que as iterações convirjam a uma taxa d+1 , uma vez que sejam utilizadas d derivadas, onde d é a ordem do método.
    • [528] 1.2.7 Raízes de Equações – Métodos Abertos – Interpolação Quadrática Inversa
      Interpolação Quadrática Inversa é uma técnica usada para obtermos zeros de equações não-lineares na forma f(x) = 0. Ele é raramente implementado em aplicações como único método de busca de raízes, sendo usado como fator acelerador da convergência.
    • [544] 1.2.8 Raízes de Equações — Métodos Abertos — Método de Newton Interpolado
      Neste artigo, apresentaremos a implementação de uma função de iteração modificada do Método de Newton que permite aproximar uma raiz a uma taxa de convergência de quinta ordem.
    • [457] 1.3.1 Raízes de Equações — Raízes de Polinômios — Newton-Raphson para polinômios
      Os polinômios formam uma classe de função toda especial, contendo propriedades e relações particulares e bem conhecidas. Devido a isso, alguns métodos computacionais foram desenvolvidos de forma a permitir encontrar suas raízes.

      Como funções polinomiais formam soluções de diversos problemas físicos, matemáticos e de outras áreas, aplicar o método correto que melhor resolva, certo problema pode ser a chave para uma solução computacionalmente elegante e eficiente.

      Este artigo apresenta uma breve introdução aos métodos de busca de zeros de polinômios e dispõe uma adaptação do Método de Newton para suportar raízes complexas -- tipo de solução quase sempre presente para este tipo de função.
    • [463] 1.3.2 Raízes de Equações — Raízes de Polinômios — O Método de Muller
      O Método de Muller é uma técnica modificada do Método da Secante, mas que ao contrário dessa, não estima a raiz de uma função prolongando uma reta através de dois pontos -- fazendo com que esta reta seja secante à curva da função --, e sim utiliza-se de uma parábola através de três pontos para aproximação da derivada.
    • [473] 1.3.3 Raízes de Equações — Raízes de Polinômios — O Método de Bairstow
      O Método de Bairstow permite encontrar todas as raízes de um polinômio de grau $n$ exigindo-se apenas seus coeficientes.

      Este artigo faz uma breve exposição matemática do método, seguida de duas implementações reais nas linguagens Python e Fortran 90.
    • [518] 1.3.4 Raízes de Equações – Raízes de Polinômios – O Método de Aberth
      O Método de Aberth é uma algoritmo usado para encontrar todas as raízes de um polinômio de grau qualquer.
    • [524] 1.3.5 Raízes de Equações – Raízes de Polinômios – O Método de Durand-Kerner
      O Método de Durand-Kerner, também chamado de Método de Weierstrass, é uma técnica numérica usada para obter todas as raízes de um polinômio, que atua de forma semelhante ao Método do Ponto Fixo, mas é generalizado para buscar todos os zeros da função polinomial.
    • [507] 1.3.6 Raízes de Equações — Raízes de Polinômios — O Método de Laguerre
      O Método de Laguerre é um algoritmo numérico modificado a partir do Método de Newton para encontrar raízes complexas de polinômios. Sendo um método muito eficiente na busca de um zero de função, pois sempre converge à alguma raiz, independente da aproximação inicial dada (propriedade nem sempre presente em outros métodos computacionais). A principal desvantagem do Método de Laguerre é que ele não encontra todas raízes do polinômio, aproximando satisfatoriamente bem apenas à uma delas. Neste artigo, apresento uma pequena demonstração das relações matemáticas usadas na implementação, também presente.
    • [573] 1.3.7 Raízes de Equações — Raízes de Polinômios — O Método de Jenkins-Traub
      O Método de Jenkins-Traub é um algoritmo para busca dos zeros de uma função polinomial que utiliza três estágios de estimativas para aproximar as raízes.
    • [558] 1.4.1 Raízes de Equações — Métodos Mistos — Método de Brent
      O Método de Brent é uma combinação simples de diversos métodos computacionais para busca de raízes de função. Os métodos usados no algoritmo de Brent são: Método da Bisseção, da Secante e Interpolação Quadrática Inversa.
    • [577] 2.1.1 Sistemas Lineares — Métodos Diretos — Eliminação de Gauss
      O método conhecido como "Eliminação de Gauss" consiste em combinar as equações de forma ir eliminando as variáveis até convergir à uma solução. Embora este seja um dos métodos mais antigos, e também um dos menos eficientes, serve como fundamento para compreendermos as demais técnicas relativas à resolução de sistemas lineares.
    • [586] 2.1.2 Sistemas Lineares — Métodos Diretos — Decomposição LU
      Este artigo trata de uma classe de algoritmos de eliminação -- tais como da Eliminação de Gauss -- que utilizam decomposição de uma matriz para obtenção das incógnitas do sistema. A principal vantagem da decomposição LU é que ela otimiza o tempo gasto na eliminação, sendo adaptativo às situações nas quais o vetor dos termos independentes são calculados para um único conjunto de coeficientes do sistema. Além disso, este artigo desenvolve o método da decomposição LU como uma implementação da eliminação de Gauss.
    • [604] 2.1.3 Sistemas Lineares — Métodos Diretos — Decomposição de Cholesky
      Este artigo apresenta o algoritmo conhecido como "Fatoração de Cholesky", onde decompõe uma matriz A tal que A = LL*, onde L será uma matriz triangular-inferior com diagonal composta apenas por elementos não negativos, enquanto L* será a matriz adjunta de L.

      Caso A seja uma matriz positiva, então L será única, o que permite servir como fator identificador dos dados de A, chamado de "Fator de Cholesky de A". Essa propriedade pode permitir aplicações em diversas áreas da ciência e computação.

      Decomposições baseadas na de Cholesky estão presentes em criptografia, geração de hashes, verificação de dados e em uma diversidade de aplicações práticas.
    • [657] 2.1.4. Sistemas Lineares — Métodos Diretos — Decomposição SVD
      Uma das mais importantes fatorações de matrizes é a Singular Value Decomposition (SVD). Ela é utilizada em diversos problemas práticos, tais como processamento de sinais, ajuste de funções multivariadas, soluções de problemas de otimização, etc. Sua principal aplicação nestes problemas está em permitir a aproximação da pseudo-inversa da matriz decomposta. Neste artigo vamos apresentar a decomposição SVD e mostrar como ela pode ser utilizada para solução de sistemas lineares.
    • [689] 2.1.5. Sistemas Lineares — Métodos Diretos — Decomposição QR
      Neste post apresentaremos um método para decomposição de matrizes conhecido como Fatoração QR. Esta técnica consiste em decompor uma matriz A como sendo um produto de uma matriz ortogonal com outra matriz triangular. Em problemas práticos, este método é consideravelmente mais útil que outras técnicas (tais como LU ou Cholesky).
    • [704] 2.1.6 Sistemas Lineares — Métodos Diretos — Decomposição LDL
      Um aspecto da decomposição de Cholesky que insere um custo adicional na computação das matrizes decompostas está na necessidade de calcular a raiz quadrada durante a resolução do problema. Contudo, o cálculo da raiz quadrada é um processo caro, sujeito à propagações de erros maiores do que aqueles obtidos com a utilização de operações simples de ponto flutuante, tais como adição e multiplicação. Neste artigo mostraremos uma modificação na decomposição de Cholesky que elimina necessidade do cálculo da raiz quadrada, sendo mais eficiente e propagando menos erros.
    • [711] 2.1.7 Sistemas Lineares — Métodos Diretos — O Algoritmo de Thomas
      Neste post veremos o algoritmo para resolução de sistemas com matrizes tri-diagonais (TDMA - Tridiagonal Matrix Algorithm), conhecido como "Algoritmo de Thomas", que é uma forma simplificada da Eliminação de Gauss. Este algoritmo é um dos mais eficientes métodos para resolução de problemas reduzidos à sistemas lineares e também possui grande simplicidade, o que favorece a implementação.
    • [762] 2.2.1 Sistemas Lineares — Métodos Iterativos — Gauss-Siedel
      Neste artigo discutiremos o Método de Gauss-Siedel, que é um algoritmo iterativo para aproximação de soluções de sistemas lineares. Em problemas que empregam métodos computacionais, o método de Gauss-Siedel é muito útil, uma vez que gera soluções satisfatórias para sistemas de equações muito grandes. Todavia, como é comum de ocorrer em métodos iterativos, esta técnica é sujeita a erros de arrendondamento. Por isso, há certos casos em que o método não convergirá à uma solução. Portanto, apresentaremos neste trabalho uma digressão sobre as vantagens e os contras da utilização de métodos iterativos e do algoritmo de Gauss-Siedel.
    • [787] 2.2.2 Sistemas Lineares — Métodos Iterativos — Jacobi
      O Método de Jacobi é um algoritmo iterativo para resolução de sistemas lineares, muito semelhante ao método de Gauss-Siedel. Neste post, apresentamos características deste método e uma implementação em python do mesmo.
    • [850] 3.1.1 Aproximação de Funções — Interpolação — Introdução
      Neste artigo, comentamos sobre a importância das formas mais simples de ajuste de funções: a interpolação. Nos posts seguintes, iremos detalhar as
      diversas abordagens numéricas utilizadas para transformar dados obtidos do mundo real (finitos) em funcionais (abstrações contínuas).
    • [858] 3.1.2 Aproximação de Funções — Interpolação — Polinômios de Interpolação
      Frequentemente precisamos fazer estimativas de valores intermediários àqueles obtidos a partir de amostras. A forma mais comum para fazer estas
      estimativas está no uso de interpolações polinomiais. Neste artigo, discutiremos sobre a teoria comum à todas técnicas numéricas que utilizam polinômios interpoladores, tais como as funções de Lagrange e de Hermite.
    • [868] 3.1.3 Aproximação de Funções — Interpolação — Interpolação de Lagrange
      O polinômio interpolador de Lagrange é uma das formulas mais simples para obtenção do polinômio interpolador. Neste post apresentamos e discutimos o método, além de disponibilizar um código que ilustra o algoritmo.
    • [880] 3.1.4 Aproximação de Funções — Interpolação — Interpolação de Hermite
      A interpolação de Hermite é um método que utiliza tanto amostras da função quanto da sua derivada para ajustá-la em uma curva. Neste artigo, demonstramos a formulação desse método e um exemplo de como implementá-lo
    • [1111] 3.1.5 Aproximação de Funções — Interpolação — Fórmula de Newton-Gregory
      Um caso especial de interpolação polinomial se dá quando temos dados obtidos em uma amostragem igualmente espaçada. Neste post veremos a Interpolação com Dados Igualmente Espaçados, que cumina em uma equação conhecida como Fórmula de Newton-Gregory.
    • [1119] 3.1.6 Aproximação de Funções — Interpolação — Interpolação Inversa
      Na maioria dos casos de interpolação os valores de f(x) e x são as variáveis dependente e independente, respectivamente. Como tal, os valores dos x's são uniformemente espaçados. Contudo, supondo que precisemos utilizar os mesmos dados amostrados para determinar x a partir de f(x). Tal problema é chamado de interpolação inversa.
    • [1130] 3.1.7 Aproximação de Funções — Interpolação — Splines
      Neste post, usamos funções lineares simples para introduzir alguns conceitos básicos e problemas relacionados à splines. Então, desenvolvemos um algoritmo para ajuste de valores aos dados. Finalmente, discutimos sobre splines cúbicos, que possuem maior aplicabilidade em problemas reais.
    • [1137] 3.2.1 Aproximação de Funções — Análise de Fourier — Introdução
      Nos posts anteriores, apresentamos a interpolação baseada em aproximações baseadas em funções polinomiais. Agora, neste post, apresentamos uma nova classe de funções de aproximação que têm enorme importância em problemas que utilizam métodos computacionais: as funções trigonométricas.
    • [1142] 3.2.2 Aproximação de Funções — Análise de Fourier — A Série de Fourier
      Neste post veremos a aproximação de uma função qualquer em termo de funções trigonométricas através da série de Fourier.
    • [1163] 3.2.3 Aproximação de Funções — Análise de Fourier — A Transformada Integral de Fourier
      A integral de Fourier é a principal ferramenta para analisar funções de ondas não-periódicas através da modelagem trigonométrica das séries de Fourier. Neste post discutiremos a versão contínua da transformada de Fourier.
    • [1172] 3.2.4 Aproximação de Funções — Análise de Fourier — A Transformada Discreta de Fourier
      Um sinal natural raramente é caracterizado como uma função definida no contínuo, como aquelas descritas pela transformada contínua de Fourier. Em vez disso, os dados são amostrados em tempos discretos. Assim, a forma mais eficiente de conversão entre domínios de problemas reais se dá pela transformada discreta de Fourier.
    • [1186] 3.2.5 Aproximação de Funções — Análise de Fourier — A Transformada Discreta Rápida de Fourier
      Embora o algoritmo implementado no post anterior calcule adequadamente a transformada discreta de Fourier (TDF), ele é computacionalmente custoso, uma vez que possui ordem de complexidade quadrática. Por isso, para uma amostra de dados considerável, pode ser inviável a utilização daquela função. Neste post veremos a transformada de rápida de Fourier, algoritmo eficiente que é muito utilizado em diversas áreas que utilizam recursos eletrônicos e computacionais, tais como processamento de sinais.
    • [1251] 3.3.1 Aproximação de Funções — Regressões — Regressão Linear
      Neste e nos próximos posts, vamos considerar o problema de aproximar uma função cuja sequência de pontos foram obtidos de forma aproximada, sendo sujeitos à ruídos inerentes do processo de amostra. Assim, os arrendondamentos feitos pelos métodos de interpolação podem acumular erros muito maiores. Os métodos de regressão consistem em um conjunto de técnicas em que os erros funcionais podem ser usados para gerar uma aproximação suave da função.
    • [1343] 3.3.2 Aproximação de Funções — Regressões — Regressão Linear Múltipla
      Estendendo o post sobre regressão linear simples, temos o caso em que o vetor y é gerado por uma função com duas ou mais variáveis.
    • [1350] 3.3.3 Aproximação de Funções — Regressões — Regressão Polinomial
      Nos dois últimos posts apresentamos o desenvolvimento para ajustar dados em uma equação da reta através de mínimos quadrados. Contudo, existem muitos eventos em que o modelo obedece à um comportamento polinomial. Para tais modelos é necessário adaptar o ajuste para uma função polinomial de grau superior.
  • Digital Image Processing Using Python[11 artigos]

    • [978] Aumento de Contraste e Equalização de Histograma
      Funções de transformações em intensidades (na escala de cinza ou espaços de cores) que utilizam informações extraídas do histograma estão presentes em diversas áreas de processamento de imagens, tais como reconstrução, compressão e segmentação. Neste artigo comentaremos sobre o processamento e equalização de histogramas e os seus efeitos visuais na imagem.
    • [904] Color Threshold
      A idéia é colorir partes de uma imagem em tons de cinza com o objetivo de destacar regiões específicas.
    • [1101] Contagem de Moedas Utilizando Processamento de Imagens
      Como utilizar morfologia matemática em processamento de imagens para contagem automática de dinheiro? Neste post veremos um exemplo de reconhecimento simples de padrões.
    • [924] Convertendo uma imagem para usar cores seguras
      Um sistema de representação de cores em imagens -- RGB, HSI, CMY, CMYK -- pode conter diversos valores, permitindo gerar escalas com tonalidades mais ou menos variadas, dependendo da quantidade de informação utilizada na representação (8, 16, 32 ou 24 bits). Todavia, existem 216 cores padronizadas utilizadas para algumas aplicações. Este post apresenta uma função que converte imagens coloridas em suas versões com cores seguras.
    • [940] Dithering — Parte I — Halftone via Pontilhado Ordenado
      Halftone (meio-tom) é uma técnica de processamento de imagens que objetiva gerar uma ilusão ótica na imagem para que ela aparente ter mais tons do que realmente possui.
    • [1001] Dithering — Parte II — Gerando os Pontilhados Ordenados
      Continuando o Post anterior, neste texto apresentamos a formulação por trás da geração das máscaras de pixels nos métodos de halftone via pontilhado ordenado.
    • [1041] Dithering — Parte III — Dithering com Difusão de Erro e o algoritmo de Floyd-Steinberg
      Dithering (pontilhado) com difusão de erro é uma técnica de halftone que procura distribuir a diferença entre o valor exato de cada pixel e seu valor aproximado a um conjunto de pixels adjacentes. Diversas técnicas foram desenvolvidas com esta proposta, sendo o algoritmo de Floyd-Steinberg o primeiro desenvolvido utilizando esta abordagem.
    • [1065] Dithering — Parte IV — Dithering com Difusão de Erro de Jarvis
      O algoritmo de pontilhado de Jarvis, Judice e Ninke difunde o erro com mais um passo de distância. É mais lento do que o método de Floyd-Steinberg, pois distribui os erros entre 12 pixels próximos, em vez de 4 pixels nas proximidades, como faz o primeiro.
    • [1092] Identificação de Figuras Geométricas usando Morfologia
      Neste post veremos como utilizar operações de conjuntos e lógicas para reconhecimento de padrões simples.
    • [919] imresize — alterando as dimensões da imagem
      Embora o scipy. misc implemente esta função, fica aqui um exemplo simples de dimensionamento de imagens através de interpolação.
    • [1278] Quantização de Imagens Usando Decomposição em Valores Singulares
      No contexto do processamento de imagens, a quantização é geralmente feita reduzindo-se a quantidade de níveis de cor (quantização espacial) ou reduzindo-se a quantidade de coeficientes no domínio da frequência (quantização do espaço transformado de Fourier, wavelets, etc). Por exemplo, no padrão JPEG, a quantização é feita sobre os coeficientes da transformada discreta de cosseno, eliminando-se aqueles menos significativos. Nest post, mostramos exemplos de quantização no espaço transformado pela decomposição em valores singulares.
  • FreeBSD[24 artigos]

    • [892] Build Firefox crashes on nsHtml5ElementName.cpp
      Fixing FreeBSD ports www/libxul: nsHtml5ElementName.cpp nsHtml5StateSnapshot.cpp and how to get through the compile error
    • [620] Compiling and installing Eclipse on FreeBSD
      How to install Eclipse.
    • [743] Configuring port forwarding with NAT – FreeBSD Guest in VirtualBox
    • [896] Cyrillic character problem in Chrome on FreeBSD
      Fix bad character appearing in Google Chrome
    • [756] FreeBSD and Problems with qmake
    • [700] Freebsd Cython compile error
      Fixing pth.h when compiling Cython on FreeBSD.
    • [821] FreeBSD G95 linker error
    • [637] FreeBSD pth.h or pthread.h error?
    • [628] Incompatible libpng version in application and library
      Fixing Fatal error in PNG image file: Incompatible libpng version in application and library
    • [1124] Install nautilus-dropbox in FreeBSD
    • [639] Intel 82801G High Definition Audio Controller without audio?
    • [1083] List all FreeBSD outdated ports
    • [1338] pkg_version: corrupted record (pkgdep line without argument), ignoring
      Fixing "pkg_version: corrupted record (pkgdep line without argument), ignoring" error on FreeBSD ports.
    • [633] Pulseaudio does not work?
    • [1154] Scala highlight for gedit in FreeBSD
    • [725] Text color in FreeBSD gnome-terminal (bash)
      Text color in FreeBSD terminal...
    • [635] Updating FreeBSD Ports
    • [745] Xorg screen resolution in FreeBSD as VirtualBox Guest
    • [739] [FreeBSD] error: idna.h not found which is part of GNU libidn
    • [1247] [FreeBSD] Port crashed and require libzma.la (works for x86 machine)
    • [732] [FreeBSD] wxWidgets must be installed on your system
    • [1486] [Solved] Compiling yuvplayer in FreeBSD
      If you got the error when trying to compile a C++ QT project: QMAKESPEC has not been set, so configuration cannot be deduced.
      Error processing project file: *.pro

      Then it means you forgot to set environment variable QMAKESPE
    • [1076] [Solved] login_getclass: unknown class ‘default’ after freebsd-update
      Fixing login error after freebsd-update
    • [642] [Solved] Totem ‘Failed to create output image buffer of…’ on FreeBSD
  • Miscellaneous[18 artigos]

    • [264] A Incrível Raiz Quadrada Inversa
      O inverso da raiz quadrada é uma função presente em diversos problemas matemáticos, físicos e estatísticos. Vários métodos numéricos são aplicados para busca da melhor forma de se expressar 1/sqrt(x).
      Este artigo discute e analisa um código encontrado nas fontes de vários bibliotecas de C: O InvSqrt é uma função que chama a atenção por sua beleza que vai além da aplicação de um método numérico e utiliza uma manipulação de recursos computacionais para gerar uma função mais veloz.
    • [795] Implementação de um Algoritmo de Unificação em OCaml
      A unificação é uma operação lógica que produz uma substituição de um termo em outro, identificando os termos ou fazendo a igualdade de condições utilizando alguma teoria equacional (no caso da unificação semântica). Neste post apresentamos e descrevemos uma implementação em OCaml do algoritmo de unificação de Robson.
    • [305] Others InvSqrt implementations
      Veja aqui algumas alternativas à implementação da Fast InvSqrt.
    • [828] PCL – The Peasant’s Computer Language
      Veja aqui as especificações da PCL: The Peasant's Computer Language
    • [1466] Scala Notes — Full Example — Activity Selection Problem
      An activity-selection is the problem of scheduling a resource among several competing activity.
    • [1469] Scala Notes — Full Example — Generating Huffman Code Table
      Code to generate Huffman tables from the list of symbols frequencies.
    • [1359] Scala Notes — Introduction To Scala — Part1 — Variables and Functions
      Exercises of the book 'Introduction to Objective Caml' solved in Scala.
    • [1393] Scala Notes — Introduction To Scala — Part2 — Simple Pattern Match
      Exercises of the book 'Introduction to Objective Caml' solved in Scala.
    • [1399] Scala Notes — Introduction To Scala — Part3 — Tuples, Lists and Polymorphism
      Exercises of the book 'Introduction to Objective Caml' solved in Scala.
    • [1409] Scala Notes — Introduction To Scala — Part4 — Types and Case-classes
      Exercises of the book 'Introduction to Objective Caml' solved in Scala.
    • [1422] Scala Notes — Introduction To Scala — Part5 — Strings
      Exercises of the book 'Introduction to Objective Caml' solved in Scala.
    • [1428] Scala Notes — Scala by Example — Chapter 04
      Exercises solutions of the book 'Scala by Example'.
    • [1431] Scala Notes — Scala by Example — Chapter 05
      Exercises solutions of the book 'Scala by Example'.
    • [1441] Scala Notes — Scala by Example — Chapter 06
      Exercises solutions of the book 'Scala by Example'.
    • [1444] Scala Notes — Scala by Example — Chapter 07
      Exercises solutions of the book 'Scala by Example'.
    • [1446] Scala Notes — Scala by Example — Chapter 09
      Exercises solutions of the book 'Scala by Example'.
    • [1453] Scala Notes — Scala by Example — Chapter 10
      Exercises solutions of the book 'Scala by Example'.
    • [1458] Scala Notes — Scala by Example — Chapter 11
      Exercises solutions of the book 'Scala by Example'.
  • Programming Internals[8 artigos]

    • [105] A Fórmula de um Crack
      Crackear qualquer sistema é impossível sem as ferramentas certas. Abaixo iremos discutir as diferenças entre as existentes. E de posse do conhecimento destas, iremos desenvolver um exemplo suficientemente completo para se entender como crackear um executável.
    • [131] Técnicas AntiCracking – Parte I
      Quando disassemblamos um binário para crackearmos, muitas vezes nos deparamos com um código que parece não fazer sentido. Isso ocorre por que o programa possivelmente foi implantado com alguma proteção contra engenharia reversa.
    • [148] Técnicas AntiCracking – Parte II – Eliminação de Informação Simbólica
      Os compiladores costumam gerar informações simbólicas – para representar as lincagens – quando convertem as relações de importação e exportação de tabelas e extensões. Um programa com grande uso de DLLs, onde cada uma exporta uma grande quantidade de funções, necessitará de uma lista relacionando onde estão as funções exportadas, normalmente indicando o que elas fazem, o que é de grande serventia para os crackers. Neste artigo, apresento algumas das informações que podem ser usadas como pontos de referência para engenharia reversa.
    • [201] Técnicas AntiCracking – Parte III – Ofuscação e Encriptação de Código
      Também conhecidas como Code Obfuscation and Encryption (COE), são técnicas utilizadas para prevenir a Análise Estática de Código. Diferente da Eliminação Simbólica (Eliminating Symbolic Information – ESI), a COE é aplicada após a compilação do programa, modificando o binário original antes de ser entregue ao cliente.
    • [207] Técnicas AntiCracking – Parte IV – Técnicas Ativas de AntiDebuggin
      No post “A Fórmula do Crack” discutimos alguma coisa sobre debuggers. Como é o processo de debuggin em user-mode e kernel-mode, como cada um deles trabalha quando um usuário anexa um processo à eles, quando fixa um breakpoints em uma instrução etc.
      O que não foi discutido é a forma como o debugger atua: quando o usuário escolhe pontos de parada para conferir o andamento da execução do programa é comum o debugger substituir a(s) instrução(ões) por uma instrução própria, que só ele entenda.
    • [214] Técnicas AntiCracking – Parte V – Burlando Disassemblers
      Uma técnica sofisticada de enganar disassemblers consiste em usar um trecho do programa para alterar os bits das outras partes do programa, que desejamos proteger. A estratégia usada é deslocar os bits de um trecho do programa para que este pedaço pareça possuir outras instruções. Desta forma, o decompilador irá interpretar essas instruções e fornecer informações erradas ao atacante.
    • [219] Técnicas AntiCracking – Parte VI – Transformações no Controle de Fluxo
      Control Flow Transformation (CFT) consiste em alterar a estrutura de um programa para tornar seu código difícil para a leitura humana sem prejudicar a sua funcionalidade original. Como veremos aqui, está intimamente relaciona com a ofuscação de código.

      As técnicas que se aplicam à categoria das CFTs são: Inlining, Intervalar Código, Estruturas Opacas, GoTo Hell’s Code e Exceção Proposital.
    • [225] Técnicas AntiCracking – Parte VII – Conclusão
      O programa ficará mais lento quão maior for o descuido na implantação dessas técnicas devido aos efeitos adversos, tais como o uso excessivo da CPU com instruções que não tem funcionalidade nenhuma para o usuário, o aumento significativo do código e a perda de desempenho no sistema. Todavia, ao implementar este tipo de proteção devemos usar as técnicas de forma que as reações colaterais sejam minimizadas. Neste artigo, discutimos quais são os custos ao se implementar uma técnica que desfavoreça a engenharia reversa, o nível de proteção máximo que se pode ser obtido e qual preço desta segurança.
  • Virtualization[2 artigos]

    • [101] Detectando Máquinas Virtuais
      As vezes precisamos que nosso programa se comporte de forma diferente quando rodar em uma máquina virtual. Principalmente quando queremos dificultar o processo de engenharia reversa do nosso programa, antecipando o ambiente em que o cracker trabalhará, ou ainda, queremos restringir algumas funcionalidades que teriam a segurança reduzida, se rodasse numa MV.
    • [128] NestedVM – ASM MIPS para JAVA
      Veremos aqui sobre a NestedVM, conversor de Assembly MIPS para bytecode JAVA, “cross-compilation” para compilarmos de C++ para ASM MIPS, permitindo assim, em conjunto com o NestedVM, converter todo um sistema para JAVA. E comentaremos sobre alguns métodos alternativos e mais populares para integração de sistemas já prontos com o JAVA, como o JNI, Jazillian, c2j etc. E porquê esses sistemas ficam aquém ao NestedVm.

Copyright © 2008-2012 -- sawp@sawp.com.br -- Content licensed by Creative Commons
md5: 60ae4697f5529dd204503b742ff5b1bf -- sha1: 1a96e50da52e73ffd7a7f8242831f1ab75405a30