Svmmarivm
Lectiones priores hvivs partis docvervnt circvitvs scribere et de eis cvm invariante et variante ratiocinari; haec lectio eam rationem ad qvattvor algorithmos nvmericos classicos adhibet, compvtatris antiqviores et adhvc in vsv. Examen primalitatis per divisiones tentativas, qvod ad consistit ob cavsam qvae demonstratvr, et cvivs condicio sistendi exvndat si neglegenter scribitvr. Algorithmvs Evclidis ad maximvm commvnem divisorem, cvm svo invariante, sva terminatione, svis insidiis in nvmeris negativis et sva comparatione cvm std::gcd. Mvtatio basis per divisiones svccessivas et regvla Horneri, qvae nvmervm ex cifris svis restitvit et polynomivm eodem schemate aestimat. Et bisectio, qvae radicem approximat intervallvm in dvo secando, theoremate valoris intermedii firmata, cvm nvmero gyrorvm qvi ante compvtatvr. Qvisqve algorithmvs vt obiectvm mathematicvm proponitvr: cvm demonstratione evm facere qvod dicit, demonstratione evm desinere et prima nvmeratione gradvvm eivs.
Proposita discendi
- Examen primalitatis per divisiones vsqve ad implementare et explicare cvr satis sit ad pervenire.
- Algorithmvm Evclidis implementare, eivs invariantem envntiare (maximvs commvnis divisor non mvtatvr) et cvm
std::gcdcomparare. - Nvmervm in aliam basim per divisiones svccessivas convertere et repraesentationem positionalem, vel polynomivm, regvla Horneri aestimare.
- Radicem bisectione vsqve ad tolerantiam approximare, et compvtare qvot iterationes postvlet.
Divisores et nvmeri primi
Divisiones tentativae
Integer primvs est si soli eivs divisores positivi svnt 1 et ; si alivm habet, compositvs est; 0 et 1 neqve hoc neqve illvd svnt. Definitio statim algorithmvm svggerit: qvemqve candidatvm inter 2 et temptare et nvmervm compositvm declarare simvl ac vnvs evm dividat. Est circvitvs minimi divisoris lectionis Circvitvs, et rectvs est. Atqvi pro primo decem cifrarvm fere centies milies centena milia divisionvm facit, et fere omnes invtiles svnt, ob cavsam seqventem.
Si compositvs est, divisorem habet cvm .
Demonstratio
Si compositvs est, vt prodvctvm dvorvm factorvm scribitvr, qvorvm nevter 1 nec aeqvat. Minor dvorvm nominatvr.
Mvltiplicando per positivvm fit , vnde : minor factor cvivsqve factorisationis a sinistra ipsivs iacet.
Divisores igitvr in paribvs apparent, circa reflexis: cvm , paria svnt , , et . Si nvllvs candidatvs vsqve ad ipsvm dividit, nec vllvs vltra dividit, qvia socivs eivs privs apparvisset.
Ex qvo seqvitvr nvmervm divisionvm ab circiter ad circiter descendere: pro prope vicies milies centena milia, a vicies milies centenis milibvs ad qvadraginta sex milia. Programma formam vexilli lectionis Circvitvs rectos designare adhibet: isPrime initio vervm est et circvitvs id exstingvit si divisorem invenit.
#include <iostream>#include <print>int main(){ int n{}; std::cin >> n; bool isPrime{n >= 2}; for (int d{2}; isPrime && d <= n / d; ++d) { if (n % d == 0) { isPrime = false; } } if (isPrime) { std::println("{} primvs est", n); } else { std::println("{} primvs non est", n); }}21474836472147483647 primvs estTria consilia animadversionem merentvr. Vexillvm per n >= 2 initialisatvr, ita vt 0, 1 et nvmeri negativi non primi declarentvr sine ingressv in circvitvm: hvnc casvm oblivisci error typicvs est, qvia cvm circvitvs nvllvm gyrvm facit et programma 1 primvm declararet. Condicio ipsivs for dvo membra habet: vexillvm, qvod circvitvm in primo divisore sistit, et limitem. Et limes scribitvr d <= n / d, qvod, pro integris positivis, aeqvivalet ipsi (divisio integra trvncat, sed qvotientem trvncatvm non svperat prorsvs cvm non svperat, qvia integer est). Nvmervs introitvs, , maximvs int est et primvs; programma id decernit residvis, eis candidatorvm a 2 ad .
Invarians circvitvs est: nvllvs integer a 2 ad ipsvm dividit, dvm vexillvm vervm manet. Valet in ingressv, cvm intervallvm a 2 ad 1 vacvvm est; conservatvr, qvia si ipsvm non dividit, intervallvm nvmero crescit qvi evm non dividit; et in egressv cvm vexillo vero, invarians et condicio falsa, , simvl dicvnt nvllvm candidatvm vsqve ad ipsvm dividere, qvod propositio postvlat. Varians est nvmervs candidatorvm qvi temptandi restant, id est integrorvm inter et : vno in qvoqve gyro decrescit nec infra nihil descendit.
Condicio qvae exvndat
Modvs natvralis limitem scribendi est d * d <= n, et error est. Cvm introitv priore circvitvs ad pervenit, et tvm prodvctvm maximvm int svperat.
#include <iostream>#include <print>int main(){ int n{}; std::cin >> n; bool isPrime{n >= 2}; for (int d{2}; isPrime && d * d <= n; ++d) { if (n % d == 0) { isPrime = false; } } std::println("Primvs? {}", isPrime);}2147483647main.cpp:9:33: runtime error: signed integer overflow: 46341 * 46341 cannot be represented in type 'int'Programma codice 1 finitvm est.
Detector modi agendi indefiniti programma in prodvcto sistit. Sine eo, exvndatio cvm signo modvs agendi indefinitvs est, et norma non dicit qvid accidat. Qvod cvm GCC in Linux observatvr, cvm optimizatione et sine ea, instrvctivvm est: prodvctvm circvmvertitvr et negativvm fit vel minvs qvam , et cvm nvllvs int maximvm svperet, condicio d * d <= n nvmqvam iam impleri desinit; circvitvs candidatos temptare pergit per circiter vicies milies centena milia gyrorvm, donec ad pervenit, qvod ipsvm dividit, et programma nvmervm primvm compositvm declarat. Error exvndationis non vt exvndatio se ostendit, sed vt responsvm falsvm. Forma d <= n / d exvndare non potest, qvia dividit pro mvltiplicando; lectio Bit et bibliotheca mathematica alivd effvgivm praebebat, limitem semel per std::sqrt compvtare, sed tvm accvratio limitis a rotvndatione virgvlae flvitantis pendet, et divisio integra eam difficvltatem non habet.
Lectio «Nvmeri primi et theorema fvndamentale arithmeticae», cvrsvs Algebra et Geometria I, demonstrat omnem integrvm maiorem qvam 1 prodvctvm primorvm vno tantvm modo esse; divisiones tentativae via directissima svnt id prodvctvm inveniendi, per qvemqve divisorem inventvm dividendo et cvm qvotiente pergendo.
Argvmentvm oneratvr…