Muito sobre Matemática e nem tanto sobre CSS, PHP, AJAX, Javascript, Wordpress e outros assuntos

Arquivos: setembro, 2006

23
set

Nos cálculos algébricos são frequentes a presença de alguns produtos (multiplicações) que, por conta desse fato, obtiveram destaque especial e receberam o nome de Produtos Notáveis.

Como se vê não há nada de excepcional. Decorrem, como o próprio expressa, de uma operação aritmética, a multiplicação, com a qual todos se deparam no início de sua formação.

Envolve, também, como veremos, a definição de Potenciação com expoente inteiro e que já foi abordada aqui no Blog Viche. E, também, nestas condições, nada mais é do que uma multiplicação.

Assim, é natural lembrá-los das propriedades da multiplicação que serão utilizadas (ou não) nas demonstrações dos Produtos Notáveis mais comuns apresentados abaixo.

Propriedades da Multiplicação em R

  • Comutativa – A ordem dos fatores não altera o resultado final da operação ou produto: a.b = b.a, para todo a e b reais;
  • Associativa – O agrupamento de fatores não altera o resultado: a.(b.c) = (a.b).c, para qualquer a, b e c reais;
  • Distributiva – O produto de um número por uma soma ou diferença de dois outros números é igual a soma ou diferença entre o produto desse número por cada uma das parcelas: a.(b + c) = a.b + a.c ou a.(b – c) = a.b – ac;
  • Elemento Neutro – O número (fator) 1 é o elemento neutro da multiplicação: 1.x = x, para qualquer x real;
  • Elemento Opositor – O número -1 transforma o produto em seu oposto: -1.x = -x, para qualquer x real diferente de zero;
  • Fechamento – O produto de dois números reais é, sempre, um número real;
  • Anulação – O número 0 anula o produto: 0.x = 0, para qualquer x real.

Produtos Notáveis Mais Comuns

PN1. Quadrado da soma de dois números reais a e b quaisquera mais b ao quadrado é igual ao quadrado do primeiro mais duas vezes o primeiro vezes o segundo, mais o quadrado do segundo:

(a + b)2 = a2 + 2ab + b2

Demonstração:

Pela definição de potenciação temos que:

(a + b)2 = (a + b)(a + b)

Utilizando-se da propriedade distributiva da multiplicação:

(a + b)2 = a(a + b) + b(a + b) = a2 + ab + ba + b2

E, finalmente pela propriedade comutativa vem:

(a + b)2 = a2 + 2ab + b2

PN2. Quadrado da diferença de dois números reais a e b quaisquera menos b ao quadrado é igual ao quadrado do primeiro menos duas vezes o primeiro vezes o segundo, mais o quadrado do segundo:

(a – b)2 = a2 – 2ab + b2

PN3. O Produto da soma pela diferença de dois números reais a e b quaisquer é igual ao quadrado do primeiro termo (a) menos o quadrado do segundo (b):

(a + b)(a – b) = a2 – b2

Demonstração:

Novamente é decorrência das propriedades distributiva e comutativa da multiplicação:

(a + b)(a – b) = a(a – b) + b(a – b) = a2 – ab + ba – b2 = a2 – b2

PN4. Cubo da soma de dois números reais a e b quaisquera mais b ao cubo é igual ao cubo do primeiro mais três vezes o quadrado do primeiro vezes o segundo, mais três vezes o primeiro vezes o quadrado do segundo, mais o cubo do segundo:

(a + b)3 = a3 + 3a2b + 3ab2 + b3

Demonstração:

Da definição de potenciação:

(a + b)3 = (a + b)(a + b)2

Pela propriedade PN1:

(a + b)3 = (a + b)(a2 + 2ab + b2)

Da propriedade distributiva da multiplicação vem:

(a + b)3 = a(a2 + 2ab + b2) + b(a2 + 2ab + b2)

=> (a + b)3 = a3 + 2a2b + ab2 + ba2 + 2ab2 + b3

