книги / Mathematica 5. ╨б╨░╨╝╨╛╤Г╤З╨╕╤В╨╡╨╗╤М
.pdf3729941413991192954257293905515987341623164931728987789298548218169139
5638163536241282159945102531936490365111022151523381436452790489309133
7135424027258899192161986823235528295581059873200107875550497563219302
4344987469732081489429513875050815089544676150938253329884107629370887
7836604655306868577285538664595048264681443930199901657433773640659222
5567911709051797128549077311912778888144108736659703862174018641106917
5749952023659419640302178959561265901520782425747790756781859047252118
7834397950104895326861429034026538474079051464877355002168754758452522
2504190436087068107827922710445722736236879669324173378416116695919841
0304677682964919409043870523002732003770237480443431032331691094261441
1443802983487519201990595627905118880497502650026828835219138968584962
8968612357880766725385147857934444955391441537519437285121796122315842
8624231899492121175279814486360858048056575120864817906982359465546791
0333455703061443068891823765935581887182311839775111872409211627286291
2671381160865803740893007151687615872534112762296886660.521036261139972
8215256794224599912431852531227205445323135206226637942724364187507359
9561819112180689917957773267962616087523437758046684223813614460906815
8859423168444990563130856914398161104641435976464505827310532042357277
8055041510761287441331660970400343561555943556993103725670073628460112
4392438005172117946648151586517714791609426531867375357616728998278915
6765819918501461470394696987900055057821804367427737785530796529257310
0704405035528657706565889113413367817192934796097513499651992416721568
8582041932369782649567521678584676130166505149750837355470484537680891
7106579182046296637409148513289873712928793514345917581372183082138176
8374444936696984757491555027227218191496737306894525429493301724974763
4880287892338097288098981994162698166278766445393167015463543161066099
4478782022049824681885420029046846763098262298893067982085873006027223
5476735450044805739148100924911019338705887449906544811444564378814239
2205726681802780327973470136681753346929095906271088971584210825489831
3134138767612788549048657824912624883639420318879265232485613570477399
7090467104480778132423835257758424180335745170573652705419795069195190
8858510985383906254985074673094196111657808386987133103440863605484510
7081922257029648252724270305699507491876725741414282227189033471727764
3954342541859509907472906259527629621846811719367901786024179895120064
9296133065178107633744949972930820555024320766184645860276161198156767
7373636018999149195717505734613349483793082747826653826109388871646107
6377076699523221210638410121119502728028192147321213391939138517117401
8054543600453475322352999580219232920276778840652994222860862521050680
5680779347684445472832022947989505073864225065042453778536680082426933
6818816623176949556726361708670651772685686418825606961363993789380923
6306153420664991067712166783072652806506511543078782208618706781689410
9743170406015960678013961777060204838325510730464182561678677866776664
1145888295077288459709643465468572600850673752055883218340619680664771
3695475465058265972218278752703801335088536077384715897009519636940664
4986845955931896822762457057294441289666846719625035790435931009430361
3350580572837195254247505334922434012206891543167881708739008884991490
5882791350768045506828033944542308221148888187376496354399413641511521
2683005334092753230471448815684295521726253123958196789418655868201079
5291845929630207675781253000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000
00 00 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000
00 00 00 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
Числа, их представление и операции над ними |
73 |
0000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000
о о о о о о о о о о о о о о о о о о о о о о о о о о о о о о о о о о о о о о о о о о о о о о о о о о о о о о о о о о о о о о о о о о о о о о
0000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000001308948114465174795123603548945492
90725102417205882279175127Х103663
Ну, как? Не думаете ли вы, что это число заслуживает того, чтобы вычислить его целую и дробную части по отдельности? Сначала вычислим целую часть.
IntegerPartPisotNumber=IntegerPart[N[PisotNumber,5555]]
•5043165960656654932150594692427574810776102746808935031678444677128757
1822648621061039807658193406827538578254082133094787003547778717669468
5987718254576565515786375180403084108087720197360263045377599299252600
7874643437115478340662656654242263167137970470876460028676595720882553
7299414139911929542572939055159873416231649317289877892985482181691395
6381635362412821599451025319364903651110221515233814364527904893091337
1354240272588991921619868232355282955810598732001078755504975632193024
3449874697320814894295138750508150895446761509382533298841076293708877
8366046553068685772855386645950482646814439301999016574337736406592225
5679117090517971285490773119127788881441087366597038621740186411069175
7499520236594196403021789595612659015207824257477907567818590472521187
8343979501048953268614290340265384740790514648773550021687547584525222
5041904360870681078279227104457227362368796693241733784161166959198410
3046776829649194090438705230027320037702374804434310323316910942614411
4438029834875192019905956279051188804975026500268288352191389685849628
9686123578807667253851478579344449553914415375194372851217961223158428
6242318994921211752798144863608580480565751208648179069823594655467910
3334557030614430688918237659355818871823118397751118724092116272862912
6713811608658037408930071516876158725341127622968866605210362611399728
2152567942245999124318525312272054453231352062266379427243641875073599
5618191121806899179577732679626160875234377580466842238136144609068158
8594231684449905631308569143981611046414359764645058273105320423572778
0550415107612874413316609704003435615559435569931037256700736284601124
3924380051721179466481515865177147916094265318673753576167289982789156
7658199185014614703946969879000550578218043674277377855307965292573100
7044050355286577065658891134133678171929347960975134996519924167215688
5820419323697826495675216785846761301665051497508373554704845.376808917
1065791820462966374091485132898737129287935143459175813721830821381768
3744449366969847574915550272272181914967373068945254294933017249747634
8802878923380972880989819941626981662787664453931670154635431610660994
4787820220498246818854200290468467630982622988930679820858730060272235
4767354500448057391481009249110193387058874499065448114445643788142392
2057266818027803279734701366817533469290959062710889715842108254898313
1341387676127885490486578249126248836394203188792652324856135704773997
74 |
ГГ7ава 3 |
09046710448077813242383525775842418033574517057365270541979506919^1908
8585109853839062549850746730941961116578083869871331034408636054845107
0819222570296482527242703056995074918767257414142822271890334717277643
9543425418595099074729062595276296218468117193679017860241798951200649
2961330651781076337449499729308205550243207661846458602761611981567677
3736360189991491957175057346133494837930827478266538261093888716461076
3770766995232212106384101211195027280281921473212133919391385171174018
0545436004534753223529995802192329202767788406529942228608625210506805
6807793476844454728320229479895050738642250650424537785366800824269336
8188166231769495567263617086706517726856864188256069613639937893809236
3061534206649910677121667830726528065065115430787822086187067816894109
7431704060159606780139617770602048383255107304641825616786778667766641
1458882950772884597096434654685726008506737520558832183406196806647713
6954754650582659722182787527038013350885360773847158970095196369406644
9868459559318968227624570572944412896668467196250357904359310094303613
3505805728371952542475053349224340122068915431678817087390088849914905
8827913507680455068280339445423082211488881873764963543994136415115212
6830053340927532304714488156842955217262531239581967894186558682010795
291845929630207675781253
“Ну и что?” — возможно, скажете вы. Тогда присмотритесь внимательнее, где на чинаются нули. Да, именно с них и начинается дробная часть.
N [PisotNumber-IntegerPartPisotNumber,5555]
N::meprec |
Internal precision limit |
|
|
$MaxExtraPrecision |
50. reached |
while evaluating |
|
-5043165960 «3644» |
7675781253 « 1 » « 1 » . More... |
1.30894811446517479512360354894549290725102417205882279175127063157759
5957302806949481931774975390950288082252 xlO"1832
Из этого видно, что после десятичной точки следует 1831 нуль! Чтобы обнаружить, что это число не целое, нужно вычислить его не менее, чем с 5496 десятичными зна ками. Вот это можно было бы устроить розыгрыш!
Упражнение 3.3. Пусть
|
f |
F ibon acti[n + 2 |
\ _1 |
|
|
= - ---------- ---- |
|
||
|
•* ti.n |
Q Fihoruwci[n Щ _j |
|
|
Положим теперь a = л/Г7 - Vl4 , n = 25. |
|
|
||
f l 1964l8 |
__ i |
|
|
|
Рассмотрим число f a25= |
‘ |
ПРИ a = ^ |
~ |
* |
a |
—1 |
|
|
|
Сколько у этого числа нулей следует сразу после десятичной точки?
Решение. Вот самое простое решение. Сначала вводим определение дроби f a n.
aFibonacci[k+2] _ ^
F F r a c t io n [ a _ , k_]
3 Fibonacci[k+1] _ ^
Теперь нужно вычислить число с такой точностью, чтобы найти хотя бы один не нулевой знак после запятой. Давайте попробуем.
N [ F F r a c t i o n [ S q r t [ 1 7 ] - S q r t [14],25],50]
1 . 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
Ну и как? А вот еще:
Числа, их представление и операции над ними |
75 |
N [ F F r a c t i o n [ S q r t [ 1 7 ] - S q r t [ 1 4 ] , 2 5 ] , 5 00]
1 . 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 00 000 000 000 0
Хотите еще? Пожалуйста.
N [ F F r a c t io n [ S q r t [ 1 7 ] - S q r t [ 1 4 ] , 2 5 ] ,5 0 0 0 ]
1 . 000 00 000 00 00 00 0 00 00 0 00 00 0 00 00 0 00 0 00 00 0 0 0 0 00 0 .. .0 0 0
А пятьдесят тысяч знаков после десятичной точки не хотите ли? Хотите. Тогда по жалуйста, только эф ф ект будет в десять раз сильнее.
N [ F F r a c t io n [ S q r t [ 1 7 ] - S q r t [1 4 ] ,2 5 ] ,5 0 0 0 0 ]
1 . 00000 000 00000 0000 000 00 000 00 000 00 000 00 00 00000 ...0 00
М ежду прочим, если это число целое, то после десятичной точки у него сплошные
нули... И все попытки просто приведут |
к исчерпанию свободной памяти. Ну бывает |
ж е, что дроби сокращ аются, а радикалы взаимно уничтожаются: |
|
yp2—y [l = 0, |
>/8 — 2>/2 = 0 и т.д. |
А здесь ведь разность степеней делится |
на разность степеней... Вот он о, коварство ав |
торов, придумывающих “подленькие” задачи! Возм ож но, нуж но лиш ь упростить вы |
ражение и убедиться, что оно равно какому-нибудь целому числу! Вот если в числите ле вычесть и добавить удачно подобранную степень основания:
J fl.9«.8 _ д* + д* _ 1 д«*И1« _ я* - 1
|
|
|
|
|
|
ат т - 1 |
|
атж-1 |
|
атж- 1 |
+ ап,ж - 1 |
|
|
|
|||||||||||
К онечно, сразу же просится к = |
121393, тогда сразу ж е выделится единица: |
|
|||||||||||||||||||||||
a |
196418 |
|
1 |
a |
196418 |
—a |
121393 |
, |
Л 121393 |
|
л |
196418 |
—a |
'2,3vJ |
a |
‘2,3v3 |
|
i |
196418 |
—a |
'2,мз |
1 |
|||
|
|
—\ |
|
|
+ |
a |
—\ a |
|
|
t |
|
—\ a |
|
|
|||||||||||
f l 12l393 _ | |
~ |
|
|
|
f l l2l39 3 |
_ |
| |
|
— |
д 121393 _ j |
^ |
^121393 |
|
_ j ~ |
f l l2l39 3 _ |
j ^ |
* |
||||||||
Осталось справиться с числом |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||
|
|
|
|
|
|
|
|
|
|
196418 — д 1213Л |
т з я |
д 196418*121393 _ |
1 ( |
|
|
|
|
|
|
||||||
|
|
|
|
|
|
|
|
|
|
атж- \ |
~ й |
а'2'ш - 1 |
|
|
|
|
|
|
|
||||||
А ведь |
|
разность |
показателей |
представляет собой |
разность |
последовательных |
чисел |
||||||||||||||||||
Ф ибоначчи, |
и |
потому |
опять |
есть |
число |
Фибоначчи! Внимательно следите за моей |
|||||||||||||||||||
мыслью? М ожет, надеетесь на дальнейш ие упрощ ения? Так вот они: |
|
|
|
||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
^196418-121393 _ |
| |
д 75025 |
_ | |
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
а'1хт- \ |
= |
а ,2,393 - Г |
|
|
|
|
|
|
|
тот же |
||||
М ож но |
(для |
удобства |
исследования) |
эту дробь обратить и |
|
применить к |
ней |
прием! И с полученной дробью м ож но поступить так же! Фактически у нас получатся элементы цепной дроби! После двух десятков (с хвостиком) шагов мы убедимся, что желанного нуля у нас так и не получится. Значит, после десятичной точки все-таки есть цифры, отличные от нуля! Ну вот, а вы говорили о коварстве авторов, придумы вающих “подленькие” задачи! Н о как же найти эти цифры? Ну, после проделанной работы у вас есть уверенность в наличии таких цифр, и потому вы знаете, что, в конце
концов, все время увеличивая точность, вы их найдете. Это важно, ибо вы тем самым
76 |
Гпава 3 |
убедились в том, что алгоритм, хотя бы теоретически, не зациклится. Но есть и более быстрый способ, ведь мы нашли целую часть и знаем, что дробная не равна нулю. Можем без каких бы то ни было опасений попытаться вычислить логарифм дробной части:
N [Log[10,FFraction[Sqrt[17]-Sqrt[14],25]],50]
N:rmeprec |
precision limit $MaxExtraPrecision |
50. |
Internal |
Log[-< < i^] |
. More- |
reached while evaluating — =-- <<->>— |
|
Log [10] |
— |
0. ж Ю " 101 |
|
Сразу не получилось... Но можно предпринять и вторую попытку.
Block[{$MaxExtraPrecision = 2500000},
N [Log[10,FFraction[Sqrt[17]-Sqrt[14],25]-l],40]] -50810.78649910263274438966441795437532248
Так, оказывается, после запятой 50810 нулей! Убедимся в этом.
N [FFraction [Sqrt [17] -Sqrt [14 ],25] ,52000]
1.000.0001634 93652933759283069270304 98442786486729522534 94 99596144517 1710302090830540954107615661095561416428720902573692470134362560380426 1251840906410760194868841156024020565176871952163928561772240318987456 0876932353742732233221453342043146147284537612475536506139437884941805 0395996079053560020301701071622059831448812970541024163535572686516051 7829591998888575225233222941634765314474671468740209602234655695585653 5995874285553291107889277189653150679397061342594886574230662624488694 5812557530477531615281173301061300851266627268774031832546178191343285 8963044957897852746759892896578102312759138070772691758000475604480515 3966711036597025752995025969545652484711742077411743012698828644580142 3624221874145471646773347191608954794057263073282475576345332113263663 318599065818643857861165308111775584557004678223880501006813296253.0148 8806184776552799723103961400947522220893813735671401794392157704550175 7387867788246896818546680413802288252648154648614894446140245739816425 5158463673227353623411602239376151676504689831305376344834176121564030 3790996593054850457645000919175207528535818445109663271017204005962146 2493170435409832252517195393736676642079501519832870957900499192299683 2815367872
Что касается нулей, то, хоть я и вычеркнул подавляющее их число, предварительно я их посчитал в Word! И их оказалось 50810! Между прочим, убедиться в том, что чис ло f a n не целое, не так-то просто.
a=Sqrt[17]-Sqrt[14]
-V I? + Vl7
gFibonaccitk+2] _ ^
F F r a c tio n [a _ , k_J :
aFibonacci[k+1] _ ^
x=FFraction[a,25]
- i+ ( - v i? . у т л 196418
-1+ (-V I? + V H )121393
Simplify[xeIntegers]
- 1 + (-V I? + Vl7 ) 196418 e Integers - 1 + ( - V I ? + V H )121393
Числа, их представление и операции над ними |
77 |
Упражнение 3.4. Пусть х = ^|40>/2 - 57| - >/40>/2+ 5 7
Сколько у этого числа нулей следует сразу после десятичной точки?
Решение. Вот самое простое реш ение. Сначала вводим определение числа.
x=Sqrt[57-40Sqrt[2]]-Sqrt[57+40Sqrt[2]]
Теперь нуж но вычислить число с такой точностью , чтобы найти хотя бы один не нулевой знак после запятой. Итак, попробуем.
N [ х , 500]
-10.000000000000000000000000000000000000000000...
Да это ж предыдущий случай! Мы уже знаем, как с этим справиться.
B lo c k [ { $ M a x E x tr a P r e c is io n = 2 5 0 0 0 0 0 } ,
N [L o g [ 1 0 , х+10 ] , 4 0 ] ]
Видите ли... Как бы вам это популярнее объяснить, пока продолжаются вычисле ния... Отличие от предыдущ его случая состоит в том, что в предыдущем случае мы убедились, что 1 действительно является целой частью исследуемого числа. В данном же случае мы лиш ь предполагаем, что число -10 является целой частью-числа х . х+10
может ведь оказаться и отрицательным, а тогда логарифм окажется комплексным. Это, впрочем, совсем не страш но, мы лишь должны будем вычислить логарифм х+11.
Вот и всего-то... Да, но что-то |
наши вычисления слиш ком затянулись... Понимаете, |
тут я долж ен сделать ещ е одно |
разъяснение. Видите ли, чтобы вычислить логарифм, |
нужно проделать некоторые вычисления, и в нашем случае с довольно высокой точ ностью. И успех эти вычисления принесут лиш ь тогда, когда будет обнаруж ено, что аргумент логарифма (число х+ 10) отличен от нуля... А в данном случае для этого недостаточно даже вычисления более чем двух с половиной миллионов знаков. Види те ли, бывает же, что дроби сокращаются, а радикалы взаимно уничтожаются. Вот в
данном случае как раз х+ 10 = 0, потому что х = - 1 0 . Д анное число целое! Давайте по пробуем убедиться в этом.
x=Sqrt[57-40Sqrt[2]]-Sqrt[57+40Sqrt[2]]
л/б7 - 40 V2 - л/57 + 40 VI
I n te g e r Q [ x ]
F a l s e
Возм ож но, вы подумали, что автор хотел обвести вас вокруг пальца! Число всетаки оказалось нецелым! П росто система M athem atica не смогла вычислить достаточ ное количество^знаков, и автор реш ил упростить себе задачу. Увы, если вы согласи лись с тем , что число н ецелое, соверш или довольно распространенную ошибку. Не потому, что оно целое, а потому, что так проверять нельзя. Предикат ln te g e r Q [x ] может принимать значение F a ls e даж е для целого аргумента. Он проверяет не само чис ло, а его внутреннее представление. Этот предикат принимает значение T rue только в том случае, если внутреннее представление числа имеет заголовок I n t e g e r . Вот как лучше проверять.
S i m p l i f y [ х е I n t e g e r s ]
х € I n t e g e r s
F u l l S i m p l i f y [ х е I n t e g e r s ]
х е I n t e g e r s
78 |
Гпава 3 |
S i m p l i f y [ x e I n t e g e r s , T r a n s f o r m a t i o n F u n c t i o n s - * > { A u t o m a t i c , R o o t R e d u c e } ]
X E I n t e g e r s
Как видите, все ответы тавтологичны. И в данном, случае вопрос так и не прояс нился... Да, система Mathematica не всегда может то, с чем справляется даже школьник:
^ W 2 - 5 7 |- V W 2 + 5 7 = y jd 3 2 -5 )1 - J ( j 3 2 - 5 ) 2 =
= (>/32 - 5) —(>/32 + 5) = -5 -5 = -10.
Теперь уж действительно ясно, что число целое. Конечно, придумать таких примеров можно великое множество. И проблема здесь не в коварстве авторов задачников, а в том, что не существует алгоритма (в классическом смысле), который для любого ве щественного числа мог бы решить вопрос о том, равно оно нулю или нет. Существует специально разработанный математиками конструктивный анализ, в котором число вой континуум состоит не из обычных вещественных чисел, а из конструктивных. Для конструктивного вещественного числа всегда разрешим вопрос о том, равно ли оно нулю. Конструктивный континуум — та основа, на которой строятся другие объекты конструктивного анализа, например функции. Однако в конструктивном анализе изу чаются не любые функции (отображения конструктивного континуума в себя), а только конструктивные. Несмотря на некоторое сходство, свойства конструктивных объектов отличаются подчас радикально.
Приближение вещественных чисел
рациональными: функция Rationalize
Что значит найти рациональное приближение вещественного числа? Какое при ближение следует считать хорошим? На эти вопросы можно отвечать по-разному.
Mathematica, например, считает, что рациональное число — лежит довольно близко к
Ч
вещественному х, если существует с, примерно равное 10 4, такое, что
Вот как можно составить список рациональных приближений числа к с точностью до
0,1; 0,01; 0,001; |
10 |
20 |
|
|
|
|
||
t=Table [ R a t i o n a l i z e [ P i , 1 0 A - i ] ,{i ,20}] |
|
|||||||
г 22 |
22 201 |
333 |
355 355 |
75948 |
||||
l 7 ' |
7 ' 64 ' 106' 113' 113' 24175 ' |
|||||||
100798 |
103993 |
312689 |
833719 |
4272943 |
32085 ' 33102 ' 99532 ' 265381 ' 1360120 ' 5419351 58466453 80143857 245850922 1725033 ' 18610450 ' 25510582 ' 78256779 '
1068966896 2549491779 6167950454 21053343141 ,
340262731 ' 811528438 ' 1963319607 ' 6701487259 J
Обратите внимание на то, насколько добросовестно система Mathematica подыски вает рациональные приближения. Хотя знаменатели рациональных чисел невелики, найденные приближения настолько хороши, что повторяются в этом списке дважды. Иными словами, они приближают л на порядок лучше, чем было первоначально “заказано” с помощью второго параметра.
Числа, их представление и операции над ними |
79 |
Позиционные системы счисления
Преобразование в десятичную систему счисления
Хорошо, конечно, что Mathematica, как мы уже видели, действительно умеет мно гое делать с числами в десятичной системе счисления. Но умеет ли она преобразовы вать числа из одной системы счисления в другую? Оказывается, да! Правда, нужно сразу оговориться, что основанием позиционной системы должно быть натуральное чис ло, притом большее 1. Так что никаких комплексных оснований и тем более фибоначчиевых или факториальных систем счисления!
Чтобы ввести число в какой-нибудь системе счисления, сначала нужно указать (в десятичном виде) основание системы счисления п (натуральное число, причем 2<л<36), затем два знака АА (крыша), а потом само представление неотрицательного вещественного (или целого) числа без знака в системе счисления с основанием п. Цифры, большие 9, изображаются латинскими буквами от а до z, причем а = 10, b = 11 и т.д., в порядке (латинского) алфавита аж до z = 36. Вот несколько примеров.
{2АА1 ,2 АА10,2АА100,2АА1000,2АА101}
{1,2,4,8,5}
16AAffffaa00
4294945280
2АА1001001010110111.11110
37559.9
Только что мы научились преобразовывать числа из недесятичной системы счис ления в десятичную. А как же выполнить обратное преобразование, т.е. преобразовать число из десятичной системы в недесятичную?
Преобразование из десятичной системы счисления в недесятичную
Чтобы преобразовать число из десятичной системы счисления в недесятичную, нужно вызвать функцию BaseForm, причем в качестве первого ее аргумента нужно указать преобразуемое число, а в качестве второго — основание системы счисления, в которую преобразуется число. В качестве основания системы счисления может быть натуральное число л, такое, что 2<л<36. Вот примеры.
BaseForm[377456783746590, 2]
10101011101001011100000011000001101100110000111102
BaseForm[377456783746590, 16]
1574b8183661ei6
BaseForm[377456783746590,60]
BaseForm: :basf : Requested base 60 should be between 2 and 36. More...
BaseForm[377456783746590, 60]
Как видите, если указать основание системы счисления, большее 36, функция “заругается” Так что шумерам и древним вавилонянам крупно не повезло бы, попы тайся они записать какое-нибудь число, например 1000000, в своей любимой шести десятеричной системе счисления. Впрочем, числа, большего 3600, шумеры долгое время не знали. Дело в том, что они не сразу осилили концепцию числа как последо вательности цифр, или списка цифр.
80 |
Гпава 3 |
Ч исло как п о с л е д о в а т е л ь н о с т ь (с п и с о к ) ц и ф р
В позиционной системе счисления число фактически представляет собой список цифр. Для получения такого списка и работы с ним в системе Mathematica преду смотрено несколько встроенных функций, наиболее важными из которых являются
IntegerDigits, DigitCount, RealDigits И FromDigits.
Представление целого числа в виде списка десятичных цифр: функция IntegerDigits
Разговаривая по телефону, иногда приходится передавать какие-нибудь длинные, например двадцатизначные, числа. В этих случаях обычно читают их цифра за циф рой. Число 587999888735555 читают, например, часто так: пять, восемь, семь, девять, девять, девять, восемь, восемь, восемь, семь, три, пять, пять, пять, пять. В про граммах тоже иногда нужно по числу определить его цифры. Если вы хотите узнать, является ли шестизначное число счастливым, вам придется сравнить сумму первых трех цифр с суммой последних трех. Поэтому не удивительно, что уже в версии 2 системы Mathematica была предусмотрена функция IntegerDigits, которая представ ляет число в виде списка цифр. Представим, например, число 25! в виде списка цифр.
IntegerDigits[25!]
{1,5,5,1,1,2,1,0,0,4,3,3,3,0,9,8,5,9,8,4,0,0,0,0,0,0}
Представление целого числа в виде списка цифр в системе счисления с произвольным основанием: функция IntegerDigits
Но, оказывается, функция IntegerDigits может использоваться также для по лучения списка цифр в системе счисления, основание которой нужно указать вторым параметром. Основание в таком случае может быть любым натуральным числом, большим единицы. Представим, например, число 60! (я полагаю, оно бы очень понра вилось шумерам, если бы они его знали) в их любимой шестидесятеричной системе.
IntegerDigits[60!, 60]
{1,20, 3, 4,4 8,2 9, 10, 11,46, 47,21,26, 45, 46, 9,29, 47,16, 37,50, 59, 58,0, 33, 59, 19,31,10, 42,35, 8, 9,36, 0,0,0,0, 0,0, 0, 0,0, 0, 0,0,0, 0}
Иногда нужно представить число в системе счисления не только с заданным основа нием, но и с заданным количеством цифр, т.е. дополнить его ведущими нулями в таком количестве, чтобы количество цифр равнялось заданному. Тогда количество цифр в числе нужно задать в качестве третьего параметра функции IntegerDigits.
Вот как число 56 представляется в виде байта.
IntegerDigits[56,2,8]
{0,0,1,1,1,0,0,0}
А вот как число 25! записывается в 32-разрядных машинах.
IntegerDigits[25!,2,32]
{ 0 , 1 , 1 , 1 , 1 , 0 , 1 , 1 , 1 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }
Представление целого числа в виде списка цифр в нега-двоичной системе счисления
Если снование системы счисления Ь является отрицательным целым числом, меньшим -1, то такую систему называют нега-позиционной. Например, если b = —2, то такая система называется нега-двоичной, а если b = —4 — нега-четверичной, если ^ = “ Ю — нега-десятичной. Основным преимуществом этих систем является отсутствие знака перед отрицательными числами и, следовательно, отсутствие правил знаков. Дело в
Числа, их представление и операции над ними |
81 |
том, что всякое число любой из нега-позиционных систем с четным числом цифр отрица тельно, а число, отличное от 0, с нечетным числом цифр — положительно. Особый интерес для конструкторов вычислительных машин представляет, конечно, нега-двоичная сис тема. Однако если задать отрицательное основание (-2) в качестве второго параметра, функция integerDigits “заругается”.
IntegerDigits[10!, -2 ]
IntegerDigitsibase : Base - 2 is not an integer greater than 1. More.,,
IntegerDigits[3628800,-2]
Однако функция IntegerDigits позволяет определить функцию, которая сможет представить число в нега-двоичной системе.
ToNegabinary[i_] := Module[{t = у (4F1°or[Logt4,Abs[i]+i]+2] _i)},
IntegerDigits[BitXor[i + t , t] , 2]]
ToNegabinary[2ЛЛ10111]
{1,1,0,1,0,1,1}
ToNegabinary[20!]
{ 1 , 1 , 0 , 0 , 1 , 1 , 0 , 1 , 1 , 0 , 0 , 0 , 1 , 0 , 0 , 1 , 0 , 1 , 1 , 1 , 0 , 0 , 0,1, 0, 0, 0 , 1, 1, 0, 1, 1, 0, 0, 0 , 0 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 0 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }
И уж совсем просто определить функцию, которая по представлению числа в нега' двоичной системе находит его представление в десятичной системе:
Length[list]
FromNegabinary [list_] := |
^ |
list[[-n]] (-2)n_1 |
Пг 1
Вот пример (фактически мини-тест) применения обеих функций.
nb=ToNegabinary [151]
{ 1 , 0 , 1 , 1 , 1 , 0 , 0 , 0 , 1 , ! , 0 , 0 , 0 , 1 / 0 , 0 , 0 , 1 / 0 , 0 , 0 , 1 , 0 , 0 , 0 , 1 , 0 , 1 , 0 , 1 , 0 , 0 , 0 , 0 , 0 ,0, 0, 0, 0, 0, 0}
m=FromNegabinary[nb]
1307674368000 m-15!
0
Представление вещественного числа
в виде списка десятичных цифр: функция RealDigits
Функция RealDigits позволяет представить вещественное число в виде списка цифр. В этом она похожа на функцию IntegerDigits для целых чисел. Однако, t отличие от функции IntegerDigits, функция RealDigits выдает список, состоя щий из двух элементов: списка цифр и количества цифр до десятичной точки.
RealDigits[123.4567890123456]
{ { 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 0 , 1 , 2, 3,4,5,6},3} n=N[BernoulliB[32] ,20]
-1.5116315767092156863xlO10 RealDigits[n]
{{1,5,1,1,6, 3,1,5, 7, 6, 7,0,9,2,1,5,6,8,6,3},11}
82 |
Глава i |