;(function() { window.createMeasureObserver = (measureName) => { var markPrefix = `_uol-measure-${measureName}-${new Date().getTime()}`; performance.mark(`${markPrefix}-start`); return { end: function() { performance.mark(`${markPrefix}-end`); performance.measure(`uol-measure-${measureName}`, `${markPrefix}-start`, `${markPrefix}-end`); performance.clearMarks(`${markPrefix}-start`); performance.clearMarks(`${markPrefix}-end`); } } }; /** * Gerenciador de eventos */ window.gevent = { stack: [], RUN_ONCE: true, on: function(name, callback, once) { this.stack.push([name, callback, !!once]); }, emit: function(name, args) { for (var i = this.stack.length, item; i--;) { item = this.stack[i]; if (item[0] === name) { item[1](args); if (item[2]) { this.stack.splice(i, 1); } } } } }; var runningSearch = false; var hadAnEvent = true; var elementsToWatch = window.elementsToWatch = new Map(); var innerHeight = window.innerHeight; // timestamp da última rodada do requestAnimationFrame // É usado para limitar a procura por elementos visíveis. var lastAnimationTS = 0; // verifica se elemento está no viewport do usuário var isElementInViewport = function(el) { var rect = el.getBoundingClientRect(); var clientHeight = window.innerHeight || document.documentElement.clientHeight; // renderizando antes, evitando troca de conteúdo visível no chartbeat-related-content if(el.className.includes('related-content-front')) return true; // garante que usa ao mínimo 280px de margem para fazer o lazyload var margin = clientHeight + Math.max(280, clientHeight * 0.2); // se a base do componente está acima da altura da tela do usuário, está oculto if(rect.bottom < 0 && rect.bottom > margin * -1) { return false; } // se o topo do elemento está abaixo da altura da tela do usuário, está oculto if(rect.top > margin) { return false; } // se a posição do topo é negativa, verifica se a altura dele ainda // compensa o que já foi scrollado if(rect.top < 0 && rect.height + rect.top < 0) { return false; } return true; }; var asynxNextFreeTime = () => { return new Promise((resolve) => { if(window.requestIdleCallback) { window.requestIdleCallback(resolve, { timeout: 5000, }); } else { window.requestAnimationFrame(resolve); } }); }; var asyncValidateIfElIsInViewPort = function(promise, el) { return promise.then(() => { if(el) { if(isElementInViewport(el) == true) { const cb = elementsToWatch.get(el); // remove da lista para não ser disparado novamente elementsToWatch.delete(el); cb(); } } }).then(asynxNextFreeTime); }; // inicia o fluxo de procura de elementos procurados var look = function() { if(window.requestIdleCallback) { window.requestIdleCallback(findByVisibleElements, { timeout: 5000, }); } else { window.requestAnimationFrame(findByVisibleElements); } }; var findByVisibleElements = function(ts) { var elapsedSinceLast = ts - lastAnimationTS; // se não teve nenhum evento que possa alterar a página if(hadAnEvent == false) { return look(); } if(elementsToWatch.size == 0) { return look(); } if(runningSearch == true) { return look(); } // procura por elementos visíveis apenas 5x/seg if(elapsedSinceLast < 1000/5) { return look(); } // atualiza o último ts lastAnimationTS = ts; // reseta status de scroll para não entrar novamente aqui hadAnEvent = false; // indica que está rodando a procura por elementos no viewport runningSearch = true; const done = Array.from(elementsToWatch.keys()).reduce(asyncValidateIfElIsInViewPort, Promise.resolve()); // obtém todos os elementos que podem ter view contabilizados //elementsToWatch.forEach(function(cb, el) { // if(isElementInViewport(el) == true) { // // remove da lista para não ser disparado novamente // elementsToWatch.delete(el); // cb(el); // } //}); done.then(function() { runningSearch = false; }); // reinicia o fluxo de procura look(); }; /** * Quando o elemento `el` entrar no viewport (-20%), cb será disparado. */ window.lazyload = function(el, cb) { if(el.nodeType != Node.ELEMENT_NODE) { throw new Error("element parameter should be a Element Node"); } if(typeof cb !== 'function') { throw new Error("callback parameter should be a Function"); } elementsToWatch.set(el, cb); } var setEvent = function() { hadAnEvent = true; }; window.addEventListener('scroll', setEvent, { capture: true, ive: true }); window.addEventListener('click', setEvent, { ive: true }); window.addEventListener('resize', setEvent, { ive: true }); window.addEventListener('load', setEvent, { once: true, ive: true }); window.addEventListener('DOMContentLoaded', setEvent, { once: true, ive: true }); window.gevent.on('allJSLoadedAndCreated', setEvent, window.gevent.RUN_ONCE); // inicia a validação look(); })();
  • AssineUOL
Topo

Para onde o mundo vai

OPINIÃO

Texto em que o autor apresenta e defende suas ideias e opiniões, a partir da interpretação de fatos e dados.

Como tranças de cabelo inspiram a ciência na criação do computador quântico

Representação artística do processador Sycamore, do projeto de computador quântico do Google - Forest Stearns/ Google
Representação artística do processador Sycamore, do projeto de computador quântico do Google Imagem: Forest Stearns/ Google

Computadores são baseados em bits —pequenas chaves que podem estar ligadas (bit 1) ou desligadas (bit 0). A complexidade das tarefas que um computador pode executar vem da enorme quantidade de bits disponíveis, assim como das operações que manipulam esses bits. É incrível como uma máquina tão simples pode pagar suas contas, controlar usinas de energia, sistemas hospitalares, executando todo o tipo de tarefas. O que seria possível se os bits fossem mais versáteis?

Essa é parte da motivação por trás de um computador quântico —utilizar as novas possibilidades de bits quânticos, que podem estar "entre 0 e 1", para executar novas operações, algumas mais difíceis que as operações executáveis em computadores convencionais.

Por exemplo, com computadores quânticos, fazer determinadas operações matemáticas com números enormes se torna mais simples, e talvez signifique que os sistemas modernos de criptografia (suas operações de cartão de crédito, por exemplo, são seguras porque computadores clássicos não sabem manipular números enormes) tenham que ser remodelados.

Além disso, provavelmente poderíamos simular moléculas nesse computador, abrindo um universo de possibilidades de produção de novos materiais e novos fármacos.

Descrever como um computador quântico funciona em detalhe nos levaria em várias direções interessantes, mas nesta coluna quero focar em outro aspecto — o porquê de computadores quânticos serem tão difíceis de se produzir na prática.

Mais incrível, quero descrever a ideia fascinante que vários cientistas estão explorando para resolver esse problema.

A ideia é familiar para quem tem cabelos compridos: tranças!

O formato da trança no cabelo demonstra o que você deseja —proteger os cabelos, mudar a estética, sentir menos calor no pescoço etc. Formando tranças em circuitos de laboratório, cientistas querem criar bits quânticos.

Primeiro, o problema.

Gerar um bit quântico não é muito complicado em laboratórios modernos. Por exemplo, podemos manipular um átomo dentro de um cristal, aplicando correntes elétricas e campos magnéticos etc.

O problema é que, após terminarmos nossa manipulação, o átomo está rodeado por outras partículas dentro do cristal. Essas partículas começam a colidir com o átomo manipulado, e rapidamente o estado quântico que preparamos é perdido nessas colisões. Se formos observar o sistema depois de pouco tempo, não estará mais onde queríamos.

Esse problema existe até mesmo em computadores convencionais. Nesse caso, como a informação é binária — ou 0 ou 1, ou ligado ou desligado — é relativamente simples corrigir o problema.

Uma analogia: coloque uma pequena bolinha numa coluna de mel de um metro de altura. Se você p a bolinha no topo da coluna, a bolinha marca o bit 1. Se colocar na base, bit 0. Agora você põe a bolinha no topo da coluna e vai almoçar.

Enquanto isso, seu colega entra no laboratório e observa a bolinha a setenta centímetros de altura. Mesmo a bolinha não estando no topo, seu colega saberá que você preparou a bolinha no bit 1, e pode inclusive reajustá-la, movendo-a para o topo.

Quase sempre esse sistema vai se reajustar e manter a informação correta. Raramente você terá má sorte e a bolinha vai parar bem no meio da coluna, e o sistema pode colocá-la na posição errada.

Por isso que computadores, mesmo sendo robustos, de vez em quando falham!

O bit quântico, nessa analogia, é muito mais frágil. É como se nossa bolinha na coluna de mel tivesse um formato mais pontudo, e a informação está na direção em que a bolinha aponta, e não na sua altura na coluna. Qualquer turbulência na coluna vai mudar a direção para onde a bolinha aponta, e a informação se vai.

Há cerca de vinte anos, o físico russo-americano Alexei Kitaev propôs uma nova ideia para criar bits quânticos robustos. Alguns anos antes, físicos descobriram que determinadas partículas carregam um "fio de cabelo" consigo quando se movem em um circuito. Esse "cabelo quântico" é quase indetectável, e sozinho, não resolve nosso problema.

Imagine, na nossa analogia da coluna de mel, que coloquemos uma corda na ponta da nossa bolinha. Se o meio ficar turbulento, a corda vai chacoalhar e qualquer informação que tivermos preparado será destruída.

Se você tem cabelos compridos (ou faz crochê), já sabe a solução que Kitaev propôs.

Pegue várias dessas partículas/bolinhas, e mova umas ao redor das outras. Agora seus fios de cabelo vão gerar uma trança. A trança pode ser chacoalhada o quanto você quiser, mas a sequência de nós ao longo da trança não será destruída.

A ideia de Kitaev é usar as tranças como bits quânticos, abrindo uma nova série de possibilidades. As operações incluem adicionar uma nova trança, remover uma trança, entrançar com outra bolinha etc.

Essa proposta têm um pequeno problema.

Antes, os bits quânticos (na nossa analogia da bolinha) carregavam bastante informação, pois podiam apontar em qualquer direção.

As tranças podem ser complexas, mas na prática somente um determinado número (grande, mas não infinito) de tranças pode ser gerado e manipulado em laboratório.

Mesmo assim, um computador quântico baseado nessas tranças já seria capaz de realizar tarefas muito mais complicadas do que um computador clássico, e de forma robusta.

Provavelmente ainda estamos um pouco distantes de computadores quânticos sendo parte do nosso dia a dia, ou mesmo um único computador quântico capaz de tarefas que têm utilidade prática, e muito mais eficientes do que computadores convencionais.

Nesse momento, vários grupos de pesquisa ao redor do mundo tentam produzir bits quânticos robustos, baseados em tranças (por exemplo, esse grupo em Copenhagen).

O desafio tecnológico é enorme, mas as consequências, em caso de sucesso, serão revolucionárias para o nosso futuro.

Da próxima vez que você ver (ou fizer) uma trança, imagine que na natureza pequenas partículas dançam umas ao redor das outras, gerando longas tranças, com o potencial de se tornarem os bits de informação do futuro.