Somando os termos comuns com o uso da propriedade comutativa:

(a + b)3 = a3 + 3a2b + 3ab2 + b3

PN5. Cubo da diferença de dois números reais a e b quaisquera menos b ao cubo é igual ao cubo do primeiro menos três vezes o quadrado do primeiro vezes o segundo, mais três vezes o primeiro vezes o quadrado do segundo, menos o cubo do segundo:

(a + b)3 = a3 – 3a2b + 3ab2 – b3

PN6. Produto de Stevin:

(x + a)(x + b) = x2 + (a + b)x + ab

PN7. Produtos de Warring:

[1] a3 + b3 = (a + b)(a2 – ab + b2)

[2] a3 – b3 = (a – b)(a2 + ab + b2)

Demonstração de [1]:

Da propriedade PN4 temos que:

(a + b)3 = a3 + 3a2b + 3ab2 + b3

Por outro lado:

(a + b)3 = (a + b)(a + b)2 = (a + b)(a2 + 2ab + b2)

Substituindo na igualdade anterior vem:

a3 + 3a2b + 3ab2 + b3 = (a + b)(a2 + 2ab + b2)

Ajustando a igualdade e colocando os termos comuns em evidência:

a3 + b3 = (a + b)(a2 + 2ab + b2) – 3a2b – 3ab2

=> a3 + b3 = (a + b)(a2 + 2ab + b2) – 3ab(a + b)

=> a3 + b3 = (a + b)(a2 + 2ab + b2 – 3ab) = (a + b)(a2 – ab + b2)

Categoria : Matemática | Técnico | Blog
15
set

Depois de muito tempo e a paciente espera do Amós Vilarinho Rangel, um representante da classe dos tecelões, disponibilizo a versão 1.0 do Gerador de Padrões – Técnica Repasso.

Sob o aspecto técnico, consiste de programas em PHP, de rotinas em Javascript/AJAX e de um pouco de CSS e XHTML. Contém um formulário para digitação dos campos necessários (os fundamentais são a sequência de pedalagem e as cores da trama e do urdume) para gerar os padrões de tecidos e uma breve explanação de como utilizá-lo.

Além do que, no combobox Exemplos do gerador é relacionado alguns códigos repasso (reais) extraídos da pesquisa com o objetivo de demonstrar a sua funcionalidade. Basta selecionar qualquer um deles e os campos são exibidos após uma consulta a uma tabela MySQL, via AJAX, e clicar no botão “Gerar” na parte inferior do formulário. Neste caso recomendo, apenas, alterações nas cores, se assim o desejar.

Atenção! A versão 1.0 não armazena as informações digitadas no banco de dados do Viche. No entanto, na página com o resultado, elas são exibidas. Sugiro, portanto, anotá-las ou utilizar os famosos Ctrl+C (copiar) antes da execução e o Ctrl+V (colar) no caso de necessidade de um novo experimento.

As paletas de cores são bem simples e não há validação dos campos preenchidos, nesta versão. Deixo para fazê-la após sua avaliação.

Acrescentada uma terceira cor cinza fixa (#666666) em alguns pontos da trama de modo a proporcionar uma melhor visualização do padrão.

E, finalmente, só me resta aguardar as críticas – ou elogios :-) – e as sugestões de melhorias do gerador, que peço sejam registradas nos comentários deste post.

[UPDATE: 17/09/2006]

A modificação básica efetuada no gerador, da versão 1.0 para a 1.01, consistiu em substituir a exibição do padrão no formato de tabela para o formato em folhas de estilos. A nova versão pode ser acionada no link exibido a seguir, onde você observará que houve um ganho significativo na performance se comparada com a versão anterior.

Gerador de Padrões – Técnica Repasso: Versão 1.01

A versão 1.01 foi testada no FF, IE, Netscape e Opera, sendo que neste último o padrão é renderizado com um tamanho maior do que nos demais.

[UPDATE]

powered by performancing firefox

Categoria : AJAX | CSS | Javascript | PHP | Tecelagem | Técnico | Blog
8
set

