Qual é calculado mais rapidamente,


10

Qual é calculado mais rapidamente, ou log a c ou b ablogac ? a,becsão reais positivos comb>1.cbabcb>1

Que tipos de algoritmos você usará na comparação? Quais são as suas complexidades?

Por exemplo, quando ou c a bcabcab

Essa pergunta foi inspirada nos comentários sobre a questão da troca de pilhas em matemática Qual é o objetivo da aproximação de Stirling a um fatorial? . Especialmente, os comentários deixados por mjqxxxx , Thomas Andrews e eu.


Os moderadores também podem, aparentemente, aprovar edições. Concordo com a sugestão de @ MarkBooth e a incorporei na pergunta, como ele sugeriu.
Aron Ahmadia 13/01/12

Sinta-se à vontade para arrumar (excluir) comentários agora que eles cumpriram seu objetivo. * 8 ')
Mark Booth

Respostas:


8

Veja minha resposta a esta pergunta para alguns problemas relacionados.

Em geral, os computadores podem apenas adicionar, subtrair, multiplicar, dividir e mudar de bits. Por uma questão de argumento, vamos supor que você não esteja calculando no caso especial em que a é uma potência de 2 eb é um número natural, porque esse caso se reduz a uma mudança de bits e, portanto, é fácil.abab

Se é um número natural e você deseja calcular a b , pode usar a exponenciação da cadeia de adição . Todos os outros casos da sua pergunta são difíceis (em geral).bab

Alguns algoritmos rápidos usados ​​para aproximar essas funções à alta precisão requerem magia negra. Para entender o que quero dizer com "magia negra", dê uma olhada nesta publicação de Martin Ankerl e em um artigo associado ao qual ele vincula a Computação Neural . Veja também o algoritmo CORDIC .

Tipos semelhantes de truques de troca de bits são explicados em Hacker's Delight (o link está no site complementar do livro).

Outras maneiras de calcular boas aproximações usam a análise numérica (consulte o artigo da Wikipedia sobre teoria da aproximação ). Uma má maneira de fazer isso é montar uma equação diferencial apropriada e integrá-la usando um método numérico como o método de Euler (como eu disse, uma aproximação ruim, mas você pode fazê-lo). Uma maneira melhor de fazer isso é usar aproximações em série. A série Taylor converge muito lentamente, portanto, algo como um aproximado Padé ou algum outro tipo de aproximação de série de convergência rápida pode ser usado (outros aproximadores racionais, séries Chebyshev, etc.).

O algoritmo usado para aproximar as funções acima dependerá de sua arquitetura, requisitos de velocidade e requisitos de precisão.

O problema de falar sobre complexidades é que qualquer algoritmo calcula apenas uma aproximação de ponto flutuante das funções mencionadas, portanto o tempo de execução certamente dependerá da precisão exigida por sua aproximação. Mesmo levando isso em consideração, não acho que a complexidade computacional seja uma boa primeira aproximação do desempenho; o tamanho de seus insumos vai ser medido em bits (ou seja, o número de bits que é preciso para representar , b e cabc), que serão dependentes da precisão, em vez de depender das magnitudes das próprias entradas numéricas. Para fins práticos, a precisão da representação numérica dos números não varia muito (precisão única, precisão dupla, precisão quádrupla), e você normalmente não decide usar essa precisão com base em estimativas de complexidade computacional de funções escalares . A métrica mais relevante é a hora do relógio de parede e, a menos que você esteja usando uma arquitetura especial (sistemas embarcados) ou seu aplicativo exija realmente um exponencial rápido (consulte o link da postagem do blog e o link Neural Computation acima), as bibliotecas intrínsecas em seu linguagem de escolha provavelmente está bem.


4

Essa é uma boa pergunta, porque entender algoritmos e desempenho numéricos é um pré-requisito importante para ser um cientista computacional eficaz. Ao mesmo tempo, é uma pergunta ruim porque as restrições apresentadas não a qualificam suficientemente para dar uma resposta significativa.

abcdn

M2

dn=2|M|+1

Por exemplo, o número -8 pode ser representado com 4 dígitos binários. Para desempenho e eficiência de espaço, as unidades lógicas aritméticas (ALUs), responsáveis ​​por cálculos numéricos de números inteiros em unidades de processamento modernas, são projetadas para lidar com matemática em números inteiros até um tamanho fixo, sendo as mais comuns atualmente d = 32 ed = 64 Não apenas os processadores x86 como no seu computador têm ALUs, eles são um elemento fundamental da arquitetura de computadores onipresente na sociedade eletrônica de hoje. Se você está familiarizado com os consoles de videogame, lembre-se do Nintendo 64, um sistema de videogame com o nome do tamanho (em bits), das unidades lógicas aritméticas no processador do console.

xx

nbb=2b=10sex é então representado aproximadamente como:

x=sbe

13dn.

Uma quantidade significativa de esforço intelectual nos últimos 50 anos foi investida na melhoria da capacidade do processador para calcular operações aritméticas de ponto flutuante com eficiência. Nos processadores modernos, esses cálculos são manipulados por uma ou mais unidades de ponto flutuante (FPUs), uma versão mais sofisticada da unidade lógica aritmética projetada para executar operações aritméticas em números de ponto flutuante e, geralmente, projetadas para lidar com ambas as especificações do IEEE 754. números de ponto flutuante de bits (geralmente chamados de 'flutuadores') e números de ponto flutuante de 64 bits (geralmente chamados de 'dobras') com eficiência. Semelhante às unidades lógicas aritméticas, as unidades de ponto flutuante geralmente calculam adição, subtração e multiplicação em apenas alguns ciclos, enquanto a divisão geralmente requer um pouco mais.

abc

  1. ab
  2. ac
  3. c1b

1 A exponenciação geral é geralmente implementada com a seguinte identidade:

ab=βalogβb

β2eβ=2abt=alog2b2t

FYL2X + F2XM1 + ~ 20 = 80 + 51 + ~ 20 = ~ 151 ciclos

2 Isso pode ser transformado em dois logaritmos e uma divisão pela alteração da identidade da base e não precisa ser redimensionado para um resultado preciso.

2 * FYL2X + FDIV = 2 * 80 + (7 a 27) = 167 a 187 ciclos

[3] Isso é equivalente a uma divisão seguida por uma exponenciação, portanto [1] mais FDIV, ~ 175 ciclos.


0

Deixe-me ver se posso parafrasear a pergunta:

abloga(c)a

Resposta : realmente depende se c tem ou não alguma dependência de a e como a se compara a b (maior que, menor que ou igual).

cba

cloga(c)=ln(c)/ln(a)loga(c)abaab=ω(loga(c))

c=abloga(ab)=bbabloga(c)ab=ω(loga(c))

cababc=Θ(ab)

loga(c)c1/b

abc

cc1/bbc1/b=o(loga(c))

c=abloga(c)=ac1/b=aloga(c)=Θ(c1/b)

cababc

c1/bab

cc1/babc1/b=o(ab)

c=abc1/b=ab>1abc1/b

abc


Dividirei meus comentários em duas partes: estilística e conteúdo. Estilisticamente, entendo que você incluiu equações em sua postagem. Reformate-os para usar o MathJax para que sejam renderizados corretamente (como, por exemplo, na pergunta postada). Para tirar proveito do MathJax, use a notação LaTeX ao escrever suas equações. Para obter uma cartilha sobre como escrever matemática no LaTeX, consulte este guia no Wikilivros ou este pequeno guia da Sociedade Americana de Matemática .
precisa saber é o seguinte

ablogca
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.