Che viene calcolato più velocemente,


10

Che viene calcolato più velocemente, oppure registra a c o b ablogac ? un,becsono reali positivi conb>1.cbabcb>1

Quali tipi di algoritmi utilizzerai nel confronto? Quali sono le loro complessità?

Ad esempio, quando o c a bcabcab

Questa domanda è stata ispirata dai commenti sulla domanda di scambio di stack matematici Qual è lo scopo dell'approssimazione di Stirling a un fattoriale? . Soprattutto, quei commenti lasciati da mjqxxxx , Thomas Andrews e me.


I moderatori possono anche, apparentemente, approvare le modifiche. Sono d'accordo con il suggerimento di @ MarkBooth e l'ho incorporato nella domanda come ha suggerito.
Aron Ahmadia,

Sentiti libero di riordinare (eliminare) i commenti ora hanno servito al loro scopo. * 8 ')
Mark Booth,

Risposte:


8

Vedi la mia risposta a questa domanda per alcuni problemi correlati.

In generale, i computer possono solo aggiungere, sottrarre, moltiplicare, dividere e spostare i bit. Per amor di discussione, supponiamo che si sta non calcolando nel caso particolare in cui una è una potenza di 2 e B è un numero naturale, perché questo caso si riduce a un cambiamento po ', ed è quindi facile.abab

Se è un numero naturale e si desidera calcolare una b , è possibile utilizzare l' espiazione della catena di addizione . Ogni altro caso nella tua domanda è difficile (in generale).bab

Alcuni algoritmi veloci usati per approssimare queste funzioni ad alta precisione richiedono la magia nera. Per vedere cosa intendo per "magia nera", dai un'occhiata a questo post sul blog di Martin Ankerl e ad un documento associato a cui si collega in Neural Computation . Vedi anche l' algoritmo CORDIC .

Simili tipi di trucchi per capovolgere i bit sono spiegati in Hacker's Delight (il link è al sito Web associato del libro).

Altri modi per calcolare buone approssimazioni usano l'analisi numerica (vedi l'articolo di Wikipedia sulla teoria dell'approssimazione ). Un brutto modo per farlo è quello di elaborare un'equazione differenziale appropriata e integrarla usando un metodo numerico come il metodo di Eulero (come ho detto, una cattiva approssimazione, ma puoi farlo). Un modo migliore per farlo è usare approssimazioni in serie. La serie di Taylor converge troppo lentamente, quindi si potrebbe usare qualcosa di simile a un approssimativo di Padé o qualche altro tipo di approssimazione di serie a rapida convergenza (altri approssimativi razionali, serie di Chebyshev, ecc.).

L'algoritmo utilizzato per approssimare le funzioni sopra dipende dall'architettura, dai requisiti di velocità e dai requisiti di precisione.

Il problema nel parlare di complessità è che qualsiasi algoritmo calcolerà solo un'approssimazione in virgola mobile delle funzioni menzionate, quindi il tempo di esecuzione dipenderà sicuramente dall'accuratezza richiesta dall'approssimazione. Anche tenendo conto di ciò, non penso che la complessità computazionale sia una buona prima approssimazione delle prestazioni; la dimensione dei tuoi input verrà misurata in bit (ovvero, il numero di bit necessari per rappresentare , b e cabc), che dipenderanno dalla precisione, piuttosto che dalla grandezza degli input numerici stessi. Ai fini pratici, la precisione della rappresentazione numerica dei numeri non varia molto (precisione singola, doppia precisione, precisione quadrupla) e in genere non si decide di utilizzare tale precisione in base a stime di complessità computazionale delle funzioni scalari . La metrica più rilevante è l'ora del wall-clock e, a meno che tu non stia utilizzando un'architettura speciale (sistemi incorporati) o la tua applicazione richieda davvero un esponenziale veloce (vedi il link del post sul blog e il link di calcolo neurale sopra), le librerie intrinseche nel tuo la lingua prescelta va probabilmente bene.


4

Questa è una buona domanda perché la comprensione degli algoritmi numerici e delle prestazioni è un prerequisito importante per essere uno scienziato computazionale efficace. Allo stesso tempo, è una domanda scadente perché i vincoli proposti non lo qualificano sufficientemente per dare una risposta significativa.

abcdn

M2

dn=2|M|+1

Ad esempio, il numero -8 può essere rappresentato con 4 cifre binarie. Per prestazioni ed efficienza dello spazio, le unità logiche aritmetiche (ALU), responsabili dei calcoli numerici di numeri interi su unità di elaborazione moderne, sono progettate per gestire la matematica su numeri interi fino a una dimensione fissa, il più comune in questi giorni è d = 32 e d = 64. Non solo i processori x86 come nel tuo computer hanno ALU, ma sono un elemento fondamentale dell'architettura informatica onnipresente nella società elettronica di oggi. Se hai familiarità con le console per videogiochi, potresti ricordare il Nintendo 64, un sistema di videogiochi che prende il nome dalle dimensioni (in bit), le unità logiche aritmetiche sul processore della console sono state progettate per essere gestite.

xx

nbb=2b=10sex viene quindi approssimativamente rappresentato come:

x=sbe

13dn.

Negli ultimi 50 anni è stato investito un notevole sforzo intellettuale per migliorare la capacità del processore per calcolare in modo efficiente le operazioni aritmetiche in virgola mobile. Sui processori moderni, questi calcoli sono gestiti da una o più unità a virgola mobile (FPU), una versione più sofisticata dell'unità logica aritmetica progettata per eseguire operazioni aritmetiche su numeri in virgola mobile e solitamente progettata per gestire entrambi i requisiti IEEE 754 32 -bit numeri in virgola mobile (spesso indicati come "float") e numeri in virgola mobile a 64 bit (spesso indicati come "doppi") in modo efficiente. Simile alle unità logiche aritmetiche, le unità a virgola mobile possono spesso calcolare addizione, sottrazione e moltiplicazione in pochi cicli, mentre la divisione di solito richiede un po 'di più.

abc

  1. ab
  2. ac
  3. c1b

1 L'esponenziazione generale viene spesso implementata con la seguente identità:

ab=βalogβb

β2eβ=2abt=alog2b2t

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

2 Questo può essere trasformato in due logaritmi e una divisione dal cambiamento dell'identità di base e non necessita di riscalaggio per un risultato accurato.

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

[3] Ciò equivale a una divisione seguita da una esponenziazione, quindi [1] più FDIV, ~ 175 cicli.


0

Fammi vedere se posso parafrasare la domanda:

abloga(c)a

Risposta : dipende davvero dal fatto che c abbia o meno dipendenza da a, e da come a sia paragonabile a b (maggiore di, minore di o uguale).

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


Dividerò i miei commenti in due parti: stilistico e contenuto. Stilisticamente, apprezzo che tu abbia incluso le equazioni nel tuo post. Si prega di riformattarli per utilizzare MathJax in modo che vengano visualizzati correttamente (come, ad esempio, nella domanda pubblicata). Per sfruttare MathJax, usa la notazione LaTeX quando scrivi le tue equazioni. Per informazioni di base sulla scrittura di matematica in LaTeX, consulta questa guida in Wikibooks o questa breve guida dell'American Mathematical Society .
Geoff Oxberry,

ablogca
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.