No quarto número do Exercícios Resolvidos vamos colocar em prática a teoria apresentada no artigo sobre Logaritmo, o qual, sugiro, você deve consultar em caso de dúvidas, uma vez que serão apenas mencionadas as propriedades ali abordadas.

Exercício 1: Se logaba = 4, calcule:

Exercício 4 - Logaritmo

Solução:

Reescrevendo a expressão com o uso das propriedades dos logaritmos indicadas abaixo do sinal de igualdade, temos que:

Solução Exercício 1 - Logaritmo

Por outro lado, da condição inicial do exercício e da definição de logaritmo vem:

logaba = 4 => a = (ab)4 => a = a4b4 => b4 = 1/a3 => b = (1/a3)1/4 = 1/a3/4

Observe que acima foi considerado, apenas, o valor real de b maior do que zero na extração da raiz de índice 4 (condição de existência do logaritmo)

Substituindo o valor de b em logabb na expressão [1]:

Solução Exercício 1 - Logaritmo

Exercício 2: Se a, b e c são reais positivos com a diferente de 1 e ac diferente de 1, prove que:

logab = logacb(1 + logac)

Solução:

Note que a expressão do lado direito da igualdade possui um logaritmo na base ac. Assim, nada mais natural do que efetuarmos, incialmente, a mudança para essa base (L4) na expressão do lado esquerdo da igualdade. Assim:

Solução Exercício 2 - Logaritmo

Por raciocínio semelhante ao anterior, fazendo a mudança de base no denominador da fração para a base a, obtemos:

Solução Exercício 2 - Logaritmo

E, substituindo [2] em [1]:

Solução Exercício 2 - Logaritmo

Exercício 3: Se a e b são raízes da equação x2 – px + q = 0 (p, q > 0 e q diferente de 1), demonstre que:

logqaa + logqbb + logqab + logqba = p

Solução:

Aplicando a propriedade L3 ao primeiro membro da igualdade (definimos como A) vem:

A = alogqa + blogqb + blogqa + alogqb

Colocando os termos comuns em evidência:

A = (a + b)logqa + (a + b) logqb => A = (a + b)( logqa + logqb)

E, pela propriedade L1:

A = (a + b) logqab [1]

Como todos vocês sabem (espero) que em uma equação do segundo grau mx2 + nx + k = 0 a soma e o produto de suas raízes valem, respectivamente:

S = -n/m e P = k/m

vem, pelas condições iniciais do exercício, que:

a + b = p e a.b = q

Substituindo esses valores em [1]:

A = plogqq = p

Exercício 4: Se a, b e c são as medidas dos lados de um triângulo retângulo de hipotenusa de medida a e sabendo que a – b e a + b são diferentes de 1, demonstre que:

loga+bc + loga-bc = 2loga+bc.loga-bc

Solução:

Como o triângulo é retângulo, pelo Teorema de Pitágoras:

Solução Exercício 4 - Logaritmo

Efetuando a mudança de base (de a + b para a – b) da primeira parcela:

Solução Exercício 4 - Logaritmo

E substituindo no primeiro membro da igualdade a ser demonstrada:

Solução Exercício 4 - Logaritmo

E, por fim, de [1] e [2] vem que:

Solução Exercício 4 - Logaritmo

Exercício 5: Demonstrar que:

Solução Exercício 5 - Logaritmo

Solução:

A demonstração é consequência da propriedade L4 (mudança de base):

Solução Exercício 5 - Logaritmo

O exercício foi incluído, apesar de simples, por não ter sido tratado nas consequências da propriedade L4 do artigo sobre Logaritmo.

Exercício 6: Se a, b e c são reais positivos e diferentes de um e a = b.c, prove que:

Solução Exercício 6 - Logaritmo

Solução:

Pela propriedade L4 (mudança de base) temos:

Solução Exercício 6 - Logaritmo

Da condição inicial, aplicando-se o logaritmo na base b, obtemos:

logba = logbbc = logbb + logbc = 1 + logbc [2]

Substituindo [2] em [1]:

Solução Exercício 6 - Logaritmo

Referência:

  1. Fundamentos de Matemática Elementar, Gelson Iezzi, Osvaldo Dolce & Carlos Murakami, São Paulo, Atual Editora Ltda, edição 1977.
Categoria : Matemática | Questionarious / Exercícios Resolvidos | Técnico | Blog
6
set

Ao folhear o livro Elementos de Aritmética, Curso Superior – Para o curso colegial e admissão às escolas superiores, do Irmão Isidoro Dumont, Coleção de Livros Didáticos F. T. D, publicado em 26/10/1945 (isto mesmo! 61 anos atrás) encontrei, no Capítulo II – Operações sôbre Números Inteiros, os conceitos a seguir relacionados:

  • As demonstrações baseiam-se em certos princípios, chamados teoremas e axiomas;
  • Axioma é um princípio cuja verdade é de si evidente;
  • Teorema é um princípio cuja verdade não é evidente por si mesma; deve ser demonstrado com auxílio de axiomas ou de teoremas já demonstrados;
  • O enunciado de um teorema compreende duas partes: hipótese e conclusão;
  • Hipótese é a afirmação, simples ou condicionada, de uma propriedade que se quer demonstrar.
  • Conclusão é a consequência que o raciocínio deduz da hipótese;
  • Consequência ou corolário é uma verdade que decorre de um ou mais princípios já demonstrados.
  • Lema é um teorema que prepara a demonstração de outro;
  • Problema é uma questão a resolver;
  • As relações existentes entre os números dados e os desconhecidos formam as condições do problema;
  • Resolver um problema é encontrar os números desconhecidos que satisfazem às condições desse problema;
  • A resolução de um problema compreende a solução e o cálculo;
  • Solução é a série de raciocínios que levam ao resultado pedido;
  • Cálculo é a execução das operações indicadas pela solução.

E, ainda mais, relaciona os principais axiomas usados na Aritmética:

  1. O todo é maior do que uma parcela;
  2. O todo é igual à soma das parcelas;
  3. Se de um todo tirarmos uma parcela, o resto será a outra parcela ou o conjunto das outras parcelas;
  4. Duas quantidades iguais a uma terceira são iguais entre si.

Simplesmente fantástico!!!

Categoria : Curiosidades | Matemática | Técnico | Blog
6
set

Nos experimentos anteriores, publicados aqui no Viche, utilizei sómente uma das duas propriedades do objeto XMLHttpRequest que permitem acesso às respostas enviadas pelo servidor – a propriedade responseText.

Como o próprio nome indica, são respostas na forma de um texto não padronizado. Em geral é construído em um formato definido pelo desenvolvedor da aplicação, de maneira que possa ser mais facilmente manipulado para gerar conteúdo em uma página. Como por exemplo, em JSON, HTML ou texto simples sem formatação, normalmente para exibir alertas.

Já a segunda propriedade, responseXML, recebe um objeto XML que é padronizado pela W3C e pode ser manipulado pelas propriedades e métodos dos elementos DOM, através de qualquer linguagem de script.

No exemplo que será detalhado a seguir é utilizado o JavaScript para acessar e manipular o documento XML.

O Resultado do Experimento

Veja de imediato o resultado a ser alcançado, que consiste na manipulação de um objeto XML recebido através da propriedade responseXML, como dito, e apresentado na forma de uma tabela.

Se desejar, clique novamente no link acima para fechar a tabela – claro se aberta :-) – e vice-versa.

O Processo de Desenvolvimento

Penso valer a pena detalhar alguns fatos do processo de desenvolvimento, uma vez que tem um papel importante no resultado final do experimento.

Para minha “surpresa” deparei-me, de cara, com um problema no IE. Enquanto nos demais browsers testados por mim (Firefox, Opera e Netscape) obtinha o resultado esperado, no IE o resultado era nulo. Ou seja, não reconhecia a resposta como um documento XML apesar de ter no programa PHP a instrução correta para gerar o cabeçalho HTTP requerido:

header("Content-type: application/xml; charset=UTF-8");

O uso da instrução header é necessária pois o mime-type do Viche é text/html. Diante do fato fui a procura de informações na WWW, via Google, para identificar e corrigir o problema.

Encontrei vários companheiros na mesma situação e uns poucos artigos publicados com a solução. Testei algumas e, talvez por não compreender de forma adequada as explicações encontradas, continuei na mesma.

Lembrei-me, então, que o Analista de Sistemas Nailson Araújo Brito, da empresa em que trabalho, havia recentemente efetuado uma alteração em nossa Intranet com o uso da propriedade em questão e com o funcionamento correto no IE. Ao analisar o código observei que ele utilizava no método open() do objeto XMLHttpRequest, POST ao invés de GET.

Fiz a substituição e acrescentei a propriedade setRequestHeader(“header”) do objeto para alterar o mime-type do pedido, exigido ao se enviar dados através do método POST, conforme indicado abaixo:

xmlhttp.open("POST", url, true);
xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");

Como o experimento a ser detalhado em seguida não exigia a passagem de parâmetros, alterei o método send() para:

xmlhttp.send('1')

E … funcionou, tanto no IE como nos demais browsers mencionados no início do artigo.

As Dúvidas

Mesmo com o problema solucionado ficaram dúvidas:

  1. É correta a solução, mesmo com o artifício utilizado no método send()?
  2. Por que o IE interpretou corretamente o objeto XML com o método POST?
  3. Qual seria a solução, nas condições do Viche (text/html), para funcionar com o método GET?

Deixo, as dúvidas, em aberto para quem quiser contribuir nos comentários e vamos, finalmente, ao que interessa.

O Experimento

O experimento consiste:

De um programa simples em PHP que gera o documento XML a partir da tabela Categories do Viche.

Do objeto XML.

De funções em JavaScript apresentadas a seguir com comentários que detalham os principais procedimentos executados.

// Cria o objeto XMLHttpRequest
function criaxmlhttp() {
   try {
      xmlhttp = new XMLHttpRequest();
   } catch(ee) {
      try {
         xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
      } catch(e) {
         try {
            xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
        } catch(E) {
            xmlhttp = false;
        }
      }
   }
}

function leXML(url) {
// Verifica se a tabela foi exibida. Se sim, ao clicar
// no link fecha - função limpaResultado()

   if (document.getElementById("cabecalho").hasChildNodes()) {
      limpaResultado();
      return;
   }
   criaxmlhttp();

   document.getElementById("cabecalho").innerHTML = "<img src="%5C%22http:%5C/%5C/www.nghorta.com%5C/wp_aplicacoes%5C/copa2006%5C/progress.gif%5C%22" alt="\"\"" /> Carregando ...";

   xmlhttp.open("POST", url, true);
   xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
   xmlhttp.setRequestHeader("Cache-Control", "no-store, no-cache, must-revalidate");
   xmlhttp.onreadystatechange=function() {
// Verifica se o servidor enviou a resposta de forma
// correta
      if (xmlhttp.readyState == 4) {
         if (xmlhttp.status == 200) {
            limpaResultado();
            montaResultado();
         }
      }
   }
   xmlhttp.send('1')
}

function limpaResultado() {
//Código HTML utilizado no corpo do artigo para
// exibir a tabela
// <span id="cabecalho"></span>
// <table id="resultado" width="100%">
//     <tbody id="r_body">
//     </tbody>
// </table>
// O uso do elemento tbody é necessário por conta do IE
// que não aceita adicionar o elemento tr a tag table

   var header = document.getElementById("cabecalho");
   while(header.childNodes.length > 0) {
      header.removeChild(header.childNodes[0]);
   }
   var tabela = document.getElementById("r_body");
   while(tabela.childNodes.length > 0) {
      tabela.removeChild(tabela.childNodes[0]);
   }
}

function montaResultado() {
// Cria a linha de título das colunas da tabela
   var tr = document.createElement("tr");
// Cria a célula th
   var celula = document.createElement("th");
// Cria o conteúdo Id da celula
   var textoNode = document.createTextNode('Id');
// Adiciona o conteúdo à célula
   celula.appendChild(textoNode);
// Adiciona a célula th ao elemento tr
   tr.appendChild(celula);
   celula = document.createElement("th");
   textoNode = document.createTextNode('Nome Categoria');
   celula.appendChild(textoNode);
   tr.appendChild(celula);
   celula = document.createElement("th");
   textoNode = document.createTextNode('Posts');
   celula.appendChild(textoNode);
   tr.appendChild(celula);
// Adiciona o elemento tr à tabela
   document.getElementById("r_body").appendChild(tr);
// Adiciona estilo à linha
   tr.style.cssText = "background-color: #404e2a; color: #ffffff; padding: 5px; text-align: center";

// Recebe o objeto XML
   var aDados = xmlhttp.responseXML;
// Recupera todos os elementos categoria do objeto
// XML como uma matriz
   var categorias = aDados.getElementsByTagName("categoria");
   for (var i = 0; i < categorias.length; i++) {
// Atribui a cat cada elemento da matriz
      cat = categorias[i];
// Recupera os valores dos nós id, nome e posts
      id = cat.getElementsByTagName("id")[0].firstChild.nodeValue;
      nome = cat.getElementsByTagName("nome")[0].firstChild.nodeValue;
      posts = cat.getElementsByTagName("posts")[0].firstChild.nodeValue;
// Chama a função que cria as linhas da tabela
      adicionaLinha(id, nome, posts)
   }
// Deste ponto em diante deixo para vocês
   var header = document.createElement("h2");
   var texto_header = document.createTextNode("Resultado: Posts por Categoria");
   header.appendChild(texto_header);
   document.getElementById("cabecalho").appendChild(header);
   document.getElementById("resultado").style.cssText = "border-bottom: 5px solid #404e2a;";
}

function adicionaLinha(id, nome, posts) {
   var linha = document.createElement("tr");
   var celula = criaCelula(id);
   celula.style.cssText = "text-align: center;";
   linha.appendChild(celula);
   celula = criaCelula(nome);
   celula.style.cssText = "padding-left: 5px;";
   linha.appendChild(celula);
   celula = criaCelula(posts);
   celula.style.cssText = "text-align: center;";
   linha.appendChild(celula);
   linha.style.cssText = "color: #404e2a;";
   document.getElementById("r_body").appendChild(linha);
}

function criaCelula(texto) {
   var celula = document.createElement("td");
   var textoNode = document.createTextNode(texto);
   celula.appendChild(textoNode);
   return celula;
}

Observação Final

Para a edição dos códigos JavaScript utilizei a extensão Perfomancing do Firefox (link abaixo) que mantém a indentação ao gravar o artigo.

Mas se você utiliza o excerpt do WP, ou seja, publica apenas um trecho do artigo, e não o artigo todo, cuidado! pois você terá que fazer isto no editor do CMS. E aí, babau, a indentação vai para o espaço. Tema abordado no post Edição de Código no Wordpress

E como resolvi: simplesmente na “marra”, gravei o excerpt direto na Tabela que armazena os posts no MySQL.

Dica da extensão obtida no blog Mr. TheChessMan.

powered by performancing firefox

Categoria : AJAX | Javascript | PHP | Técnico | Blog
1
set

Uma maneira fácil e rápida de criar botões (buttons) com qualidade é oferecida gratuitamente pelo buttonator.com, cuja interface desenvolvida em AJAX é mostrada abaixo e que, por sua simplicidade, dispensa maiores comentários.

Interface

Veja alguns exemplos:

Exemplo 1

Exemplo 2

Exemplo 3

Categoria : AJAX | Notícias Expressas | Técnico | Blog