123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899490049014902490349044905490649074908490949104911491249134914491549164917491849194920492149224923492449254926492749284929493049314932493349344935493649374938493949404941494249434944494549464947494849494950495149524953495449554956495749584959496049614962496349644965496649674968496949704971497249734974497549764977497849794980498149824983498449854986498749884989499049914992499349944995499649974998499950005001500250035004500550065007500850095010501150125013501450155016501750185019502050215022502350245025502650275028502950305031503250335034503550365037503850395040504150425043504450455046504750485049505050515052505350545055505650575058505950605061506250635064506550665067506850695070507150725073507450755076507750785079508050815082508350845085508650875088508950905091509250935094509550965097509850995100510151025103510451055106510751085109511051115112511351145115511651175118511951205121512251235124512551265127512851295130513151325133513451355136513751385139514051415142514351445145514651475148514951505151515251535154515551565157515851595160516151625163516451655166516751685169517051715172517351745175517651775178517951805181518251835184518551865187518851895190519151925193519451955196519751985199520052015202520352045205520652075208520952105211521252135214521552165217521852195220522152225223522452255226522752285229523052315232523352345235523652375238523952405241524252435244524552465247524852495250525152525253525452555256525752585259526052615262526352645265526652675268526952705271527252735274527552765277527852795280528152825283528452855286528752885289529052915292529352945295529652975298529953005301530253035304530553065307530853095310531153125313531453155316531753185319532053215322532353245325532653275328532953305331533253335334533553365337533853395340534153425343534453455346534753485349535053515352535353545355535653575358535953605361536253635364536553665367536853695370537153725373537453755376537753785379538053815382538353845385538653875388538953905391539253935394539553965397539853995400540154025403540454055406540754085409541054115412541354145415541654175418541954205421542254235424542554265427542854295430543154325433543454355436543754385439544054415442544354445445544654475448544954505451545254535454545554565457545854595460546154625463546454655466546754685469547054715472547354745475547654775478547954805481548254835484548554865487548854895490549154925493549454955496549754985499550055015502550355045505550655075508550955105511551255135514551555165517551855195520552155225523552455255526552755285529553055315532553355345535553655375538553955405541554255435544554555465547554855495550555155525553555455555556555755585559556055615562556355645565556655675568556955705571557255735574557555765577557855795580558155825583558455855586558755885589559055915592559355945595559655975598559956005601560256035604560556065607560856095610561156125613561456155616561756185619562056215622562356245625562656275628562956305631563256335634563556365637563856395640564156425643564456455646564756485649565056515652565356545655565656575658565956605661566256635664566556665667566856695670567156725673567456755676567756785679568056815682568356845685568656875688568956905691569256935694569556965697569856995700570157025703570457055706570757085709571057115712571357145715571657175718571957205721572257235724572557265727572857295730573157325733573457355736573757385739574057415742574357445745574657475748574957505751575257535754575557565757575857595760576157625763576457655766576757685769577057715772577357745775577657775778577957805781578257835784578557865787578857895790579157925793579457955796579757985799580058015802580358045805580658075808580958105811581258135814581558165817581858195820582158225823582458255826582758285829583058315832583358345835583658375838583958405841584258435844584558465847584858495850585158525853585458555856585758585859586058615862586358645865586658675868586958705871587258735874587558765877587858795880588158825883588458855886588758885889589058915892589358945895589658975898589959005901590259035904590559065907590859095910591159125913591459155916591759185919592059215922592359245925592659275928592959305931593259335934593559365937593859395940594159425943594459455946594759485949595059515952595359545955595659575958595959605961596259635964596559665967596859695970597159725973597459755976597759785979598059815982598359845985598659875988598959905991599259935994599559965997599859996000600160026003600460056006600760086009601060116012601360146015601660176018601960206021602260236024602560266027602860296030603160326033603460356036603760386039604060416042604360446045604660476048604960506051605260536054605560566057605860596060606160626063606460656066606760686069607060716072607360746075607660776078607960806081608260836084608560866087608860896090609160926093609460956096609760986099610061016102610361046105610661076108610961106111611261136114611561166117611861196120612161226123612461256126612761286129613061316132613361346135613661376138613961406141614261436144614561466147614861496150615161526153615461556156615761586159616061616162616361646165616661676168616961706171617261736174617561766177617861796180618161826183618461856186618761886189619061916192619361946195619661976198619962006201620262036204620562066207620862096210621162126213621462156216621762186219622062216222622362246225622662276228622962306231623262336234623562366237623862396240624162426243624462456246624762486249625062516252625362546255625662576258625962606261626262636264626562666267626862696270627162726273627462756276627762786279628062816282628362846285628662876288628962906291629262936294629562966297629862996300630163026303630463056306630763086309631063116312631363146315631663176318631963206321632263236324632563266327632863296330633163326333633463356336633763386339634063416342634363446345634663476348634963506351635263536354635563566357635863596360636163626363636463656366636763686369637063716372637363746375637663776378637963806381638263836384638563866387638863896390639163926393639463956396639763986399640064016402640364046405640664076408640964106411641264136414641564166417641864196420642164226423642464256426642764286429643064316432643364346435643664376438643964406441644264436444644564466447644864496450645164526453645464556456645764586459646064616462646364646465646664676468646964706471647264736474647564766477647864796480648164826483648464856486648764886489649064916492649364946495649664976498649965006501650265036504650565066507650865096510651165126513651465156516651765186519652065216522652365246525652665276528652965306531653265336534653565366537653865396540654165426543654465456546654765486549655065516552655365546555655665576558655965606561656265636564656565666567656865696570657165726573657465756576657765786579658065816582658365846585658665876588658965906591659265936594659565966597659865996600660166026603660466056606660766086609661066116612661366146615661666176618661966206621662266236624662566266627662866296630663166326633663466356636663766386639664066416642664366446645664666476648664966506651665266536654665566566657665866596660666166626663666466656666666766686669667066716672667366746675667666776678667966806681668266836684668566866687668866896690669166926693669466956696669766986699670067016702670367046705670667076708670967106711671267136714671567166717671867196720672167226723672467256726672767286729673067316732673367346735673667376738673967406741674267436744674567466747674867496750675167526753675467556756675767586759676067616762676367646765676667676768676967706771677267736774677567766777677867796780678167826783678467856786678767886789679067916792679367946795679667976798679968006801680268036804680568066807680868096810681168126813681468156816681768186819682068216822682368246825682668276828682968306831683268336834683568366837683868396840684168426843684468456846684768486849685068516852685368546855685668576858685968606861686268636864686568666867686868696870687168726873687468756876687768786879688068816882688368846885688668876888688968906891689268936894689568966897689868996900690169026903690469056906690769086909691069116912691369146915691669176918691969206921692269236924692569266927692869296930693169326933693469356936693769386939694069416942694369446945694669476948694969506951695269536954695569566957695869596960696169626963696469656966696769686969697069716972697369746975697669776978697969806981698269836984698569866987698869896990699169926993699469956996699769986999700070017002700370047005700670077008700970107011701270137014701570167017701870197020702170227023702470257026702770287029703070317032703370347035703670377038703970407041704270437044704570467047704870497050705170527053705470557056705770587059706070617062706370647065706670677068706970707071707270737074707570767077707870797080708170827083708470857086708770887089709070917092709370947095709670977098709971007101710271037104710571067107710871097110711171127113711471157116711771187119712071217122712371247125712671277128712971307131713271337134713571367137713871397140714171427143714471457146714771487149715071517152715371547155715671577158715971607161716271637164716571667167716871697170717171727173717471757176717771787179718071817182718371847185718671877188718971907191719271937194719571967197719871997200720172027203720472057206720772087209721072117212721372147215721672177218721972207221722272237224722572267227722872297230723172327233723472357236723772387239724072417242724372447245724672477248724972507251725272537254725572567257725872597260726172627263726472657266726772687269727072717272727372747275727672777278727972807281728272837284728572867287728872897290729172927293729472957296729772987299730073017302730373047305730673077308730973107311731273137314731573167317731873197320732173227323732473257326732773287329733073317332733373347335733673377338733973407341734273437344734573467347734873497350735173527353735473557356735773587359736073617362736373647365736673677368736973707371737273737374737573767377737873797380738173827383738473857386738773887389739073917392739373947395739673977398739974007401740274037404740574067407740874097410741174127413741474157416741774187419742074217422742374247425742674277428742974307431743274337434743574367437743874397440744174427443744474457446744774487449745074517452745374547455745674577458745974607461746274637464746574667467746874697470747174727473747474757476747774787479748074817482748374847485748674877488748974907491749274937494749574967497749874997500750175027503750475057506750775087509751075117512751375147515751675177518751975207521752275237524752575267527752875297530753175327533753475357536753775387539754075417542754375447545754675477548754975507551755275537554755575567557755875597560756175627563756475657566756775687569757075717572757375747575757675777578757975807581758275837584758575867587758875897590759175927593759475957596759775987599760076017602760376047605760676077608760976107611761276137614761576167617761876197620762176227623762476257626762776287629763076317632763376347635763676377638763976407641764276437644764576467647764876497650765176527653765476557656765776587659766076617662766376647665766676677668766976707671767276737674767576767677767876797680768176827683768476857686768776887689769076917692769376947695769676977698769977007701770277037704770577067707770877097710771177127713771477157716771777187719772077217722772377247725772677277728772977307731773277337734773577367737773877397740774177427743774477457746774777487749775077517752775377547755775677577758775977607761776277637764776577667767776877697770777177727773777477757776777777787779778077817782778377847785778677877788778977907791779277937794779577967797779877997800780178027803780478057806780778087809781078117812781378147815781678177818781978207821782278237824782578267827782878297830783178327833783478357836783778387839784078417842784378447845784678477848784978507851785278537854785578567857785878597860786178627863786478657866786778687869787078717872787378747875787678777878787978807881788278837884788578867887788878897890789178927893789478957896789778987899790079017902790379047905790679077908790979107911791279137914791579167917791879197920792179227923792479257926792779287929793079317932793379347935793679377938793979407941794279437944794579467947794879497950795179527953795479557956795779587959796079617962796379647965796679677968796979707971797279737974797579767977797879797980798179827983798479857986798779887989799079917992799379947995799679977998799980008001800280038004800580068007800880098010801180128013801480158016801780188019802080218022802380248025802680278028802980308031803280338034803580368037803880398040804180428043804480458046804780488049805080518052805380548055805680578058805980608061806280638064806580668067806880698070807180728073807480758076807780788079808080818082808380848085808680878088808980908091809280938094809580968097809880998100810181028103810481058106810781088109811081118112811381148115811681178118811981208121812281238124812581268127812881298130813181328133813481358136813781388139814081418142814381448145814681478148814981508151815281538154815581568157815881598160816181628163816481658166816781688169817081718172817381748175817681778178817981808181818281838184818581868187818881898190819181928193819481958196819781988199820082018202820382048205820682078208820982108211821282138214821582168217821882198220822182228223822482258226822782288229823082318232823382348235823682378238823982408241824282438244824582468247824882498250825182528253825482558256825782588259826082618262826382648265826682678268826982708271827282738274827582768277827882798280828182828283828482858286828782888289829082918292829382948295829682978298829983008301830283038304830583068307830883098310831183128313831483158316831783188319832083218322832383248325832683278328832983308331833283338334833583368337833883398340834183428343834483458346834783488349835083518352835383548355835683578358835983608361836283638364836583668367836883698370837183728373837483758376837783788379838083818382838383848385838683878388838983908391839283938394839583968397839883998400840184028403840484058406840784088409841084118412841384148415841684178418841984208421842284238424842584268427842884298430843184328433843484358436843784388439844084418442844384448445844684478448844984508451845284538454845584568457845884598460846184628463846484658466846784688469847084718472847384748475847684778478847984808481848284838484848584868487848884898490849184928493849484958496849784988499850085018502850385048505850685078508850985108511851285138514851585168517851885198520852185228523852485258526852785288529853085318532853385348535853685378538853985408541854285438544854585468547854885498550855185528553855485558556855785588559856085618562856385648565856685678568856985708571857285738574857585768577857885798580858185828583858485858586858785888589859085918592859385948595859685978598859986008601860286038604860586068607860886098610861186128613861486158616861786188619862086218622862386248625862686278628862986308631863286338634863586368637863886398640864186428643864486458646864786488649865086518652865386548655865686578658865986608661866286638664866586668667866886698670867186728673867486758676867786788679868086818682868386848685868686878688868986908691869286938694869586968697869886998700870187028703870487058706870787088709871087118712871387148715871687178718871987208721872287238724872587268727872887298730873187328733873487358736873787388739874087418742874387448745874687478748874987508751875287538754875587568757875887598760876187628763876487658766876787688769877087718772877387748775877687778778877987808781878287838784878587868787878887898790879187928793879487958796879787988799880088018802880388048805880688078808880988108811881288138814881588168817881888198820882188228823882488258826882788288829883088318832883388348835883688378838883988408841884288438844884588468847884888498850885188528853885488558856885788588859886088618862886388648865886688678868886988708871887288738874887588768877887888798880888188828883888488858886888788888889889088918892889388948895889688978898889989008901890289038904890589068907890889098910891189128913891489158916891789188919892089218922892389248925892689278928892989308931893289338934893589368937893889398940894189428943894489458946894789488949895089518952895389548955895689578958895989608961896289638964896589668967896889698970897189728973897489758976897789788979898089818982898389848985898689878988898989908991899289938994899589968997899889999000900190029003900490059006900790089009901090119012901390149015901690179018901990209021902290239024902590269027902890299030903190329033903490359036903790389039904090419042904390449045904690479048904990509051905290539054905590569057905890599060906190629063906490659066906790689069907090719072907390749075907690779078907990809081908290839084908590869087908890899090909190929093909490959096909790989099910091019102910391049105910691079108910991109111911291139114911591169117911891199120912191229123912491259126912791289129913091319132913391349135913691379138913991409141914291439144914591469147914891499150915191529153915491559156915791589159916091619162916391649165916691679168916991709171917291739174917591769177917891799180918191829183918491859186918791889189919091919192919391949195919691979198919992009201920292039204920592069207920892099210921192129213921492159216921792189219922092219222922392249225922692279228922992309231923292339234923592369237923892399240924192429243924492459246924792489249925092519252925392549255925692579258925992609261926292639264926592669267926892699270927192729273927492759276927792789279928092819282928392849285928692879288928992909291929292939294929592969297929892999300930193029303930493059306930793089309931093119312931393149315931693179318931993209321932293239324932593269327932893299330933193329333933493359336933793389339934093419342934393449345934693479348934993509351935293539354935593569357935893599360936193629363936493659366936793689369937093719372937393749375937693779378937993809381938293839384938593869387938893899390939193929393939493959396939793989399940094019402940394049405940694079408940994109411941294139414941594169417941894199420942194229423942494259426942794289429943094319432943394349435943694379438943994409441944294439444944594469447944894499450945194529453945494559456945794589459946094619462946394649465946694679468946994709471947294739474947594769477947894799480948194829483948494859486948794889489949094919492949394949495949694979498949995009501950295039504950595069507950895099510951195129513951495159516951795189519952095219522952395249525952695279528952995309531953295339534953595369537953895399540954195429543954495459546954795489549955095519552955395549555955695579558955995609561956295639564956595669567956895699570957195729573957495759576957795789579958095819582958395849585958695879588958995909591959295939594959595969597959895999600960196029603960496059606960796089609961096119612961396149615961696179618961996209621962296239624962596269627962896299630963196329633963496359636963796389639964096419642964396449645964696479648964996509651965296539654965596569657965896599660966196629663966496659666966796689669967096719672967396749675967696779678967996809681968296839684968596869687968896899690969196929693969496959696969796989699970097019702970397049705970697079708970997109711971297139714971597169717971897199720972197229723972497259726972797289729973097319732973397349735973697379738973997409741974297439744974597469747974897499750975197529753975497559756975797589759976097619762976397649765976697679768976997709771977297739774977597769777977897799780978197829783978497859786978797889789979097919792979397949795979697979798979998009801980298039804980598069807980898099810981198129813981498159816981798189819982098219822982398249825982698279828982998309831983298339834983598369837983898399840984198429843984498459846984798489849985098519852985398549855985698579858985998609861986298639864986598669867986898699870987198729873987498759876987798789879988098819882988398849885988698879888988998909891989298939894989598969897989898999900990199029903990499059906990799089909991099119912991399149915991699179918991999209921992299239924992599269927992899299930993199329933993499359936993799389939994099419942994399449945994699479948994999509951995299539954995599569957995899599960996199629963996499659966996799689969997099719972997399749975997699779978997999809981998299839984998599869987998899899990999199929993999499959996999799989999100001000110002100031000410005100061000710008100091001010011100121001310014100151001610017100181001910020100211002210023100241002510026100271002810029100301003110032100331003410035100361003710038100391004010041100421004310044100451004610047100481004910050100511005210053100541005510056100571005810059100601006110062100631006410065100661006710068100691007010071100721007310074100751007610077100781007910080100811008210083100841008510086100871008810089100901009110092100931009410095100961009710098100991010010101101021010310104101051010610107101081010910110101111011210113101141011510116101171011810119101201012110122101231012410125101261012710128101291013010131101321013310134101351013610137101381013910140101411014210143101441014510146101471014810149101501015110152101531015410155101561015710158101591016010161101621016310164101651016610167101681016910170101711017210173101741017510176101771017810179101801018110182101831018410185101861018710188101891019010191101921019310194101951019610197101981019910200102011020210203102041020510206102071020810209102101021110212102131021410215102161021710218102191022010221102221022310224102251022610227102281022910230102311023210233102341023510236102371023810239102401024110242102431024410245102461024710248102491025010251102521025310254102551025610257102581025910260102611026210263102641026510266102671026810269102701027110272102731027410275102761027710278102791028010281102821028310284102851028610287102881028910290102911029210293102941029510296102971029810299103001030110302103031030410305103061030710308103091031010311103121031310314103151031610317103181031910320103211032210323103241032510326103271032810329103301033110332103331033410335103361033710338103391034010341103421034310344103451034610347103481034910350103511035210353103541035510356103571035810359103601036110362103631036410365103661036710368103691037010371103721037310374103751037610377103781037910380103811038210383103841038510386103871038810389103901039110392103931039410395103961039710398103991040010401104021040310404104051040610407104081040910410104111041210413104141041510416104171041810419104201042110422104231042410425104261042710428104291043010431104321043310434104351043610437104381043910440104411044210443104441044510446104471044810449104501045110452104531045410455104561045710458104591046010461104621046310464104651046610467104681046910470104711047210473104741047510476104771047810479104801048110482104831048410485104861048710488104891049010491104921049310494104951049610497104981049910500105011050210503105041050510506105071050810509105101051110512105131051410515105161051710518105191052010521105221052310524105251052610527105281052910530105311053210533105341053510536105371053810539105401054110542105431054410545105461054710548105491055010551105521055310554105551055610557105581055910560105611056210563105641056510566105671056810569105701057110572105731057410575105761057710578105791058010581105821058310584105851058610587105881058910590105911059210593105941059510596105971059810599106001060110602106031060410605106061060710608106091061010611106121061310614106151061610617106181061910620106211062210623106241062510626106271062810629106301063110632106331063410635106361063710638106391064010641106421064310644106451064610647106481064910650106511065210653106541065510656106571065810659106601066110662106631066410665106661066710668106691067010671106721067310674106751067610677106781067910680106811068210683106841068510686106871068810689106901069110692106931069410695106961069710698106991070010701107021070310704107051070610707107081070910710107111071210713107141071510716107171071810719107201072110722107231072410725107261072710728107291073010731107321073310734107351073610737107381073910740107411074210743107441074510746107471074810749107501075110752107531075410755107561075710758107591076010761107621076310764107651076610767107681076910770107711077210773107741077510776107771077810779107801078110782107831078410785107861078710788107891079010791107921079310794107951079610797107981079910800108011080210803108041080510806108071080810809108101081110812108131081410815108161081710818108191082010821108221082310824108251082610827108281082910830108311083210833108341083510836108371083810839108401084110842108431084410845108461084710848108491085010851108521085310854108551085610857108581085910860108611086210863108641086510866108671086810869108701087110872108731087410875108761087710878108791088010881108821088310884108851088610887108881088910890108911089210893108941089510896108971089810899109001090110902109031090410905109061090710908109091091010911109121091310914109151091610917109181091910920109211092210923109241092510926109271092810929109301093110932109331093410935109361093710938109391094010941109421094310944109451094610947109481094910950109511095210953109541095510956109571095810959109601096110962109631096410965109661096710968109691097010971109721097310974109751097610977109781097910980109811098210983109841098510986109871098810989109901099110992109931099410995109961099710998109991100011001110021100311004110051100611007110081100911010110111101211013110141101511016110171101811019110201102111022110231102411025110261102711028110291103011031110321103311034110351103611037110381103911040110411104211043110441104511046110471104811049110501105111052110531105411055110561105711058110591106011061110621106311064110651106611067110681106911070110711107211073110741107511076110771107811079110801108111082110831108411085110861108711088110891109011091110921109311094110951109611097110981109911100111011110211103111041110511106111071110811109111101111111112111131111411115111161111711118111191112011121111221112311124111251112611127111281112911130111311113211133111341113511136111371113811139111401114111142111431114411145111461114711148111491115011151111521115311154111551115611157111581115911160111611116211163111641116511166111671116811169111701117111172111731117411175111761117711178111791118011181111821118311184111851118611187111881118911190111911119211193111941119511196111971119811199112001120111202112031120411205112061120711208112091121011211112121121311214112151121611217112181121911220112211122211223112241122511226112271122811229112301123111232112331123411235112361123711238112391124011241112421124311244112451124611247112481124911250112511125211253112541125511256112571125811259112601126111262112631126411265112661126711268112691127011271112721127311274112751127611277112781127911280112811128211283112841128511286112871128811289112901129111292112931129411295112961129711298112991130011301113021130311304113051130611307113081130911310113111131211313113141131511316113171131811319113201132111322113231132411325113261132711328113291133011331113321133311334113351133611337113381133911340113411134211343113441134511346113471134811349113501135111352113531135411355113561135711358113591136011361113621136311364113651136611367113681136911370113711137211373113741137511376113771137811379113801138111382113831138411385113861138711388113891139011391113921139311394113951139611397113981139911400114011140211403114041140511406114071140811409114101141111412114131141411415114161141711418114191142011421114221142311424114251142611427114281142911430114311143211433114341143511436114371143811439114401144111442114431144411445114461144711448114491145011451114521145311454114551145611457114581145911460114611146211463114641146511466114671146811469114701147111472114731147411475114761147711478114791148011481114821148311484114851148611487114881148911490114911149211493114941149511496114971149811499115001150111502115031150411505115061150711508115091151011511115121151311514115151151611517115181151911520115211152211523115241152511526115271152811529115301153111532115331153411535115361153711538115391154011541115421154311544115451154611547115481154911550115511155211553115541155511556115571155811559115601156111562115631156411565115661156711568115691157011571115721157311574115751157611577115781157911580115811158211583115841158511586115871158811589115901159111592115931159411595115961159711598115991160011601116021160311604116051160611607116081160911610116111161211613116141161511616116171161811619116201162111622116231162411625116261162711628116291163011631116321163311634116351163611637116381163911640116411164211643116441164511646116471164811649116501165111652116531165411655116561165711658116591166011661116621166311664116651166611667116681166911670116711167211673116741167511676116771167811679116801168111682116831168411685116861168711688116891169011691116921169311694116951169611697116981169911700117011170211703117041170511706117071170811709117101171111712117131171411715117161171711718117191172011721117221172311724117251172611727117281172911730117311173211733117341173511736117371173811739117401174111742117431174411745117461174711748117491175011751117521175311754117551175611757117581175911760117611176211763117641176511766117671176811769117701177111772117731177411775117761177711778117791178011781117821178311784117851178611787117881178911790117911179211793117941179511796117971179811799118001180111802118031180411805118061180711808118091181011811118121181311814118151181611817118181181911820118211182211823118241182511826118271182811829118301183111832118331183411835118361183711838118391184011841118421184311844118451184611847118481184911850118511185211853118541185511856118571185811859118601186111862118631186411865118661186711868118691187011871118721187311874118751187611877118781187911880118811188211883118841188511886118871188811889118901189111892118931189411895118961189711898118991190011901119021190311904119051190611907119081190911910119111191211913119141191511916119171191811919119201192111922119231192411925119261192711928119291193011931119321193311934119351193611937119381193911940119411194211943119441194511946119471194811949119501195111952119531195411955119561195711958119591196011961119621196311964119651196611967119681196911970119711197211973119741197511976119771197811979119801198111982119831198411985119861198711988119891199011991119921199311994119951199611997119981199912000120011200212003120041200512006120071200812009120101201112012120131201412015120161201712018120191202012021120221202312024120251202612027120281202912030120311203212033120341203512036120371203812039120401204112042120431204412045120461204712048120491205012051120521205312054120551205612057120581205912060120611206212063120641206512066120671206812069120701207112072120731207412075120761207712078120791208012081120821208312084120851208612087120881208912090120911209212093120941209512096120971209812099121001210112102121031210412105121061210712108121091211012111121121211312114121151211612117121181211912120121211212212123121241212512126121271212812129121301213112132121331213412135121361213712138121391214012141121421214312144121451214612147121481214912150121511215212153121541215512156121571215812159121601216112162121631216412165121661216712168121691217012171121721217312174121751217612177121781217912180121811218212183121841218512186121871218812189121901219112192121931219412195121961219712198121991220012201122021220312204122051220612207122081220912210122111221212213122141221512216122171221812219122201222112222122231222412225122261222712228122291223012231122321223312234122351223612237122381223912240122411224212243122441224512246122471224812249122501225112252122531225412255122561225712258122591226012261122621226312264122651226612267122681226912270122711227212273122741227512276122771227812279122801228112282122831228412285122861228712288122891229012291122921229312294122951229612297122981229912300123011230212303123041230512306123071230812309123101231112312123131231412315123161231712318123191232012321123221232312324123251232612327123281232912330123311233212333123341233512336123371233812339123401234112342123431234412345123461234712348123491235012351123521235312354123551235612357123581235912360123611236212363123641236512366123671236812369123701237112372123731237412375123761237712378123791238012381123821238312384123851238612387123881238912390123911239212393123941239512396123971239812399124001240112402124031240412405124061240712408124091241012411124121241312414124151241612417124181241912420124211242212423124241242512426124271242812429124301243112432124331243412435124361243712438124391244012441124421244312444124451244612447124481244912450124511245212453124541245512456124571245812459124601246112462124631246412465124661246712468124691247012471124721247312474124751247612477124781247912480124811248212483124841248512486124871248812489124901249112492124931249412495124961249712498124991250012501125021250312504125051250612507125081250912510125111251212513125141251512516125171251812519125201252112522125231252412525125261252712528125291253012531125321253312534125351253612537125381253912540125411254212543125441254512546125471254812549125501255112552125531255412555125561255712558125591256012561125621256312564125651256612567125681256912570125711257212573125741257512576125771257812579125801258112582125831258412585125861258712588125891259012591125921259312594125951259612597125981259912600126011260212603126041260512606126071260812609126101261112612126131261412615126161261712618126191262012621126221262312624126251262612627126281262912630126311263212633126341263512636126371263812639126401264112642126431264412645126461264712648126491265012651126521265312654126551265612657126581265912660126611266212663126641266512666126671266812669126701267112672126731267412675126761267712678126791268012681126821268312684126851268612687126881268912690126911269212693126941269512696126971269812699127001270112702127031270412705127061270712708127091271012711127121271312714127151271612717127181271912720127211272212723127241272512726127271272812729127301273112732127331273412735127361273712738127391274012741127421274312744127451274612747127481274912750127511275212753127541275512756127571275812759127601276112762127631276412765127661276712768127691277012771127721277312774127751277612777127781277912780127811278212783127841278512786127871278812789127901279112792127931279412795127961279712798127991280012801128021280312804128051280612807128081280912810128111281212813128141281512816128171281812819128201282112822128231282412825128261282712828128291283012831128321283312834128351283612837128381283912840128411284212843128441284512846128471284812849128501285112852128531285412855128561285712858128591286012861128621286312864128651286612867128681286912870128711287212873128741287512876128771287812879128801288112882128831288412885128861288712888128891289012891128921289312894128951289612897128981289912900129011290212903129041290512906129071290812909129101291112912129131291412915129161291712918129191292012921129221292312924129251292612927129281292912930129311293212933129341293512936129371293812939129401294112942129431294412945129461294712948129491295012951129521295312954129551295612957129581295912960129611296212963129641296512966129671296812969129701297112972129731297412975129761297712978129791298012981129821298312984129851298612987129881298912990129911299212993129941299512996129971299812999130001300113002130031300413005130061300713008130091301013011130121301313014130151301613017130181301913020130211302213023130241302513026130271302813029130301303113032130331303413035130361303713038130391304013041130421304313044130451304613047130481304913050130511305213053130541305513056130571305813059130601306113062130631306413065130661306713068130691307013071130721307313074130751307613077130781307913080130811308213083130841308513086130871308813089130901309113092130931309413095130961309713098130991310013101131021310313104131051310613107131081310913110131111311213113131141311513116131171311813119131201312113122131231312413125131261312713128131291313013131131321313313134131351313613137131381313913140131411314213143131441314513146131471314813149131501315113152131531315413155131561315713158131591316013161131621316313164131651316613167131681316913170131711317213173131741317513176131771317813179131801318113182131831318413185131861318713188131891319013191131921319313194131951319613197131981319913200132011320213203132041320513206132071320813209132101321113212132131321413215132161321713218132191322013221132221322313224132251322613227132281322913230132311323213233132341323513236132371323813239132401324113242132431324413245132461324713248132491325013251132521325313254132551325613257132581325913260132611326213263132641326513266132671326813269132701327113272132731327413275132761327713278132791328013281132821328313284132851328613287132881328913290132911329213293132941329513296132971329813299133001330113302133031330413305133061330713308133091331013311133121331313314133151331613317133181331913320133211332213323133241332513326133271332813329133301333113332133331333413335133361333713338133391334013341133421334313344133451334613347133481334913350133511335213353133541335513356133571335813359133601336113362133631336413365133661336713368133691337013371133721337313374133751337613377133781337913380133811338213383133841338513386133871338813389133901339113392133931339413395133961339713398133991340013401134021340313404134051340613407134081340913410134111341213413134141341513416134171341813419134201342113422134231342413425134261342713428134291343013431134321343313434134351343613437134381343913440134411344213443134441344513446134471344813449134501345113452134531345413455134561345713458134591346013461134621346313464134651346613467134681346913470134711347213473134741347513476134771347813479134801348113482134831348413485134861348713488134891349013491134921349313494134951349613497134981349913500135011350213503135041350513506135071350813509135101351113512135131351413515135161351713518135191352013521135221352313524135251352613527135281352913530135311353213533135341353513536135371353813539135401354113542135431354413545135461354713548135491355013551135521355313554135551355613557135581355913560135611356213563135641356513566135671356813569135701357113572135731357413575135761357713578135791358013581135821358313584135851358613587135881358913590135911359213593135941359513596135971359813599136001360113602136031360413605136061360713608136091361013611136121361313614136151361613617136181361913620136211362213623136241362513626136271362813629136301363113632136331363413635136361363713638136391364013641136421364313644136451364613647136481364913650136511365213653136541365513656136571365813659136601366113662136631366413665136661366713668136691367013671136721367313674136751367613677136781367913680136811368213683136841368513686136871368813689136901369113692136931369413695136961369713698136991370013701137021370313704137051370613707137081370913710137111371213713137141371513716137171371813719137201372113722137231372413725137261372713728137291373013731137321373313734137351373613737137381373913740137411374213743137441374513746137471374813749137501375113752137531375413755137561375713758137591376013761137621376313764137651376613767137681376913770137711377213773137741377513776137771377813779137801378113782137831378413785137861378713788137891379013791137921379313794137951379613797137981379913800138011380213803138041380513806138071380813809138101381113812138131381413815138161381713818138191382013821138221382313824138251382613827138281382913830138311383213833138341383513836138371383813839138401384113842138431384413845138461384713848138491385013851138521385313854138551385613857138581385913860138611386213863138641386513866138671386813869138701387113872138731387413875138761387713878138791388013881138821388313884138851388613887138881388913890138911389213893138941389513896138971389813899139001390113902139031390413905139061390713908139091391013911139121391313914139151391613917139181391913920139211392213923139241392513926139271392813929139301393113932139331393413935139361393713938139391394013941139421394313944139451394613947139481394913950139511395213953139541395513956139571395813959139601396113962139631396413965139661396713968139691397013971139721397313974139751397613977139781397913980139811398213983139841398513986139871398813989139901399113992139931399413995139961399713998139991400014001140021400314004140051400614007140081400914010140111401214013140141401514016140171401814019140201402114022140231402414025140261402714028140291403014031140321403314034140351403614037140381403914040140411404214043140441404514046140471404814049140501405114052140531405414055140561405714058140591406014061140621406314064140651406614067140681406914070140711407214073140741407514076140771407814079140801408114082140831408414085140861408714088140891409014091140921409314094140951409614097140981409914100141011410214103141041410514106141071410814109141101411114112141131411414115141161411714118141191412014121141221412314124141251412614127141281412914130141311413214133141341413514136141371413814139141401414114142141431414414145141461414714148141491415014151141521415314154141551415614157141581415914160141611416214163141641416514166141671416814169141701417114172141731417414175141761417714178141791418014181141821418314184141851418614187141881418914190141911419214193141941419514196141971419814199142001420114202142031420414205142061420714208142091421014211142121421314214142151421614217142181421914220142211422214223142241422514226142271422814229142301423114232142331423414235142361423714238142391424014241142421424314244142451424614247142481424914250142511425214253142541425514256142571425814259142601426114262142631426414265142661426714268142691427014271142721427314274142751427614277142781427914280142811428214283142841428514286142871428814289142901429114292142931429414295142961429714298142991430014301143021430314304143051430614307143081430914310143111431214313143141431514316143171431814319143201432114322143231432414325143261432714328143291433014331143321433314334143351433614337143381433914340143411434214343143441434514346143471434814349143501435114352143531435414355143561435714358143591436014361143621436314364143651436614367143681436914370143711437214373143741437514376143771437814379143801438114382143831438414385143861438714388143891439014391143921439314394143951439614397143981439914400144011440214403144041440514406144071440814409144101441114412144131441414415144161441714418144191442014421144221442314424144251442614427144281442914430144311443214433144341443514436144371443814439144401444114442144431444414445144461444714448144491445014451144521445314454144551445614457144581445914460144611446214463144641446514466144671446814469144701447114472144731447414475144761447714478144791448014481144821448314484144851448614487144881448914490144911449214493144941449514496144971449814499145001450114502145031450414505145061450714508145091451014511145121451314514145151451614517145181451914520145211452214523145241452514526145271452814529145301453114532145331453414535145361453714538145391454014541145421454314544145451454614547145481454914550145511455214553145541455514556145571455814559145601456114562145631456414565145661456714568145691457014571145721457314574145751457614577145781457914580145811458214583145841458514586145871458814589145901459114592145931459414595145961459714598145991460014601146021460314604146051460614607146081460914610146111461214613146141461514616146171461814619146201462114622146231462414625146261462714628146291463014631146321463314634146351463614637146381463914640146411464214643146441464514646146471464814649146501465114652146531465414655146561465714658146591466014661146621466314664146651466614667146681466914670146711467214673146741467514676146771467814679146801468114682146831468414685146861468714688146891469014691146921469314694146951469614697146981469914700147011470214703147041470514706147071470814709147101471114712147131471414715147161471714718147191472014721147221472314724147251472614727147281472914730147311473214733147341473514736147371473814739147401474114742147431474414745147461474714748147491475014751147521475314754147551475614757147581475914760147611476214763147641476514766147671476814769147701477114772147731477414775147761477714778147791478014781147821478314784147851478614787147881478914790147911479214793147941479514796147971479814799148001480114802148031480414805148061480714808148091481014811148121481314814148151481614817148181481914820148211482214823148241482514826148271482814829148301483114832148331483414835148361483714838148391484014841148421484314844148451484614847148481484914850148511485214853148541485514856148571485814859148601486114862148631486414865148661486714868148691487014871148721487314874148751487614877148781487914880148811488214883148841488514886148871488814889148901489114892148931489414895148961489714898148991490014901149021490314904149051490614907149081490914910149111491214913149141491514916149171491814919149201492114922149231492414925149261492714928149291493014931149321493314934149351493614937149381493914940149411494214943149441494514946149471494814949149501495114952149531495414955149561495714958149591496014961149621496314964149651496614967149681496914970149711497214973149741497514976149771497814979149801498114982149831498414985149861498714988149891499014991149921499314994149951499614997149981499915000150011500215003150041500515006150071500815009150101501115012150131501415015150161501715018150191502015021150221502315024150251502615027150281502915030150311503215033150341503515036150371503815039150401504115042150431504415045150461504715048150491505015051150521505315054150551505615057150581505915060150611506215063150641506515066150671506815069150701507115072150731507415075150761507715078150791508015081150821508315084150851508615087150881508915090150911509215093150941509515096150971509815099151001510115102151031510415105151061510715108151091511015111151121511315114151151511615117151181511915120151211512215123151241512515126151271512815129151301513115132151331513415135151361513715138151391514015141151421514315144151451514615147151481514915150151511515215153151541515515156151571515815159151601516115162151631516415165151661516715168151691517015171151721517315174151751517615177151781517915180151811518215183151841518515186151871518815189151901519115192151931519415195151961519715198151991520015201152021520315204152051520615207152081520915210152111521215213152141521515216152171521815219152201522115222152231522415225152261522715228152291523015231152321523315234152351523615237152381523915240152411524215243152441524515246152471524815249152501525115252152531525415255152561525715258152591526015261152621526315264152651526615267152681526915270152711527215273152741527515276152771527815279152801528115282152831528415285152861528715288152891529015291152921529315294152951529615297152981529915300153011530215303153041530515306153071530815309153101531115312153131531415315153161531715318153191532015321153221532315324153251532615327153281532915330153311533215333153341533515336153371533815339153401534115342153431534415345153461534715348153491535015351153521535315354153551535615357153581535915360153611536215363153641536515366153671536815369153701537115372153731537415375153761537715378153791538015381153821538315384153851538615387153881538915390153911539215393153941539515396153971539815399154001540115402154031540415405154061540715408154091541015411154121541315414154151541615417154181541915420154211542215423154241542515426154271542815429154301543115432154331543415435154361543715438154391544015441154421544315444154451544615447154481544915450154511545215453154541545515456154571545815459154601546115462154631546415465154661546715468154691547015471154721547315474154751547615477154781547915480154811548215483154841548515486154871548815489154901549115492154931549415495154961549715498154991550015501155021550315504155051550615507155081550915510155111551215513155141551515516155171551815519155201552115522155231552415525155261552715528155291553015531155321553315534155351553615537155381553915540155411554215543155441554515546155471554815549155501555115552155531555415555155561555715558155591556015561155621556315564155651556615567155681556915570155711557215573155741557515576155771557815579155801558115582155831558415585155861558715588155891559015591155921559315594155951559615597155981559915600156011560215603156041560515606156071560815609156101561115612156131561415615156161561715618156191562015621156221562315624156251562615627156281562915630156311563215633156341563515636156371563815639156401564115642156431564415645156461564715648156491565015651156521565315654156551565615657156581565915660156611566215663156641566515666156671566815669156701567115672156731567415675156761567715678156791568015681156821568315684156851568615687156881568915690156911569215693156941569515696156971569815699157001570115702157031570415705157061570715708157091571015711157121571315714157151571615717157181571915720157211572215723157241572515726157271572815729157301573115732157331573415735157361573715738157391574015741157421574315744157451574615747157481574915750157511575215753157541575515756157571575815759157601576115762157631576415765157661576715768157691577015771157721577315774157751577615777157781577915780157811578215783157841578515786157871578815789157901579115792157931579415795157961579715798157991580015801158021580315804158051580615807158081580915810158111581215813158141581515816158171581815819158201582115822158231582415825158261582715828158291583015831158321583315834158351583615837158381583915840158411584215843158441584515846158471584815849158501585115852158531585415855158561585715858158591586015861158621586315864158651586615867158681586915870158711587215873158741587515876158771587815879158801588115882158831588415885158861588715888158891589015891158921589315894158951589615897158981589915900159011590215903159041590515906159071590815909159101591115912159131591415915159161591715918159191592015921159221592315924159251592615927159281592915930159311593215933159341593515936159371593815939159401594115942159431594415945159461594715948159491595015951159521595315954159551595615957159581595915960159611596215963159641596515966159671596815969159701597115972159731597415975159761597715978159791598015981159821598315984159851598615987159881598915990159911599215993159941599515996159971599815999160001600116002160031600416005160061600716008160091601016011160121601316014160151601616017160181601916020160211602216023160241602516026160271602816029160301603116032160331603416035160361603716038160391604016041160421604316044160451604616047160481604916050160511605216053160541605516056160571605816059160601606116062160631606416065160661606716068160691607016071160721607316074160751607616077160781607916080160811608216083160841608516086160871608816089160901609116092160931609416095160961609716098160991610016101161021610316104161051610616107161081610916110161111611216113161141611516116161171611816119161201612116122161231612416125161261612716128161291613016131161321613316134161351613616137161381613916140161411614216143161441614516146161471614816149161501615116152161531615416155161561615716158161591616016161161621616316164161651616616167161681616916170161711617216173161741617516176161771617816179161801618116182161831618416185161861618716188161891619016191161921619316194161951619616197161981619916200162011620216203162041620516206162071620816209162101621116212162131621416215162161621716218162191622016221162221622316224162251622616227162281622916230162311623216233162341623516236162371623816239162401624116242162431624416245162461624716248162491625016251162521625316254162551625616257162581625916260162611626216263162641626516266162671626816269162701627116272162731627416275162761627716278162791628016281162821628316284162851628616287162881628916290162911629216293162941629516296162971629816299163001630116302163031630416305163061630716308163091631016311163121631316314163151631616317163181631916320163211632216323163241632516326163271632816329163301633116332163331633416335163361633716338163391634016341163421634316344163451634616347163481634916350163511635216353163541635516356163571635816359163601636116362163631636416365163661636716368163691637016371163721637316374163751637616377163781637916380163811638216383163841638516386163871638816389163901639116392163931639416395163961639716398163991640016401164021640316404164051640616407164081640916410164111641216413164141641516416164171641816419164201642116422164231642416425164261642716428164291643016431164321643316434164351643616437164381643916440164411644216443164441644516446164471644816449164501645116452164531645416455164561645716458164591646016461164621646316464164651646616467164681646916470164711647216473164741647516476164771647816479164801648116482164831648416485164861648716488164891649016491164921649316494164951649616497164981649916500165011650216503165041650516506165071650816509165101651116512165131651416515165161651716518165191652016521165221652316524165251652616527165281652916530165311653216533165341653516536165371653816539165401654116542165431654416545165461654716548165491655016551165521655316554165551655616557165581655916560165611656216563165641656516566165671656816569165701657116572165731657416575165761657716578165791658016581165821658316584165851658616587165881658916590165911659216593165941659516596165971659816599166001660116602166031660416605166061660716608166091661016611166121661316614166151661616617166181661916620166211662216623166241662516626166271662816629166301663116632166331663416635166361663716638166391664016641166421664316644166451664616647166481664916650166511665216653166541665516656166571665816659166601666116662166631666416665166661666716668166691667016671166721667316674166751667616677166781667916680166811668216683166841668516686166871668816689166901669116692166931669416695166961669716698166991670016701167021670316704167051670616707167081670916710167111671216713167141671516716167171671816719167201672116722167231672416725167261672716728167291673016731167321673316734167351673616737167381673916740167411674216743167441674516746167471674816749167501675116752167531675416755167561675716758167591676016761167621676316764167651676616767167681676916770167711677216773167741677516776167771677816779167801678116782167831678416785167861678716788167891679016791167921679316794167951679616797167981679916800168011680216803168041680516806168071680816809168101681116812168131681416815168161681716818168191682016821168221682316824168251682616827168281682916830168311683216833168341683516836168371683816839168401684116842168431684416845168461684716848168491685016851168521685316854168551685616857168581685916860168611686216863168641686516866168671686816869168701687116872168731687416875168761687716878168791688016881168821688316884168851688616887168881688916890168911689216893168941689516896168971689816899169001690116902169031690416905169061690716908169091691016911169121691316914169151691616917169181691916920169211692216923169241692516926169271692816929169301693116932169331693416935169361693716938169391694016941169421694316944169451694616947169481694916950169511695216953169541695516956169571695816959169601696116962169631696416965169661696716968169691697016971169721697316974169751697616977169781697916980169811698216983169841698516986169871698816989169901699116992169931699416995169961699716998169991700017001170021700317004170051700617007170081700917010170111701217013170141701517016170171701817019170201702117022170231702417025170261702717028170291703017031170321703317034170351703617037170381703917040170411704217043170441704517046170471704817049170501705117052170531705417055170561705717058170591706017061170621706317064170651706617067170681706917070170711707217073170741707517076170771707817079170801708117082170831708417085170861708717088170891709017091170921709317094170951709617097170981709917100171011710217103171041710517106171071710817109171101711117112171131711417115171161711717118171191712017121171221712317124171251712617127171281712917130171311713217133171341713517136171371713817139171401714117142171431714417145171461714717148171491715017151171521715317154171551715617157171581715917160171611716217163171641716517166171671716817169171701717117172171731717417175171761717717178171791718017181171821718317184171851718617187171881718917190171911719217193171941719517196171971719817199172001720117202172031720417205172061720717208172091721017211172121721317214172151721617217172181721917220172211722217223172241722517226172271722817229172301723117232172331723417235172361723717238172391724017241172421724317244172451724617247172481724917250172511725217253172541725517256172571725817259172601726117262172631726417265172661726717268172691727017271172721727317274172751727617277172781727917280172811728217283172841728517286172871728817289172901729117292172931729417295172961729717298172991730017301173021730317304173051730617307173081730917310173111731217313173141731517316173171731817319173201732117322173231732417325173261732717328173291733017331173321733317334173351733617337173381733917340173411734217343173441734517346173471734817349173501735117352173531735417355173561735717358173591736017361173621736317364173651736617367173681736917370173711737217373173741737517376173771737817379173801738117382173831738417385173861738717388173891739017391173921739317394173951739617397173981739917400174011740217403174041740517406174071740817409174101741117412174131741417415174161741717418174191742017421174221742317424174251742617427174281742917430174311743217433174341743517436174371743817439174401744117442174431744417445174461744717448174491745017451174521745317454174551745617457174581745917460174611746217463174641746517466174671746817469174701747117472174731747417475174761747717478174791748017481174821748317484174851748617487174881748917490174911749217493174941749517496174971749817499175001750117502175031750417505175061750717508175091751017511175121751317514175151751617517175181751917520175211752217523175241752517526175271752817529175301753117532175331753417535175361753717538175391754017541175421754317544175451754617547175481754917550175511755217553175541755517556175571755817559175601756117562175631756417565175661756717568175691757017571175721757317574175751757617577175781757917580175811758217583175841758517586175871758817589175901759117592175931759417595175961759717598175991760017601176021760317604176051760617607176081760917610176111761217613176141761517616176171761817619176201762117622176231762417625176261762717628176291763017631176321763317634176351763617637176381763917640176411764217643176441764517646176471764817649176501765117652176531765417655176561765717658176591766017661176621766317664176651766617667176681766917670176711767217673176741767517676176771767817679176801768117682176831768417685176861768717688176891769017691176921769317694176951769617697176981769917700177011770217703177041770517706177071770817709177101771117712177131771417715177161771717718177191772017721177221772317724177251772617727177281772917730177311773217733177341773517736177371773817739177401774117742177431774417745177461774717748177491775017751177521775317754177551775617757177581775917760177611776217763177641776517766177671776817769177701777117772177731777417775177761777717778177791778017781177821778317784177851778617787177881778917790177911779217793177941779517796177971779817799178001780117802178031780417805178061780717808178091781017811178121781317814178151781617817178181781917820178211782217823178241782517826178271782817829178301783117832178331783417835178361783717838178391784017841178421784317844178451784617847178481784917850178511785217853178541785517856178571785817859178601786117862178631786417865178661786717868178691787017871178721787317874178751787617877178781787917880178811788217883178841788517886178871788817889178901789117892178931789417895178961789717898178991790017901179021790317904179051790617907179081790917910179111791217913179141791517916179171791817919179201792117922179231792417925179261792717928179291793017931179321793317934179351793617937179381793917940179411794217943179441794517946179471794817949179501795117952179531795417955179561795717958179591796017961179621796317964179651796617967179681796917970179711797217973179741797517976179771797817979179801798117982179831798417985179861798717988179891799017991179921799317994179951799617997179981799918000180011800218003180041800518006180071800818009180101801118012180131801418015180161801718018180191802018021180221802318024180251802618027180281802918030180311803218033180341803518036180371803818039180401804118042180431804418045180461804718048180491805018051180521805318054180551805618057180581805918060180611806218063180641806518066180671806818069180701807118072180731807418075180761807718078180791808018081180821808318084180851808618087180881808918090180911809218093180941809518096180971809818099181001810118102181031810418105181061810718108181091811018111181121811318114181151811618117181181811918120181211812218123181241812518126181271812818129181301813118132181331813418135181361813718138181391814018141181421814318144181451814618147181481814918150181511815218153181541815518156181571815818159181601816118162181631816418165181661816718168181691817018171181721817318174181751817618177181781817918180181811818218183181841818518186181871818818189181901819118192181931819418195181961819718198181991820018201182021820318204182051820618207182081820918210182111821218213182141821518216182171821818219182201822118222182231822418225182261822718228182291823018231182321823318234182351823618237182381823918240182411824218243182441824518246182471824818249182501825118252182531825418255182561825718258182591826018261182621826318264182651826618267182681826918270182711827218273182741827518276182771827818279182801828118282182831828418285182861828718288182891829018291182921829318294182951829618297182981829918300183011830218303183041830518306183071830818309183101831118312183131831418315183161831718318183191832018321183221832318324183251832618327183281832918330183311833218333183341833518336183371833818339183401834118342183431834418345183461834718348183491835018351183521835318354183551835618357183581835918360183611836218363183641836518366183671836818369183701837118372183731837418375183761837718378183791838018381183821838318384183851838618387183881838918390183911839218393183941839518396183971839818399184001840118402184031840418405184061840718408184091841018411184121841318414184151841618417184181841918420184211842218423184241842518426184271842818429184301843118432184331843418435184361843718438184391844018441184421844318444184451844618447184481844918450184511845218453184541845518456184571845818459184601846118462184631846418465184661846718468184691847018471184721847318474184751847618477184781847918480184811848218483184841848518486184871848818489184901849118492184931849418495184961849718498184991850018501185021850318504185051850618507185081850918510185111851218513185141851518516185171851818519185201852118522185231852418525185261852718528185291853018531185321853318534185351853618537185381853918540185411854218543185441854518546185471854818549185501855118552185531855418555185561855718558185591856018561185621856318564185651856618567185681856918570185711857218573185741857518576185771857818579185801858118582185831858418585185861858718588185891859018591185921859318594185951859618597185981859918600186011860218603186041860518606186071860818609186101861118612186131861418615186161861718618186191862018621186221862318624186251862618627186281862918630186311863218633186341863518636186371863818639186401864118642186431864418645186461864718648186491865018651186521865318654186551865618657186581865918660186611866218663186641866518666186671866818669186701867118672186731867418675186761867718678186791868018681186821868318684186851868618687186881868918690186911869218693186941869518696186971869818699187001870118702187031870418705187061870718708187091871018711187121871318714187151871618717187181871918720187211872218723187241872518726187271872818729187301873118732187331873418735187361873718738187391874018741187421874318744187451874618747187481874918750187511875218753187541875518756187571875818759187601876118762187631876418765187661876718768187691877018771187721877318774187751877618777187781877918780187811878218783187841878518786187871878818789187901879118792187931879418795187961879718798187991880018801188021880318804188051880618807188081880918810188111881218813188141881518816188171881818819188201882118822188231882418825188261882718828188291883018831188321883318834188351883618837188381883918840188411884218843188441884518846188471884818849188501885118852188531885418855188561885718858188591886018861188621886318864188651886618867188681886918870188711887218873188741887518876188771887818879188801888118882188831888418885188861888718888188891889018891188921889318894188951889618897188981889918900189011890218903189041890518906189071890818909189101891118912189131891418915189161891718918189191892018921189221892318924189251892618927189281892918930189311893218933189341893518936189371893818939189401894118942189431894418945189461894718948189491895018951189521895318954189551895618957189581895918960189611896218963189641896518966189671896818969189701897118972189731897418975189761897718978189791898018981189821898318984189851898618987189881898918990189911899218993189941899518996189971899818999190001900119002190031900419005190061900719008190091901019011190121901319014190151901619017190181901919020190211902219023190241902519026190271902819029190301903119032190331903419035190361903719038190391904019041190421904319044190451904619047190481904919050190511905219053190541905519056190571905819059190601906119062190631906419065190661906719068190691907019071190721907319074190751907619077190781907919080190811908219083190841908519086190871908819089190901909119092190931909419095190961909719098190991910019101191021910319104191051910619107191081910919110191111911219113191141911519116191171911819119191201912119122191231912419125191261912719128191291913019131191321913319134191351913619137191381913919140191411914219143191441914519146191471914819149191501915119152191531915419155191561915719158191591916019161191621916319164191651916619167191681916919170191711917219173191741917519176191771917819179191801918119182191831918419185191861918719188191891919019191191921919319194191951919619197191981919919200192011920219203192041920519206192071920819209192101921119212192131921419215192161921719218192191922019221192221922319224192251922619227192281922919230192311923219233192341923519236192371923819239192401924119242192431924419245192461924719248192491925019251192521925319254192551925619257192581925919260192611926219263192641926519266192671926819269192701927119272192731927419275192761927719278192791928019281192821928319284192851928619287192881928919290192911929219293192941929519296192971929819299193001930119302193031930419305193061930719308193091931019311193121931319314193151931619317193181931919320193211932219323193241932519326193271932819329193301933119332193331933419335193361933719338193391934019341193421934319344193451934619347193481934919350193511935219353193541935519356193571935819359193601936119362193631936419365193661936719368193691937019371193721937319374193751937619377193781937919380193811938219383193841938519386193871938819389193901939119392193931939419395193961939719398193991940019401194021940319404194051940619407194081940919410194111941219413194141941519416194171941819419194201942119422194231942419425194261942719428194291943019431194321943319434194351943619437194381943919440194411944219443194441944519446194471944819449194501945119452194531945419455194561945719458194591946019461194621946319464194651946619467194681946919470194711947219473194741947519476194771947819479194801948119482194831948419485194861948719488194891949019491194921949319494194951949619497194981949919500195011950219503195041950519506195071950819509195101951119512195131951419515195161951719518195191952019521195221952319524195251952619527195281952919530195311953219533195341953519536195371953819539195401954119542195431954419545195461954719548195491955019551195521955319554195551955619557195581955919560195611956219563195641956519566195671956819569195701957119572195731957419575195761957719578195791958019581195821958319584195851958619587195881958919590195911959219593195941959519596195971959819599196001960119602196031960419605196061960719608196091961019611196121961319614196151961619617196181961919620196211962219623196241962519626196271962819629196301963119632196331963419635196361963719638196391964019641196421964319644196451964619647196481964919650196511965219653196541965519656196571965819659196601966119662196631966419665196661966719668196691967019671196721967319674196751967619677196781967919680196811968219683196841968519686196871968819689196901969119692196931969419695196961969719698196991970019701197021970319704197051970619707197081970919710197111971219713197141971519716197171971819719197201972119722197231972419725197261972719728197291973019731197321973319734197351973619737197381973919740197411974219743197441974519746197471974819749197501975119752197531975419755197561975719758197591976019761197621976319764197651976619767197681976919770197711977219773197741977519776197771977819779197801978119782197831978419785197861978719788197891979019791197921979319794197951979619797197981979919800198011980219803198041980519806198071980819809198101981119812198131981419815198161981719818198191982019821198221982319824198251982619827198281982919830198311983219833198341983519836198371983819839198401984119842198431984419845198461984719848198491985019851198521985319854198551985619857198581985919860198611986219863198641986519866198671986819869198701987119872198731987419875198761987719878198791988019881198821988319884198851988619887198881988919890198911989219893198941989519896198971989819899199001990119902199031990419905199061990719908199091991019911199121991319914199151991619917199181991919920199211992219923199241992519926199271992819929199301993119932199331993419935199361993719938199391994019941199421994319944199451994619947199481994919950199511995219953199541995519956199571995819959199601996119962199631996419965199661996719968199691997019971199721997319974199751997619977199781997919980199811998219983199841998519986199871998819989199901999119992199931999419995199961999719998199992000020001200022000320004200052000620007200082000920010200112001220013200142001520016200172001820019200202002120022200232002420025200262002720028200292003020031200322003320034200352003620037200382003920040200412004220043200442004520046200472004820049200502005120052200532005420055200562005720058200592006020061200622006320064200652006620067200682006920070200712007220073200742007520076200772007820079200802008120082200832008420085200862008720088200892009020091200922009320094200952009620097200982009920100201012010220103201042010520106201072010820109201102011120112201132011420115201162011720118201192012020121201222012320124201252012620127201282012920130201312013220133201342013520136201372013820139201402014120142201432014420145201462014720148201492015020151201522015320154201552015620157201582015920160201612016220163201642016520166201672016820169201702017120172201732017420175201762017720178201792018020181201822018320184201852018620187201882018920190201912019220193201942019520196201972019820199202002020120202202032020420205202062020720208202092021020211202122021320214202152021620217202182021920220202212022220223202242022520226202272022820229202302023120232202332023420235202362023720238202392024020241202422024320244202452024620247202482024920250202512025220253202542025520256202572025820259202602026120262202632026420265202662026720268202692027020271202722027320274202752027620277202782027920280202812028220283202842028520286202872028820289202902029120292202932029420295202962029720298202992030020301203022030320304203052030620307203082030920310203112031220313203142031520316203172031820319203202032120322203232032420325203262032720328203292033020331203322033320334203352033620337203382033920340203412034220343203442034520346203472034820349203502035120352203532035420355203562035720358203592036020361203622036320364203652036620367203682036920370203712037220373203742037520376203772037820379203802038120382203832038420385203862038720388203892039020391203922039320394203952039620397203982039920400204012040220403204042040520406204072040820409204102041120412204132041420415204162041720418204192042020421204222042320424204252042620427204282042920430204312043220433204342043520436204372043820439204402044120442204432044420445204462044720448204492045020451204522045320454204552045620457204582045920460204612046220463204642046520466204672046820469204702047120472204732047420475204762047720478204792048020481204822048320484204852048620487204882048920490204912049220493204942049520496204972049820499205002050120502205032050420505205062050720508205092051020511205122051320514205152051620517205182051920520205212052220523205242052520526205272052820529205302053120532205332053420535205362053720538205392054020541205422054320544205452054620547205482054920550205512055220553205542055520556205572055820559205602056120562205632056420565205662056720568205692057020571205722057320574205752057620577205782057920580205812058220583205842058520586205872058820589205902059120592205932059420595205962059720598205992060020601206022060320604206052060620607206082060920610206112061220613206142061520616206172061820619206202062120622206232062420625206262062720628206292063020631206322063320634206352063620637206382063920640206412064220643206442064520646206472064820649206502065120652206532065420655206562065720658206592066020661206622066320664206652066620667206682066920670206712067220673206742067520676206772067820679206802068120682206832068420685206862068720688206892069020691206922069320694206952069620697206982069920700207012070220703207042070520706207072070820709207102071120712207132071420715207162071720718207192072020721207222072320724207252072620727207282072920730207312073220733207342073520736207372073820739207402074120742207432074420745207462074720748207492075020751207522075320754207552075620757207582075920760207612076220763207642076520766207672076820769207702077120772207732077420775207762077720778207792078020781207822078320784207852078620787207882078920790207912079220793207942079520796207972079820799208002080120802208032080420805208062080720808208092081020811208122081320814208152081620817208182081920820208212082220823208242082520826208272082820829208302083120832208332083420835208362083720838208392084020841208422084320844208452084620847208482084920850208512085220853208542085520856208572085820859208602086120862208632086420865208662086720868208692087020871208722087320874208752087620877208782087920880208812088220883208842088520886208872088820889208902089120892208932089420895208962089720898208992090020901209022090320904209052090620907209082090920910209112091220913209142091520916209172091820919209202092120922209232092420925209262092720928209292093020931209322093320934209352093620937209382093920940209412094220943209442094520946209472094820949209502095120952209532095420955209562095720958209592096020961209622096320964209652096620967209682096920970209712097220973209742097520976209772097820979209802098120982209832098420985209862098720988209892099020991209922099320994209952099620997209982099921000210012100221003210042100521006210072100821009210102101121012210132101421015210162101721018210192102021021210222102321024210252102621027210282102921030210312103221033210342103521036210372103821039210402104121042210432104421045210462104721048210492105021051210522105321054210552105621057210582105921060210612106221063210642106521066210672106821069210702107121072210732107421075210762107721078210792108021081210822108321084210852108621087210882108921090210912109221093210942109521096210972109821099211002110121102211032110421105211062110721108211092111021111211122111321114211152111621117211182111921120211212112221123211242112521126211272112821129211302113121132211332113421135211362113721138211392114021141211422114321144211452114621147211482114921150211512115221153211542115521156211572115821159211602116121162211632116421165211662116721168211692117021171211722117321174211752117621177211782117921180211812118221183211842118521186211872118821189211902119121192211932119421195211962119721198211992120021201212022120321204212052120621207212082120921210212112121221213212142121521216212172121821219212202122121222212232122421225212262122721228212292123021231212322123321234212352123621237212382123921240212412124221243212442124521246212472124821249212502125121252212532125421255212562125721258212592126021261212622126321264212652126621267212682126921270212712127221273212742127521276212772127821279212802128121282212832128421285212862128721288212892129021291212922129321294212952129621297212982129921300213012130221303213042130521306213072130821309213102131121312213132131421315213162131721318213192132021321213222132321324213252132621327213282132921330213312133221333213342133521336213372133821339213402134121342213432134421345213462134721348213492135021351213522135321354213552135621357213582135921360213612136221363213642136521366213672136821369213702137121372213732137421375213762137721378213792138021381213822138321384213852138621387213882138921390213912139221393213942139521396213972139821399214002140121402214032140421405214062140721408214092141021411214122141321414214152141621417214182141921420214212142221423214242142521426214272142821429214302143121432214332143421435214362143721438214392144021441214422144321444214452144621447214482144921450214512145221453214542145521456214572145821459214602146121462214632146421465214662146721468214692147021471214722147321474214752147621477214782147921480214812148221483214842148521486214872148821489214902149121492214932149421495214962149721498214992150021501215022150321504215052150621507215082150921510215112151221513215142151521516215172151821519215202152121522215232152421525215262152721528215292153021531215322153321534215352153621537215382153921540215412154221543215442154521546215472154821549215502155121552215532155421555215562155721558215592156021561215622156321564215652156621567215682156921570215712157221573215742157521576215772157821579215802158121582215832158421585215862158721588215892159021591215922159321594215952159621597215982159921600216012160221603216042160521606216072160821609216102161121612216132161421615216162161721618216192162021621216222162321624216252162621627216282162921630216312163221633216342163521636216372163821639216402164121642216432164421645216462164721648216492165021651216522165321654216552165621657216582165921660216612166221663216642166521666216672166821669216702167121672216732167421675216762167721678216792168021681216822168321684216852168621687216882168921690216912169221693216942169521696216972169821699217002170121702217032170421705217062170721708217092171021711217122171321714217152171621717217182171921720217212172221723217242172521726217272172821729217302173121732217332173421735217362173721738217392174021741217422174321744217452174621747217482174921750217512175221753217542175521756217572175821759217602176121762217632176421765217662176721768217692177021771217722177321774217752177621777217782177921780217812178221783217842178521786217872178821789217902179121792217932179421795217962179721798217992180021801218022180321804218052180621807218082180921810218112181221813218142181521816218172181821819218202182121822218232182421825218262182721828218292183021831218322183321834218352183621837218382183921840218412184221843218442184521846218472184821849218502185121852218532185421855218562185721858218592186021861218622186321864218652186621867218682186921870218712187221873218742187521876218772187821879218802188121882218832188421885218862188721888218892189021891218922189321894218952189621897218982189921900219012190221903219042190521906219072190821909219102191121912219132191421915219162191721918219192192021921219222192321924219252192621927219282192921930219312193221933219342193521936219372193821939219402194121942219432194421945219462194721948219492195021951219522195321954219552195621957219582195921960219612196221963219642196521966219672196821969219702197121972219732197421975219762197721978219792198021981219822198321984219852198621987219882198921990219912199221993219942199521996219972199821999220002200122002220032200422005220062200722008220092201022011220122201322014220152201622017220182201922020220212202222023220242202522026220272202822029220302203122032220332203422035220362203722038220392204022041220422204322044220452204622047220482204922050220512205222053220542205522056220572205822059220602206122062220632206422065220662206722068220692207022071220722207322074220752207622077220782207922080220812208222083220842208522086220872208822089220902209122092220932209422095220962209722098220992210022101221022210322104221052210622107221082210922110221112211222113221142211522116221172211822119221202212122122221232212422125221262212722128221292213022131221322213322134221352213622137221382213922140221412214222143221442214522146221472214822149221502215122152221532215422155221562215722158221592216022161221622216322164221652216622167221682216922170221712217222173221742217522176221772217822179221802218122182221832218422185221862218722188221892219022191221922219322194221952219622197221982219922200222012220222203222042220522206222072220822209222102221122212222132221422215222162221722218222192222022221222222222322224222252222622227222282222922230222312223222233222342223522236222372223822239222402224122242222432224422245222462224722248222492225022251222522225322254222552225622257222582225922260222612226222263222642226522266222672226822269222702227122272222732227422275222762227722278222792228022281222822228322284222852228622287222882228922290222912229222293222942229522296222972229822299223002230122302223032230422305223062230722308223092231022311223122231322314223152231622317223182231922320223212232222323223242232522326223272232822329223302233122332223332233422335223362233722338223392234022341223422234322344223452234622347223482234922350223512235222353223542235522356223572235822359223602236122362223632236422365223662236722368223692237022371223722237322374223752237622377223782237922380223812238222383223842238522386223872238822389223902239122392223932239422395223962239722398223992240022401224022240322404224052240622407224082240922410224112241222413224142241522416224172241822419224202242122422224232242422425224262242722428224292243022431224322243322434224352243622437224382243922440224412244222443224442244522446224472244822449224502245122452224532245422455224562245722458224592246022461224622246322464224652246622467224682246922470224712247222473224742247522476224772247822479224802248122482224832248422485224862248722488224892249022491224922249322494224952249622497224982249922500225012250222503225042250522506225072250822509225102251122512225132251422515225162251722518225192252022521225222252322524225252252622527225282252922530225312253222533225342253522536225372253822539225402254122542225432254422545225462254722548225492255022551225522255322554225552255622557225582255922560225612256222563225642256522566225672256822569225702257122572225732257422575225762257722578225792258022581225822258322584225852258622587225882258922590225912259222593225942259522596225972259822599226002260122602226032260422605226062260722608226092261022611226122261322614226152261622617226182261922620226212262222623226242262522626226272262822629226302263122632226332263422635226362263722638226392264022641226422264322644226452264622647226482264922650226512265222653226542265522656226572265822659226602266122662226632266422665226662266722668226692267022671226722267322674226752267622677226782267922680226812268222683226842268522686226872268822689226902269122692226932269422695226962269722698226992270022701227022270322704227052270622707227082270922710227112271222713227142271522716227172271822719227202272122722227232272422725227262272722728227292273022731227322273322734227352273622737227382273922740227412274222743227442274522746227472274822749227502275122752227532275422755227562275722758227592276022761227622276322764227652276622767227682276922770227712277222773227742277522776227772277822779227802278122782227832278422785227862278722788227892279022791227922279322794227952279622797227982279922800228012280222803228042280522806228072280822809228102281122812228132281422815228162281722818228192282022821228222282322824228252282622827228282282922830228312283222833228342283522836228372283822839228402284122842228432284422845228462284722848228492285022851228522285322854228552285622857228582285922860228612286222863228642286522866228672286822869228702287122872228732287422875228762287722878228792288022881228822288322884228852288622887228882288922890228912289222893228942289522896228972289822899229002290122902229032290422905229062290722908229092291022911229122291322914229152291622917229182291922920229212292222923229242292522926229272292822929229302293122932229332293422935229362293722938229392294022941229422294322944229452294622947229482294922950229512295222953229542295522956229572295822959229602296122962229632296422965229662296722968229692297022971229722297322974229752297622977229782297922980229812298222983229842298522986229872298822989229902299122992229932299422995229962299722998229992300023001230022300323004230052300623007230082300923010230112301223013230142301523016230172301823019230202302123022230232302423025230262302723028230292303023031230322303323034230352303623037230382303923040230412304223043230442304523046230472304823049230502305123052230532305423055230562305723058230592306023061230622306323064230652306623067230682306923070230712307223073230742307523076230772307823079230802308123082230832308423085230862308723088230892309023091230922309323094230952309623097230982309923100231012310223103231042310523106231072310823109231102311123112231132311423115231162311723118231192312023121231222312323124231252312623127231282312923130231312313223133231342313523136231372313823139231402314123142231432314423145231462314723148231492315023151231522315323154231552315623157231582315923160231612316223163231642316523166231672316823169231702317123172231732317423175231762317723178231792318023181231822318323184231852318623187231882318923190231912319223193231942319523196231972319823199232002320123202232032320423205232062320723208232092321023211232122321323214232152321623217232182321923220232212322223223232242322523226232272322823229232302323123232232332323423235232362323723238232392324023241232422324323244232452324623247232482324923250232512325223253232542325523256232572325823259232602326123262232632326423265232662326723268232692327023271232722327323274232752327623277232782327923280232812328223283232842328523286232872328823289232902329123292232932329423295232962329723298232992330023301233022330323304233052330623307233082330923310233112331223313233142331523316233172331823319233202332123322233232332423325233262332723328233292333023331233322333323334233352333623337233382333923340233412334223343233442334523346233472334823349233502335123352233532335423355233562335723358233592336023361233622336323364233652336623367233682336923370233712337223373233742337523376233772337823379233802338123382233832338423385233862338723388233892339023391233922339323394233952339623397233982339923400234012340223403234042340523406234072340823409234102341123412234132341423415234162341723418234192342023421234222342323424234252342623427234282342923430234312343223433234342343523436234372343823439234402344123442234432344423445234462344723448234492345023451234522345323454234552345623457234582345923460234612346223463234642346523466234672346823469234702347123472234732347423475234762347723478234792348023481234822348323484234852348623487234882348923490234912349223493234942349523496234972349823499235002350123502235032350423505235062350723508235092351023511235122351323514235152351623517235182351923520235212352223523235242352523526235272352823529235302353123532235332353423535235362353723538235392354023541235422354323544235452354623547235482354923550235512355223553235542355523556235572355823559235602356123562235632356423565235662356723568235692357023571235722357323574235752357623577235782357923580235812358223583235842358523586235872358823589235902359123592235932359423595235962359723598235992360023601236022360323604236052360623607236082360923610236112361223613236142361523616236172361823619236202362123622236232362423625236262362723628236292363023631236322363323634236352363623637236382363923640236412364223643236442364523646236472364823649236502365123652236532365423655236562365723658236592366023661236622366323664236652366623667236682366923670236712367223673236742367523676236772367823679236802368123682236832368423685236862368723688236892369023691236922369323694236952369623697236982369923700237012370223703237042370523706237072370823709237102371123712237132371423715237162371723718237192372023721237222372323724237252372623727237282372923730237312373223733237342373523736237372373823739237402374123742237432374423745237462374723748237492375023751237522375323754237552375623757237582375923760237612376223763237642376523766237672376823769237702377123772237732377423775237762377723778237792378023781237822378323784237852378623787237882378923790237912379223793237942379523796237972379823799238002380123802238032380423805238062380723808238092381023811238122381323814238152381623817238182381923820238212382223823238242382523826238272382823829238302383123832238332383423835238362383723838238392384023841238422384323844238452384623847238482384923850238512385223853238542385523856238572385823859238602386123862238632386423865238662386723868238692387023871238722387323874238752387623877238782387923880238812388223883238842388523886238872388823889238902389123892238932389423895238962389723898238992390023901239022390323904239052390623907239082390923910239112391223913239142391523916239172391823919239202392123922239232392423925239262392723928239292393023931239322393323934239352393623937239382393923940239412394223943239442394523946239472394823949239502395123952239532395423955239562395723958239592396023961239622396323964239652396623967239682396923970239712397223973239742397523976239772397823979239802398123982239832398423985239862398723988239892399023991239922399323994239952399623997239982399924000240012400224003240042400524006240072400824009240102401124012240132401424015240162401724018240192402024021240222402324024240252402624027240282402924030240312403224033240342403524036240372403824039240402404124042240432404424045240462404724048240492405024051240522405324054240552405624057240582405924060240612406224063240642406524066240672406824069240702407124072240732407424075240762407724078240792408024081240822408324084240852408624087240882408924090240912409224093240942409524096240972409824099241002410124102241032410424105241062410724108241092411024111241122411324114241152411624117241182411924120241212412224123241242412524126241272412824129241302413124132241332413424135241362413724138241392414024141241422414324144241452414624147241482414924150241512415224153241542415524156241572415824159241602416124162241632416424165241662416724168241692417024171241722417324174241752417624177241782417924180241812418224183241842418524186241872418824189241902419124192241932419424195241962419724198241992420024201242022420324204242052420624207242082420924210242112421224213242142421524216242172421824219242202422124222242232422424225242262422724228242292423024231242322423324234242352423624237242382423924240242412424224243242442424524246242472424824249242502425124252242532425424255242562425724258242592426024261242622426324264242652426624267242682426924270242712427224273242742427524276242772427824279242802428124282242832428424285242862428724288242892429024291242922429324294242952429624297242982429924300243012430224303243042430524306243072430824309243102431124312243132431424315243162431724318243192432024321243222432324324243252432624327243282432924330243312433224333243342433524336243372433824339243402434124342243432434424345243462434724348243492435024351243522435324354243552435624357243582435924360243612436224363243642436524366243672436824369243702437124372243732437424375243762437724378243792438024381243822438324384243852438624387243882438924390243912439224393243942439524396243972439824399244002440124402244032440424405244062440724408244092441024411244122441324414244152441624417244182441924420244212442224423244242442524426244272442824429244302443124432244332443424435244362443724438244392444024441244422444324444244452444624447244482444924450244512445224453244542445524456244572445824459244602446124462244632446424465244662446724468244692447024471244722447324474244752447624477244782447924480244812448224483244842448524486244872448824489244902449124492244932449424495244962449724498244992450024501245022450324504245052450624507245082450924510245112451224513245142451524516245172451824519245202452124522245232452424525245262452724528245292453024531245322453324534245352453624537245382453924540245412454224543245442454524546245472454824549245502455124552245532455424555245562455724558245592456024561245622456324564245652456624567245682456924570245712457224573245742457524576245772457824579245802458124582245832458424585245862458724588245892459024591245922459324594245952459624597245982459924600246012460224603246042460524606246072460824609246102461124612246132461424615246162461724618246192462024621246222462324624246252462624627246282462924630246312463224633246342463524636246372463824639246402464124642246432464424645246462464724648246492465024651246522465324654246552465624657246582465924660246612466224663246642466524666246672466824669246702467124672246732467424675246762467724678246792468024681246822468324684246852468624687246882468924690246912469224693246942469524696246972469824699247002470124702247032470424705247062470724708247092471024711247122471324714247152471624717247182471924720247212472224723247242472524726247272472824729247302473124732247332473424735247362473724738247392474024741247422474324744247452474624747247482474924750247512475224753247542475524756247572475824759247602476124762247632476424765247662476724768247692477024771247722477324774247752477624777247782477924780247812478224783247842478524786247872478824789247902479124792247932479424795247962479724798247992480024801248022480324804248052480624807248082480924810248112481224813248142481524816248172481824819248202482124822248232482424825248262482724828248292483024831248322483324834248352483624837248382483924840248412484224843248442484524846248472484824849248502485124852248532485424855248562485724858248592486024861248622486324864248652486624867248682486924870248712487224873248742487524876248772487824879248802488124882248832488424885248862488724888248892489024891248922489324894248952489624897248982489924900249012490224903249042490524906249072490824909249102491124912249132491424915249162491724918249192492024921249222492324924249252492624927249282492924930249312493224933249342493524936249372493824939249402494124942249432494424945249462494724948249492495024951249522495324954249552495624957249582495924960249612496224963249642496524966249672496824969249702497124972249732497424975249762497724978249792498024981249822498324984249852498624987249882498924990249912499224993249942499524996249972499824999250002500125002250032500425005250062500725008250092501025011250122501325014250152501625017250182501925020250212502225023250242502525026250272502825029250302503125032250332503425035250362503725038250392504025041250422504325044250452504625047250482504925050250512505225053250542505525056250572505825059250602506125062250632506425065250662506725068250692507025071250722507325074250752507625077250782507925080250812508225083250842508525086250872508825089250902509125092250932509425095250962509725098250992510025101251022510325104251052510625107251082510925110251112511225113251142511525116251172511825119251202512125122251232512425125251262512725128251292513025131251322513325134251352513625137251382513925140251412514225143251442514525146251472514825149251502515125152251532515425155251562515725158251592516025161251622516325164251652516625167251682516925170251712517225173251742517525176251772517825179251802518125182251832518425185251862518725188251892519025191251922519325194251952519625197251982519925200252012520225203252042520525206252072520825209252102521125212252132521425215252162521725218252192522025221252222522325224252252522625227252282522925230252312523225233252342523525236252372523825239252402524125242252432524425245252462524725248252492525025251252522525325254252552525625257252582525925260252612526225263252642526525266252672526825269252702527125272252732527425275252762527725278252792528025281252822528325284252852528625287252882528925290252912529225293252942529525296252972529825299253002530125302253032530425305253062530725308253092531025311253122531325314253152531625317253182531925320253212532225323253242532525326253272532825329253302533125332253332533425335253362533725338253392534025341253422534325344253452534625347253482534925350253512535225353253542535525356253572535825359253602536125362253632536425365253662536725368253692537025371253722537325374253752537625377253782537925380253812538225383253842538525386253872538825389253902539125392253932539425395253962539725398253992540025401254022540325404254052540625407254082540925410254112541225413254142541525416254172541825419254202542125422254232542425425254262542725428254292543025431254322543325434254352543625437254382543925440254412544225443254442544525446254472544825449254502545125452254532545425455254562545725458254592546025461254622546325464254652546625467254682546925470254712547225473254742547525476254772547825479254802548125482254832548425485254862548725488254892549025491254922549325494254952549625497254982549925500255012550225503255042550525506255072550825509255102551125512255132551425515255162551725518255192552025521255222552325524255252552625527255282552925530255312553225533255342553525536255372553825539255402554125542255432554425545255462554725548255492555025551255522555325554255552555625557255582555925560255612556225563255642556525566255672556825569255702557125572255732557425575255762557725578255792558025581255822558325584255852558625587255882558925590255912559225593255942559525596255972559825599256002560125602256032560425605256062560725608256092561025611256122561325614256152561625617256182561925620256212562225623256242562525626256272562825629256302563125632256332563425635256362563725638256392564025641256422564325644256452564625647256482564925650256512565225653256542565525656256572565825659256602566125662256632566425665256662566725668256692567025671256722567325674256752567625677256782567925680256812568225683256842568525686256872568825689256902569125692256932569425695256962569725698256992570025701257022570325704257052570625707257082570925710257112571225713257142571525716257172571825719257202572125722257232572425725257262572725728257292573025731257322573325734257352573625737257382573925740257412574225743257442574525746257472574825749257502575125752257532575425755257562575725758257592576025761257622576325764257652576625767257682576925770257712577225773257742577525776257772577825779257802578125782257832578425785257862578725788257892579025791257922579325794257952579625797257982579925800258012580225803258042580525806258072580825809258102581125812258132581425815258162581725818258192582025821258222582325824258252582625827258282582925830258312583225833258342583525836258372583825839258402584125842258432584425845258462584725848258492585025851258522585325854258552585625857258582585925860258612586225863258642586525866258672586825869258702587125872258732587425875258762587725878258792588025881258822588325884258852588625887258882588925890258912589225893258942589525896258972589825899259002590125902259032590425905259062590725908259092591025911259122591325914259152591625917259182591925920259212592225923259242592525926259272592825929259302593125932259332593425935259362593725938259392594025941259422594325944259452594625947259482594925950259512595225953259542595525956259572595825959259602596125962259632596425965259662596725968259692597025971259722597325974259752597625977259782597925980259812598225983259842598525986259872598825989259902599125992259932599425995259962599725998259992600026001260022600326004260052600626007260082600926010260112601226013260142601526016260172601826019260202602126022260232602426025260262602726028260292603026031260322603326034260352603626037260382603926040260412604226043260442604526046260472604826049260502605126052260532605426055260562605726058260592606026061260622606326064260652606626067260682606926070260712607226073260742607526076260772607826079260802608126082260832608426085260862608726088260892609026091260922609326094260952609626097260982609926100261012610226103261042610526106261072610826109261102611126112261132611426115261162611726118261192612026121261222612326124261252612626127261282612926130261312613226133261342613526136261372613826139261402614126142261432614426145261462614726148261492615026151261522615326154261552615626157261582615926160261612616226163261642616526166261672616826169261702617126172261732617426175261762617726178261792618026181261822618326184261852618626187261882618926190261912619226193261942619526196261972619826199262002620126202262032620426205262062620726208262092621026211262122621326214262152621626217262182621926220262212622226223262242622526226262272622826229262302623126232262332623426235262362623726238262392624026241262422624326244262452624626247262482624926250262512625226253262542625526256262572625826259262602626126262262632626426265262662626726268262692627026271262722627326274262752627626277262782627926280262812628226283262842628526286262872628826289262902629126292262932629426295262962629726298262992630026301263022630326304263052630626307263082630926310263112631226313263142631526316263172631826319263202632126322263232632426325263262632726328263292633026331263322633326334263352633626337263382633926340263412634226343263442634526346263472634826349263502635126352263532635426355263562635726358263592636026361263622636326364263652636626367263682636926370263712637226373263742637526376263772637826379263802638126382263832638426385263862638726388263892639026391263922639326394263952639626397263982639926400264012640226403264042640526406264072640826409264102641126412264132641426415264162641726418264192642026421264222642326424264252642626427264282642926430264312643226433264342643526436264372643826439264402644126442264432644426445264462644726448264492645026451264522645326454264552645626457264582645926460264612646226463264642646526466264672646826469264702647126472264732647426475264762647726478264792648026481264822648326484264852648626487264882648926490264912649226493264942649526496264972649826499265002650126502265032650426505265062650726508265092651026511265122651326514265152651626517265182651926520265212652226523265242652526526265272652826529265302653126532265332653426535265362653726538265392654026541265422654326544265452654626547265482654926550265512655226553265542655526556265572655826559265602656126562265632656426565265662656726568265692657026571265722657326574265752657626577265782657926580265812658226583265842658526586265872658826589265902659126592265932659426595265962659726598265992660026601266022660326604266052660626607266082660926610266112661226613266142661526616266172661826619266202662126622266232662426625266262662726628266292663026631266322663326634266352663626637266382663926640266412664226643266442664526646266472664826649266502665126652266532665426655266562665726658266592666026661266622666326664266652666626667266682666926670266712667226673266742667526676266772667826679266802668126682266832668426685266862668726688266892669026691266922669326694266952669626697266982669926700267012670226703267042670526706267072670826709267102671126712267132671426715267162671726718267192672026721267222672326724267252672626727267282672926730267312673226733267342673526736267372673826739267402674126742267432674426745267462674726748267492675026751267522675326754267552675626757267582675926760267612676226763267642676526766267672676826769267702677126772267732677426775267762677726778267792678026781267822678326784267852678626787267882678926790267912679226793267942679526796267972679826799268002680126802268032680426805268062680726808268092681026811268122681326814268152681626817268182681926820268212682226823268242682526826268272682826829268302683126832268332683426835268362683726838268392684026841268422684326844268452684626847268482684926850268512685226853268542685526856268572685826859268602686126862268632686426865268662686726868268692687026871268722687326874268752687626877268782687926880268812688226883268842688526886268872688826889268902689126892268932689426895268962689726898268992690026901269022690326904269052690626907269082690926910269112691226913269142691526916269172691826919269202692126922269232692426925269262692726928269292693026931269322693326934269352693626937269382693926940269412694226943269442694526946269472694826949269502695126952269532695426955269562695726958269592696026961269622696326964269652696626967269682696926970269712697226973269742697526976269772697826979269802698126982269832698426985269862698726988269892699026991269922699326994269952699626997269982699927000270012700227003270042700527006270072700827009270102701127012270132701427015270162701727018270192702027021270222702327024270252702627027270282702927030270312703227033270342703527036270372703827039270402704127042270432704427045270462704727048270492705027051270522705327054270552705627057270582705927060270612706227063270642706527066270672706827069270702707127072270732707427075270762707727078270792708027081270822708327084270852708627087270882708927090270912709227093270942709527096270972709827099271002710127102271032710427105271062710727108271092711027111271122711327114271152711627117271182711927120271212712227123271242712527126271272712827129271302713127132271332713427135271362713727138271392714027141271422714327144271452714627147271482714927150271512715227153271542715527156271572715827159271602716127162271632716427165271662716727168271692717027171271722717327174271752717627177271782717927180271812718227183271842718527186271872718827189271902719127192271932719427195271962719727198271992720027201272022720327204272052720627207272082720927210272112721227213272142721527216272172721827219272202722127222272232722427225272262722727228272292723027231272322723327234272352723627237272382723927240272412724227243272442724527246272472724827249272502725127252272532725427255272562725727258272592726027261272622726327264272652726627267272682726927270272712727227273272742727527276272772727827279272802728127282272832728427285272862728727288272892729027291272922729327294272952729627297272982729927300273012730227303273042730527306273072730827309273102731127312273132731427315273162731727318273192732027321273222732327324273252732627327273282732927330273312733227333273342733527336273372733827339273402734127342273432734427345273462734727348273492735027351273522735327354273552735627357273582735927360273612736227363273642736527366273672736827369273702737127372273732737427375273762737727378273792738027381273822738327384273852738627387273882738927390273912739227393273942739527396273972739827399274002740127402274032740427405274062740727408274092741027411274122741327414274152741627417274182741927420274212742227423274242742527426274272742827429274302743127432274332743427435274362743727438274392744027441274422744327444274452744627447274482744927450274512745227453274542745527456274572745827459274602746127462274632746427465274662746727468274692747027471274722747327474274752747627477274782747927480274812748227483274842748527486274872748827489274902749127492274932749427495274962749727498274992750027501275022750327504275052750627507275082750927510275112751227513275142751527516275172751827519275202752127522275232752427525275262752727528275292753027531275322753327534275352753627537275382753927540275412754227543275442754527546275472754827549275502755127552275532755427555275562755727558275592756027561275622756327564275652756627567275682756927570275712757227573275742757527576275772757827579275802758127582275832758427585275862758727588275892759027591275922759327594275952759627597275982759927600276012760227603276042760527606276072760827609276102761127612276132761427615276162761727618276192762027621276222762327624276252762627627276282762927630276312763227633276342763527636276372763827639276402764127642276432764427645276462764727648276492765027651276522765327654276552765627657276582765927660276612766227663276642766527666276672766827669276702767127672276732767427675276762767727678276792768027681276822768327684276852768627687276882768927690276912769227693276942769527696276972769827699277002770127702277032770427705277062770727708277092771027711277122771327714277152771627717277182771927720277212772227723277242772527726277272772827729277302773127732277332773427735277362773727738277392774027741277422774327744277452774627747277482774927750277512775227753277542775527756277572775827759277602776127762277632776427765277662776727768277692777027771277722777327774277752777627777277782777927780277812778227783277842778527786277872778827789277902779127792277932779427795277962779727798277992780027801278022780327804278052780627807278082780927810278112781227813278142781527816278172781827819278202782127822278232782427825278262782727828278292783027831278322783327834278352783627837278382783927840278412784227843278442784527846278472784827849278502785127852278532785427855278562785727858278592786027861278622786327864278652786627867278682786927870278712787227873278742787527876278772787827879278802788127882278832788427885278862788727888278892789027891278922789327894278952789627897278982789927900279012790227903279042790527906279072790827909279102791127912279132791427915279162791727918279192792027921279222792327924279252792627927279282792927930279312793227933279342793527936279372793827939279402794127942279432794427945279462794727948279492795027951279522795327954279552795627957279582795927960279612796227963279642796527966279672796827969279702797127972279732797427975279762797727978279792798027981279822798327984279852798627987279882798927990279912799227993279942799527996279972799827999280002800128002280032800428005280062800728008280092801028011280122801328014280152801628017280182801928020280212802228023280242802528026280272802828029280302803128032280332803428035280362803728038280392804028041280422804328044280452804628047280482804928050280512805228053280542805528056280572805828059280602806128062280632806428065280662806728068280692807028071280722807328074280752807628077280782807928080280812808228083280842808528086280872808828089280902809128092280932809428095280962809728098280992810028101281022810328104281052810628107281082810928110281112811228113281142811528116281172811828119281202812128122281232812428125281262812728128281292813028131281322813328134281352813628137281382813928140281412814228143281442814528146281472814828149281502815128152281532815428155281562815728158281592816028161281622816328164281652816628167281682816928170281712817228173281742817528176281772817828179281802818128182281832818428185281862818728188281892819028191281922819328194281952819628197281982819928200282012820228203282042820528206282072820828209282102821128212282132821428215282162821728218282192822028221282222822328224282252822628227282282822928230282312823228233282342823528236282372823828239282402824128242282432824428245282462824728248282492825028251282522825328254282552825628257282582825928260282612826228263282642826528266282672826828269282702827128272282732827428275282762827728278282792828028281282822828328284282852828628287282882828928290282912829228293282942829528296282972829828299283002830128302283032830428305283062830728308283092831028311283122831328314283152831628317283182831928320283212832228323283242832528326283272832828329283302833128332283332833428335283362833728338283392834028341283422834328344283452834628347283482834928350283512835228353283542835528356283572835828359283602836128362283632836428365283662836728368283692837028371283722837328374283752837628377283782837928380283812838228383283842838528386283872838828389283902839128392283932839428395283962839728398283992840028401284022840328404284052840628407284082840928410284112841228413284142841528416284172841828419284202842128422284232842428425284262842728428284292843028431284322843328434284352843628437284382843928440284412844228443284442844528446284472844828449284502845128452284532845428455284562845728458284592846028461284622846328464284652846628467284682846928470284712847228473284742847528476284772847828479284802848128482284832848428485284862848728488284892849028491284922849328494284952849628497284982849928500285012850228503285042850528506285072850828509285102851128512285132851428515285162851728518285192852028521285222852328524285252852628527285282852928530285312853228533285342853528536285372853828539285402854128542285432854428545285462854728548285492855028551285522855328554285552855628557285582855928560285612856228563285642856528566285672856828569285702857128572285732857428575285762857728578285792858028581285822858328584285852858628587285882858928590285912859228593285942859528596285972859828599286002860128602286032860428605286062860728608286092861028611286122861328614286152861628617286182861928620286212862228623286242862528626286272862828629286302863128632286332863428635286362863728638286392864028641286422864328644286452864628647286482864928650286512865228653286542865528656286572865828659286602866128662286632866428665286662866728668286692867028671286722867328674286752867628677286782867928680286812868228683286842868528686286872868828689286902869128692286932869428695286962869728698286992870028701287022870328704287052870628707287082870928710287112871228713287142871528716287172871828719287202872128722287232872428725287262872728728287292873028731287322873328734287352873628737287382873928740287412874228743287442874528746287472874828749287502875128752287532875428755287562875728758287592876028761287622876328764287652876628767287682876928770287712877228773287742877528776287772877828779287802878128782287832878428785287862878728788287892879028791287922879328794287952879628797287982879928800288012880228803288042880528806288072880828809288102881128812288132881428815288162881728818288192882028821288222882328824288252882628827288282882928830288312883228833288342883528836288372883828839288402884128842288432884428845288462884728848288492885028851288522885328854288552885628857288582885928860288612886228863288642886528866288672886828869288702887128872288732887428875288762887728878288792888028881288822888328884288852888628887288882888928890288912889228893288942889528896288972889828899289002890128902289032890428905289062890728908289092891028911289122891328914289152891628917289182891928920289212892228923289242892528926289272892828929289302893128932289332893428935289362893728938289392894028941289422894328944289452894628947289482894928950289512895228953289542895528956289572895828959289602896128962289632896428965289662896728968289692897028971289722897328974289752897628977289782897928980289812898228983289842898528986289872898828989289902899128992289932899428995289962899728998289992900029001290022900329004290052900629007290082900929010290112901229013290142901529016290172901829019290202902129022290232902429025290262902729028290292903029031290322903329034290352903629037290382903929040290412904229043290442904529046290472904829049290502905129052290532905429055290562905729058290592906029061290622906329064290652906629067290682906929070290712907229073290742907529076290772907829079290802908129082290832908429085290862908729088290892909029091290922909329094290952909629097290982909929100291012910229103291042910529106291072910829109291102911129112291132911429115291162911729118291192912029121291222912329124291252912629127291282912929130291312913229133291342913529136291372913829139291402914129142291432914429145291462914729148291492915029151291522915329154291552915629157291582915929160291612916229163291642916529166291672916829169291702917129172291732917429175291762917729178291792918029181291822918329184291852918629187291882918929190291912919229193291942919529196291972919829199292002920129202292032920429205292062920729208292092921029211292122921329214292152921629217292182921929220292212922229223292242922529226292272922829229292302923129232292332923429235292362923729238292392924029241292422924329244292452924629247292482924929250292512925229253292542925529256292572925829259292602926129262292632926429265292662926729268292692927029271292722927329274292752927629277292782927929280292812928229283292842928529286292872928829289292902929129292292932929429295292962929729298292992930029301293022930329304293052930629307293082930929310293112931229313293142931529316293172931829319293202932129322293232932429325293262932729328293292933029331293322933329334293352933629337293382933929340293412934229343293442934529346293472934829349293502935129352293532935429355293562935729358293592936029361293622936329364293652936629367293682936929370293712937229373293742937529376293772937829379293802938129382293832938429385293862938729388293892939029391293922939329394293952939629397293982939929400294012940229403294042940529406294072940829409294102941129412294132941429415294162941729418294192942029421294222942329424294252942629427294282942929430294312943229433294342943529436294372943829439294402944129442294432944429445294462944729448294492945029451294522945329454294552945629457294582945929460294612946229463294642946529466294672946829469294702947129472294732947429475294762947729478294792948029481294822948329484294852948629487294882948929490294912949229493294942949529496294972949829499295002950129502295032950429505295062950729508295092951029511295122951329514295152951629517295182951929520295212952229523295242952529526295272952829529295302953129532295332953429535295362953729538295392954029541295422954329544295452954629547295482954929550295512955229553295542955529556295572955829559295602956129562295632956429565295662956729568295692957029571295722957329574295752957629577295782957929580295812958229583295842958529586295872958829589295902959129592295932959429595295962959729598295992960029601296022960329604296052960629607296082960929610296112961229613296142961529616296172961829619296202962129622296232962429625296262962729628296292963029631296322963329634296352963629637296382963929640296412964229643296442964529646296472964829649296502965129652296532965429655296562965729658296592966029661296622966329664296652966629667296682966929670296712967229673296742967529676296772967829679296802968129682296832968429685296862968729688296892969029691296922969329694296952969629697296982969929700297012970229703297042970529706297072970829709297102971129712297132971429715297162971729718297192972029721297222972329724297252972629727297282972929730297312973229733297342973529736297372973829739297402974129742297432974429745297462974729748297492975029751297522975329754297552975629757297582975929760297612976229763297642976529766297672976829769297702977129772297732977429775297762977729778297792978029781297822978329784297852978629787297882978929790297912979229793297942979529796297972979829799298002980129802298032980429805298062980729808298092981029811298122981329814298152981629817298182981929820298212982229823298242982529826298272982829829298302983129832298332983429835298362983729838298392984029841298422984329844298452984629847298482984929850298512985229853298542985529856298572985829859298602986129862298632986429865298662986729868298692987029871298722987329874298752987629877298782987929880298812988229883298842988529886298872988829889298902989129892298932989429895298962989729898298992990029901299022990329904299052990629907299082990929910299112991229913299142991529916299172991829919299202992129922299232992429925299262992729928299292993029931299322993329934299352993629937299382993929940299412994229943299442994529946299472994829949299502995129952299532995429955299562995729958299592996029961299622996329964299652996629967299682996929970299712997229973299742997529976299772997829979299802998129982299832998429985299862998729988299892999029991299922999329994299952999629997299982999930000300013000230003300043000530006300073000830009300103001130012300133001430015300163001730018300193002030021300223002330024300253002630027300283002930030300313003230033300343003530036300373003830039300403004130042300433004430045300463004730048300493005030051300523005330054300553005630057300583005930060300613006230063300643006530066300673006830069300703007130072300733007430075300763007730078300793008030081300823008330084300853008630087300883008930090300913009230093300943009530096300973009830099301003010130102301033010430105301063010730108301093011030111301123011330114301153011630117301183011930120301213012230123301243012530126301273012830129301303013130132301333013430135301363013730138301393014030141301423014330144301453014630147301483014930150301513015230153301543015530156301573015830159301603016130162301633016430165301663016730168301693017030171301723017330174301753017630177301783017930180301813018230183301843018530186301873018830189301903019130192301933019430195301963019730198301993020030201302023020330204302053020630207302083020930210302113021230213302143021530216302173021830219302203022130222302233022430225302263022730228302293023030231302323023330234302353023630237302383023930240302413024230243302443024530246302473024830249302503025130252302533025430255302563025730258302593026030261302623026330264302653026630267302683026930270302713027230273302743027530276302773027830279302803028130282302833028430285302863028730288302893029030291302923029330294302953029630297302983029930300303013030230303303043030530306303073030830309303103031130312303133031430315303163031730318303193032030321303223032330324303253032630327303283032930330303313033230333303343033530336303373033830339303403034130342303433034430345303463034730348303493035030351303523035330354303553035630357303583035930360303613036230363303643036530366303673036830369303703037130372303733037430375303763037730378303793038030381303823038330384303853038630387303883038930390303913039230393303943039530396303973039830399304003040130402304033040430405304063040730408304093041030411304123041330414304153041630417304183041930420304213042230423304243042530426304273042830429304303043130432304333043430435304363043730438304393044030441304423044330444304453044630447304483044930450304513045230453304543045530456304573045830459304603046130462304633046430465304663046730468304693047030471304723047330474304753047630477304783047930480304813048230483304843048530486304873048830489304903049130492304933049430495304963049730498304993050030501305023050330504305053050630507305083050930510305113051230513305143051530516305173051830519305203052130522305233052430525305263052730528305293053030531305323053330534305353053630537305383053930540305413054230543305443054530546305473054830549305503055130552305533055430555305563055730558305593056030561305623056330564305653056630567305683056930570305713057230573305743057530576305773057830579305803058130582305833058430585305863058730588305893059030591305923059330594305953059630597305983059930600306013060230603306043060530606306073060830609306103061130612306133061430615306163061730618306193062030621306223062330624306253062630627306283062930630306313063230633306343063530636306373063830639306403064130642306433064430645306463064730648306493065030651306523065330654306553065630657306583065930660306613066230663306643066530666306673066830669306703067130672306733067430675306763067730678306793068030681306823068330684306853068630687306883068930690306913069230693306943069530696306973069830699307003070130702307033070430705307063070730708307093071030711307123071330714307153071630717307183071930720307213072230723307243072530726307273072830729307303073130732307333073430735307363073730738307393074030741307423074330744307453074630747307483074930750307513075230753307543075530756307573075830759307603076130762307633076430765307663076730768307693077030771307723077330774307753077630777307783077930780307813078230783307843078530786307873078830789307903079130792307933079430795307963079730798307993080030801308023080330804308053080630807308083080930810308113081230813308143081530816308173081830819308203082130822308233082430825308263082730828308293083030831308323083330834308353083630837308383083930840308413084230843308443084530846308473084830849308503085130852308533085430855308563085730858308593086030861308623086330864308653086630867308683086930870308713087230873308743087530876308773087830879308803088130882308833088430885308863088730888308893089030891308923089330894308953089630897308983089930900309013090230903309043090530906309073090830909309103091130912309133091430915309163091730918309193092030921309223092330924309253092630927309283092930930309313093230933309343093530936309373093830939309403094130942309433094430945309463094730948309493095030951309523095330954309553095630957309583095930960309613096230963309643096530966309673096830969309703097130972309733097430975309763097730978309793098030981309823098330984309853098630987309883098930990309913099230993309943099530996309973099830999310003100131002310033100431005310063100731008310093101031011310123101331014310153101631017310183101931020310213102231023310243102531026310273102831029310303103131032310333103431035310363103731038310393104031041310423104331044310453104631047310483104931050310513105231053310543105531056310573105831059310603106131062310633106431065310663106731068310693107031071310723107331074310753107631077310783107931080310813108231083310843108531086310873108831089310903109131092310933109431095310963109731098310993110031101311023110331104311053110631107311083110931110311113111231113311143111531116311173111831119311203112131122311233112431125311263112731128311293113031131311323113331134311353113631137311383113931140311413114231143311443114531146311473114831149311503115131152311533115431155311563115731158311593116031161311623116331164311653116631167311683116931170311713117231173311743117531176311773117831179311803118131182311833118431185311863118731188311893119031191311923119331194311953119631197311983119931200312013120231203312043120531206312073120831209312103121131212312133121431215312163121731218312193122031221312223122331224312253122631227312283122931230312313123231233312343123531236312373123831239312403124131242312433124431245312463124731248312493125031251312523125331254312553125631257312583125931260312613126231263312643126531266312673126831269312703127131272312733127431275312763127731278312793128031281312823128331284312853128631287312883128931290312913129231293312943129531296312973129831299313003130131302313033130431305313063130731308313093131031311313123131331314313153131631317313183131931320313213132231323313243132531326313273132831329313303133131332313333133431335313363133731338313393134031341313423134331344313453134631347313483134931350313513135231353313543135531356313573135831359313603136131362313633136431365313663136731368313693137031371313723137331374313753137631377313783137931380313813138231383313843138531386313873138831389313903139131392313933139431395313963139731398313993140031401314023140331404314053140631407314083140931410314113141231413314143141531416314173141831419314203142131422314233142431425314263142731428314293143031431314323143331434314353143631437314383143931440314413144231443314443144531446314473144831449314503145131452314533145431455314563145731458314593146031461314623146331464314653146631467314683146931470314713147231473314743147531476314773147831479314803148131482314833148431485314863148731488314893149031491314923149331494314953149631497314983149931500315013150231503315043150531506315073150831509315103151131512315133151431515315163151731518315193152031521315223152331524315253152631527315283152931530315313153231533315343153531536315373153831539315403154131542315433154431545315463154731548315493155031551315523155331554315553155631557315583155931560315613156231563315643156531566315673156831569315703157131572315733157431575315763157731578315793158031581315823158331584315853158631587315883158931590315913159231593315943159531596315973159831599316003160131602316033160431605316063160731608316093161031611316123161331614316153161631617316183161931620316213162231623316243162531626316273162831629316303163131632316333163431635316363163731638316393164031641316423164331644316453164631647316483164931650316513165231653316543165531656316573165831659316603166131662316633166431665316663166731668316693167031671316723167331674316753167631677316783167931680316813168231683316843168531686316873168831689316903169131692316933169431695316963169731698316993170031701317023170331704317053170631707317083170931710317113171231713317143171531716317173171831719317203172131722317233172431725317263172731728317293173031731317323173331734317353173631737317383173931740317413174231743317443174531746317473174831749317503175131752317533175431755317563175731758317593176031761317623176331764317653176631767317683176931770317713177231773317743177531776317773177831779317803178131782317833178431785317863178731788317893179031791317923179331794317953179631797317983179931800318013180231803318043180531806318073180831809318103181131812318133181431815318163181731818318193182031821318223182331824318253182631827318283182931830318313183231833318343183531836318373183831839318403184131842318433184431845318463184731848318493185031851318523185331854318553185631857318583185931860318613186231863318643186531866318673186831869318703187131872318733187431875318763187731878318793188031881318823188331884318853188631887318883188931890318913189231893318943189531896318973189831899319003190131902319033190431905319063190731908319093191031911319123191331914319153191631917319183191931920319213192231923319243192531926319273192831929319303193131932319333193431935319363193731938319393194031941319423194331944319453194631947319483194931950319513195231953319543195531956319573195831959319603196131962319633196431965319663196731968319693197031971319723197331974319753197631977319783197931980319813198231983319843198531986319873198831989319903199131992319933199431995319963199731998319993200032001320023200332004320053200632007320083200932010320113201232013320143201532016320173201832019320203202132022320233202432025320263202732028320293203032031320323203332034320353203632037320383203932040320413204232043320443204532046320473204832049320503205132052320533205432055320563205732058320593206032061320623206332064320653206632067320683206932070320713207232073320743207532076320773207832079320803208132082320833208432085320863208732088320893209032091320923209332094320953209632097320983209932100321013210232103321043210532106321073210832109321103211132112321133211432115321163211732118321193212032121321223212332124321253212632127321283212932130321313213232133321343213532136321373213832139321403214132142321433214432145321463214732148321493215032151321523215332154321553215632157321583215932160321613216232163321643216532166321673216832169321703217132172321733217432175321763217732178321793218032181321823218332184321853218632187321883218932190321913219232193321943219532196321973219832199322003220132202322033220432205322063220732208322093221032211322123221332214322153221632217322183221932220322213222232223322243222532226322273222832229322303223132232322333223432235322363223732238322393224032241322423224332244322453224632247322483224932250322513225232253322543225532256322573225832259322603226132262322633226432265322663226732268322693227032271322723227332274322753227632277322783227932280322813228232283322843228532286322873228832289322903229132292322933229432295322963229732298322993230032301323023230332304323053230632307323083230932310323113231232313323143231532316323173231832319323203232132322323233232432325323263232732328323293233032331323323233332334323353233632337323383233932340323413234232343323443234532346323473234832349323503235132352323533235432355323563235732358323593236032361323623236332364323653236632367323683236932370323713237232373323743237532376323773237832379323803238132382323833238432385323863238732388323893239032391323923239332394323953239632397323983239932400324013240232403324043240532406324073240832409324103241132412324133241432415324163241732418324193242032421324223242332424324253242632427324283242932430324313243232433324343243532436324373243832439324403244132442324433244432445324463244732448324493245032451324523245332454324553245632457324583245932460324613246232463324643246532466324673246832469324703247132472324733247432475324763247732478324793248032481324823248332484324853248632487324883248932490324913249232493324943249532496324973249832499325003250132502325033250432505325063250732508325093251032511325123251332514325153251632517325183251932520325213252232523325243252532526325273252832529325303253132532325333253432535325363253732538325393254032541325423254332544325453254632547325483254932550325513255232553325543255532556325573255832559325603256132562325633256432565325663256732568325693257032571325723257332574325753257632577325783257932580325813258232583325843258532586325873258832589325903259132592325933259432595325963259732598325993260032601326023260332604326053260632607326083260932610326113261232613326143261532616326173261832619326203262132622326233262432625326263262732628326293263032631326323263332634326353263632637326383263932640326413264232643326443264532646326473264832649326503265132652326533265432655326563265732658326593266032661326623266332664326653266632667326683266932670326713267232673326743267532676326773267832679326803268132682326833268432685326863268732688326893269032691326923269332694326953269632697326983269932700327013270232703327043270532706327073270832709327103271132712327133271432715327163271732718327193272032721327223272332724327253272632727327283272932730327313273232733327343273532736327373273832739327403274132742327433274432745327463274732748327493275032751327523275332754327553275632757327583275932760327613276232763327643276532766327673276832769327703277132772327733277432775327763277732778327793278032781327823278332784327853278632787327883278932790327913279232793327943279532796327973279832799328003280132802328033280432805328063280732808328093281032811328123281332814328153281632817328183281932820328213282232823328243282532826328273282832829328303283132832328333283432835328363283732838328393284032841328423284332844328453284632847328483284932850328513285232853328543285532856328573285832859328603286132862328633286432865328663286732868328693287032871328723287332874328753287632877328783287932880328813288232883328843288532886328873288832889328903289132892328933289432895328963289732898328993290032901329023290332904329053290632907329083290932910329113291232913329143291532916329173291832919329203292132922329233292432925329263292732928329293293032931329323293332934329353293632937329383293932940329413294232943329443294532946329473294832949329503295132952329533295432955329563295732958329593296032961329623296332964329653296632967329683296932970329713297232973329743297532976329773297832979329803298132982329833298432985329863298732988329893299032991329923299332994329953299632997329983299933000330013300233003330043300533006330073300833009330103301133012330133301433015330163301733018330193302033021330223302333024330253302633027330283302933030330313303233033330343303533036330373303833039330403304133042330433304433045330463304733048330493305033051330523305333054330553305633057330583305933060330613306233063330643306533066330673306833069330703307133072330733307433075330763307733078330793308033081330823308333084330853308633087330883308933090330913309233093330943309533096330973309833099331003310133102331033310433105331063310733108331093311033111331123311333114331153311633117331183311933120331213312233123331243312533126331273312833129331303313133132331333313433135331363313733138331393314033141331423314333144331453314633147331483314933150331513315233153331543315533156331573315833159331603316133162331633316433165331663316733168331693317033171331723317333174331753317633177331783317933180331813318233183331843318533186331873318833189331903319133192331933319433195331963319733198331993320033201332023320333204332053320633207332083320933210332113321233213332143321533216332173321833219332203322133222332233322433225332263322733228332293323033231332323323333234332353323633237332383323933240332413324233243332443324533246332473324833249332503325133252332533325433255332563325733258332593326033261332623326333264332653326633267332683326933270332713327233273332743327533276332773327833279332803328133282332833328433285332863328733288332893329033291332923329333294332953329633297332983329933300333013330233303333043330533306333073330833309333103331133312333133331433315333163331733318333193332033321333223332333324333253332633327333283332933330333313333233333333343333533336333373333833339333403334133342333433334433345333463334733348333493335033351333523335333354333553335633357333583335933360333613336233363333643336533366333673336833369333703337133372333733337433375333763337733378333793338033381333823338333384333853338633387333883338933390333913339233393333943339533396333973339833399334003340133402334033340433405334063340733408334093341033411334123341333414334153341633417334183341933420334213342233423334243342533426334273342833429334303343133432334333343433435334363343733438334393344033441334423344333444334453344633447334483344933450334513345233453334543345533456334573345833459334603346133462334633346433465334663346733468334693347033471334723347333474334753347633477334783347933480334813348233483334843348533486334873348833489334903349133492334933349433495334963349733498334993350033501335023350333504335053350633507335083350933510335113351233513335143351533516335173351833519335203352133522335233352433525335263352733528335293353033531335323353333534335353353633537335383353933540335413354233543335443354533546335473354833549335503355133552335533355433555335563355733558335593356033561335623356333564335653356633567335683356933570335713357233573335743357533576335773357833579335803358133582335833358433585335863358733588335893359033591335923359333594335953359633597335983359933600336013360233603336043360533606336073360833609336103361133612336133361433615336163361733618336193362033621336223362333624336253362633627336283362933630336313363233633336343363533636336373363833639336403364133642336433364433645336463364733648336493365033651336523365333654336553365633657336583365933660336613366233663336643366533666336673366833669336703367133672336733367433675336763367733678336793368033681336823368333684336853368633687336883368933690336913369233693336943369533696336973369833699337003370133702337033370433705337063370733708337093371033711337123371333714337153371633717337183371933720337213372233723337243372533726337273372833729337303373133732337333373433735337363373733738337393374033741337423374333744337453374633747337483374933750337513375233753337543375533756337573375833759337603376133762337633376433765337663376733768337693377033771337723377333774337753377633777337783377933780337813378233783337843378533786337873378833789337903379133792337933379433795337963379733798337993380033801338023380333804338053380633807338083380933810338113381233813338143381533816338173381833819338203382133822338233382433825338263382733828338293383033831338323383333834338353383633837338383383933840338413384233843338443384533846338473384833849338503385133852338533385433855338563385733858338593386033861338623386333864338653386633867338683386933870338713387233873338743387533876338773387833879338803388133882338833388433885338863388733888338893389033891338923389333894338953389633897338983389933900339013390233903339043390533906339073390833909339103391133912339133391433915339163391733918339193392033921339223392333924339253392633927339283392933930339313393233933339343393533936339373393833939339403394133942339433394433945339463394733948339493395033951339523395333954339553395633957339583395933960339613396233963339643396533966339673396833969339703397133972339733397433975339763397733978339793398033981339823398333984339853398633987339883398933990339913399233993339943399533996339973399833999340003400134002340033400434005340063400734008340093401034011340123401334014340153401634017340183401934020340213402234023340243402534026340273402834029340303403134032340333403434035340363403734038340393404034041340423404334044340453404634047340483404934050340513405234053340543405534056340573405834059340603406134062340633406434065340663406734068340693407034071340723407334074340753407634077340783407934080340813408234083340843408534086340873408834089340903409134092340933409434095340963409734098340993410034101341023410334104341053410634107341083410934110341113411234113341143411534116341173411834119341203412134122341233412434125341263412734128341293413034131341323413334134341353413634137341383413934140341413414234143341443414534146341473414834149341503415134152341533415434155341563415734158341593416034161341623416334164341653416634167341683416934170341713417234173341743417534176341773417834179341803418134182341833418434185341863418734188341893419034191341923419334194341953419634197341983419934200342013420234203342043420534206342073420834209342103421134212342133421434215342163421734218342193422034221342223422334224342253422634227342283422934230342313423234233342343423534236342373423834239342403424134242342433424434245342463424734248342493425034251342523425334254342553425634257342583425934260342613426234263342643426534266342673426834269342703427134272342733427434275342763427734278342793428034281342823428334284342853428634287342883428934290342913429234293342943429534296342973429834299343003430134302343033430434305343063430734308343093431034311343123431334314343153431634317343183431934320343213432234323343243432534326343273432834329343303433134332343333433434335343363433734338343393434034341343423434334344343453434634347343483434934350343513435234353343543435534356343573435834359343603436134362343633436434365343663436734368343693437034371343723437334374343753437634377343783437934380343813438234383343843438534386343873438834389343903439134392343933439434395343963439734398343993440034401344023440334404344053440634407344083440934410344113441234413344143441534416344173441834419344203442134422344233442434425344263442734428344293443034431344323443334434344353443634437344383443934440344413444234443344443444534446344473444834449344503445134452344533445434455344563445734458344593446034461344623446334464344653446634467344683446934470344713447234473344743447534476344773447834479344803448134482344833448434485344863448734488344893449034491344923449334494344953449634497344983449934500345013450234503345043450534506345073450834509345103451134512345133451434515345163451734518345193452034521345223452334524345253452634527345283452934530345313453234533345343453534536345373453834539345403454134542345433454434545345463454734548345493455034551345523455334554345553455634557345583455934560345613456234563345643456534566345673456834569345703457134572345733457434575345763457734578345793458034581345823458334584345853458634587345883458934590345913459234593345943459534596345973459834599346003460134602346033460434605346063460734608346093461034611346123461334614346153461634617346183461934620346213462234623346243462534626346273462834629346303463134632346333463434635346363463734638346393464034641346423464334644346453464634647346483464934650346513465234653346543465534656346573465834659346603466134662346633466434665346663466734668346693467034671346723467334674346753467634677346783467934680346813468234683346843468534686346873468834689346903469134692346933469434695346963469734698346993470034701347023470334704347053470634707347083470934710347113471234713347143471534716347173471834719347203472134722347233472434725347263472734728347293473034731347323473334734347353473634737347383473934740347413474234743347443474534746347473474834749347503475134752347533475434755347563475734758347593476034761347623476334764347653476634767347683476934770347713477234773347743477534776347773477834779347803478134782347833478434785347863478734788347893479034791347923479334794347953479634797347983479934800348013480234803348043480534806348073480834809348103481134812348133481434815348163481734818348193482034821348223482334824348253482634827348283482934830348313483234833348343483534836348373483834839348403484134842348433484434845348463484734848348493485034851348523485334854348553485634857348583485934860348613486234863348643486534866348673486834869348703487134872348733487434875348763487734878348793488034881348823488334884348853488634887348883488934890348913489234893348943489534896348973489834899349003490134902349033490434905349063490734908349093491034911349123491334914349153491634917349183491934920349213492234923349243492534926349273492834929349303493134932349333493434935349363493734938349393494034941349423494334944349453494634947349483494934950349513495234953349543495534956349573495834959349603496134962349633496434965349663496734968349693497034971349723497334974349753497634977349783497934980349813498234983349843498534986349873498834989349903499134992349933499434995349963499734998349993500035001350023500335004350053500635007350083500935010350113501235013350143501535016350173501835019350203502135022350233502435025350263502735028350293503035031350323503335034350353503635037350383503935040350413504235043350443504535046350473504835049350503505135052350533505435055350563505735058350593506035061350623506335064350653506635067350683506935070350713507235073350743507535076350773507835079350803508135082350833508435085350863508735088350893509035091350923509335094350953509635097350983509935100351013510235103351043510535106351073510835109351103511135112351133511435115351163511735118351193512035121351223512335124351253512635127351283512935130351313513235133351343513535136351373513835139351403514135142351433514435145351463514735148351493515035151351523515335154351553515635157351583515935160351613516235163351643516535166351673516835169351703517135172351733517435175351763517735178351793518035181351823518335184351853518635187351883518935190351913519235193351943519535196351973519835199352003520135202352033520435205352063520735208352093521035211352123521335214352153521635217352183521935220352213522235223352243522535226352273522835229352303523135232352333523435235352363523735238352393524035241352423524335244352453524635247352483524935250352513525235253352543525535256352573525835259352603526135262352633526435265352663526735268352693527035271352723527335274352753527635277352783527935280352813528235283352843528535286352873528835289352903529135292352933529435295352963529735298352993530035301353023530335304353053530635307353083530935310353113531235313353143531535316353173531835319353203532135322353233532435325353263532735328353293533035331353323533335334353353533635337353383533935340353413534235343353443534535346353473534835349353503535135352353533535435355353563535735358353593536035361353623536335364353653536635367353683536935370353713537235373353743537535376353773537835379353803538135382353833538435385353863538735388353893539035391353923539335394353953539635397353983539935400354013540235403354043540535406354073540835409354103541135412354133541435415354163541735418354193542035421354223542335424354253542635427354283542935430354313543235433354343543535436354373543835439354403544135442354433544435445354463544735448354493545035451354523545335454354553545635457354583545935460354613546235463354643546535466354673546835469354703547135472354733547435475354763547735478354793548035481354823548335484354853548635487354883548935490354913549235493354943549535496354973549835499355003550135502355033550435505355063550735508355093551035511355123551335514355153551635517355183551935520355213552235523355243552535526355273552835529355303553135532355333553435535355363553735538355393554035541355423554335544355453554635547355483554935550355513555235553355543555535556355573555835559355603556135562355633556435565355663556735568355693557035571355723557335574355753557635577355783557935580355813558235583355843558535586355873558835589355903559135592355933559435595355963559735598355993560035601356023560335604356053560635607356083560935610356113561235613356143561535616356173561835619356203562135622356233562435625356263562735628 |
- \input texinfo @c -*-texinfo-*-
- @comment %**start of header (This is for running Texinfo on a region.)
- @c smallbook
- @setfilename ../info/calc
- @c [title]
- @settitle GNU Emacs Calc 2.02g Manual
- @setchapternewpage odd
- @dircategory Emacs
- @direntry
- * Calc: (calc). Advanced desk calculator and mathematical tool.
- @end direntry
- @comment %**end of header (This is for running Texinfo on a region.)
- @tex
- % Some special kludges to make TeX formatting prettier.
- % Because makeinfo.c exists, we can't just define new commands.
- % So instead, we take over little-used existing commands.
- %
- % Suggested by Karl Berry <karl@@freefriends.org>
- \gdef\!{\mskip-\thinmuskip}
- % Redefine @cite{text} to act like $text$ in regular TeX.
- % Info will typeset this same as @samp{text}.
- \gdef\goodtex{\tex \let\rm\goodrm \let\t\ttfont \turnoffactive}
- \gdef\goodrm{\fam0\tenrm}
- \gdef\cite{\goodtex$\citexxx}
- \gdef\citexxx#1{#1$\Etex}
- \global\let\oldxrefX=\xrefX
- \gdef\xrefX[#1]{\begingroup\let\cite=\dfn\oldxrefX[#1]\endgroup}
- % Redefine @c{tex-stuff} \n @whatever{info-stuff}.
- \gdef\c{\futurelet\next\mycxxx}
- \gdef\mycxxx{%
- \ifx\next\bgroup \goodtex\let\next\mycxxy
- \else\ifx\next\mindex \let\next\relax
- \else\ifx\next\kindex \let\next\relax
- \else\ifx\next\starindex \let\next\relax \else \let\next\comment
- \fi\fi\fi\fi \next
- }
- \gdef\mycxxy#1#2{#1\Etex\mycxxz}
- \gdef\mycxxz#1{}
- @end tex
- @c Fix some other things specifically for this manual.
- @iftex
- @finalout
- @mathcode`@:=`@: @c Make Calc fractions come out right in math mode
- @tex
- \gdef\coloneq{\mathrel{\mathord:\mathord=}}
- \gdef\beforedisplay{\vskip-10pt}
- \gdef\afterdisplay{\vskip-5pt}
- \gdef\beforedisplayh{\vskip-25pt}
- \gdef\afterdisplayh{\vskip-10pt}
- @end tex
- @newdimen@kyvpos @kyvpos=0pt
- @newdimen@kyhpos @kyhpos=0pt
- @newcount@calcclubpenalty @calcclubpenalty=1000
- @ignore
- @newcount@calcpageno
- @newtoks@calcoldeverypar @calcoldeverypar=@everypar
- @everypar={@calceverypar@the@calcoldeverypar}
- @ifx@turnoffactive@undefinedzzz@def@turnoffactive{}@fi
- @ifx@ninett@undefinedzzz@font@ninett=cmtt9@fi
- @catcode`@\=0 \catcode`\@=11
- \r@ggedbottomtrue
- \catcode`\@=0 @catcode`@\=@active
- @end ignore
- @end iftex
- @ifnottex
- This file documents Calc, the GNU Emacs calculator.
- Copyright (C) 1990, 1991, 2001, 2002 Free Software Foundation, Inc.
- Permission is granted to copy, distribute and/or modify this document
- under the terms of the GNU Free Documentation License, Version 1.1 or
- any later version published by the Free Software Foundation; with the
- Invariant Sections being just ``GNU GENERAL PUBLIC LICENSE'', with the
- Front-Cover texts being ``A GNU Manual,'' and with the Back-Cover
- Texts as in (a) below.
- (a) The FSF's Back-Cover Text is: ``You have freedom to copy and modify
- this GNU Manual, like GNU software. Copies published by the Free
- Software Foundation raise funds for GNU development.''
- @end ifnottex
- @titlepage
- @sp 6
- @center @titlefont{Calc Manual}
- @sp 4
- @center GNU Emacs Calc Version 2.02g
- @c [volume]
- @sp 1
- @center January 2002
- @sp 5
- @center Dave Gillespie
- @center daveg@@synaptics.com
- @page
- @vskip 0pt plus 1filll
- Copyright @copyright{} 1990, 1991, 2001, 2002 Free Software Foundation, Inc.
- Permission is granted to copy, distribute and/or modify this document
- under the terms of the GNU Free Documentation License, Version 1.1 or
- any later version published by the Free Software Foundation; with the
- Invariant Sections being just ``GNU GENERAL PUBLIC LICENSE'', with the
- Front-Cover texts being ``A GNU Manual,'' and with the Back-Cover
- Texts as in (a) below.
- (a) The FSF's Back-Cover Text is: ``You have freedom to copy and modify
- this GNU Manual, like GNU software. Copies published by the Free
- Software Foundation raise funds for GNU development.''
- @end titlepage
- @c [begin]
- @ifinfo
- @node Top, , (dir), (dir)
- @chapter The GNU Emacs Calculator
- @noindent
- @dfn{Calc} is an advanced desk calculator and mathematical tool
- that runs as part of the GNU Emacs environment.
- This manual is divided into three major parts: ``Getting Started,''
- the ``Calc Tutorial,'' and the ``Calc Reference.'' The Tutorial
- introduces all the major aspects of Calculator use in an easy,
- hands-on way. The remainder of the manual is a complete reference to
- the features of the Calculator.
- For help in the Emacs Info system (which you are using to read this
- file), type @kbd{?}. (You can also type @kbd{h} to run through a
- longer Info tutorial.)
- @end ifinfo
- @menu
- * Copying:: How you can copy and share Calc.
- * Getting Started:: General description and overview.
- * Interactive Tutorial::
- * Tutorial:: A step-by-step introduction for beginners.
- * Introduction:: Introduction to the Calc reference manual.
- * Data Types:: Types of objects manipulated by Calc.
- * Stack and Trail:: Manipulating the stack and trail buffers.
- * Mode Settings:: Adjusting display format and other modes.
- * Arithmetic:: Basic arithmetic functions.
- * Scientific Functions:: Transcendentals and other scientific functions.
- * Matrix Functions:: Operations on vectors and matrices.
- * Algebra:: Manipulating expressions algebraically.
- * Units:: Operations on numbers with units.
- * Store and Recall:: Storing and recalling variables.
- * Graphics:: Commands for making graphs of data.
- * Kill and Yank:: Moving data into and out of Calc.
- * Embedded Mode:: Working with formulas embedded in a file.
- * Programming:: Calc as a programmable calculator.
- * Installation:: Installing Calc as a part of GNU Emacs.
- * Reporting Bugs:: How to report bugs and make suggestions.
- * Summary:: Summary of Calc commands and functions.
- * Key Index:: The standard Calc key sequences.
- * Command Index:: The interactive Calc commands.
- * Function Index:: Functions (in algebraic formulas).
- * Concept Index:: General concepts.
- * Variable Index:: Variables used by Calc (both user and internal).
- * Lisp Function Index:: Internal Lisp math functions.
- @end menu
- @node Copying, Getting Started, Top, Top
- @unnumbered GNU GENERAL PUBLIC LICENSE
- @center Version 1, February 1989
- @display
- Copyright @copyright{} 1989 Free Software Foundation, Inc.
- 675 Mass Ave, Cambridge, MA 02139, USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
- @end display
- @unnumberedsec Preamble
- The license agreements of most software companies try to keep users
- at the mercy of those companies. By contrast, our General Public
- License is intended to guarantee your freedom to share and change free
- software---to make sure the software is free for all its users. The
- General Public License applies to the Free Software Foundation's
- software and to any other program whose authors commit to using it.
- You can use it for your programs, too.
- When we speak of free software, we are referring to freedom, not
- price. Specifically, the General Public License is designed to make
- sure that you have the freedom to give away or sell copies of free
- software, that you receive source code or can get it if you want it,
- that you can change the software or use pieces of it in new free
- programs; and that you know you can do these things.
- To protect your rights, we need to make restrictions that forbid
- anyone to deny you these rights or to ask you to surrender the rights.
- These restrictions translate to certain responsibilities for you if you
- distribute copies of the software, or if you modify it.
- For example, if you distribute copies of a such a program, whether
- gratis or for a fee, you must give the recipients all the rights that
- you have. You must make sure that they, too, receive or can get the
- source code. And you must tell them their rights.
- We protect your rights with two steps: (1) copyright the software, and
- (2) offer you this license which gives you legal permission to copy,
- distribute and/or modify the software.
- Also, for each author's protection and ours, we want to make certain
- that everyone understands that there is no warranty for this free
- software. If the software is modified by someone else and passed on, we
- want its recipients to know that what they have is not the original, so
- that any problems introduced by others will not reflect on the original
- authors' reputations.
- The precise terms and conditions for copying, distribution and
- modification follow.
- @iftex
- @unnumberedsec TERMS AND CONDITIONS
- @end iftex
- @ifinfo
- @center TERMS AND CONDITIONS
- @end ifinfo
- @enumerate
- @item
- This License Agreement applies to any program or other work which
- contains a notice placed by the copyright holder saying it may be
- distributed under the terms of this General Public License. The
- ``Program'', below, refers to any such program or work, and a ``work based
- on the Program'' means either the Program or any work containing the
- Program or a portion of it, either verbatim or with modifications. Each
- licensee is addressed as ``you''.
- @item
- You may copy and distribute verbatim copies of the Program's source
- code as you receive it, in any medium, provided that you conspicuously and
- appropriately publish on each copy an appropriate copyright notice and
- disclaimer of warranty; keep intact all the notices that refer to this
- General Public License and to the absence of any warranty; and give any
- other recipients of the Program a copy of this General Public License
- along with the Program. You may charge a fee for the physical act of
- transferring a copy.
- @item
- You may modify your copy or copies of the Program or any portion of
- it, and copy and distribute such modifications under the terms of Paragraph
- 1 above, provided that you also do the following:
- @itemize @bullet
- @item
- cause the modified files to carry prominent notices stating that
- you changed the files and the date of any change; and
- @item
- cause the whole of any work that you distribute or publish, that
- in whole or in part contains the Program or any part thereof, either
- with or without modifications, to be licensed at no charge to all
- third parties under the terms of this General Public License (except
- that you may choose to grant warranty protection to some or all
- third parties, at your option).
- @item
- If the modified program normally reads commands interactively when
- run, you must cause it, when started running for such interactive use
- in the simplest and most usual way, to print or display an
- announcement including an appropriate copyright notice and a notice
- that there is no warranty (or else, saying that you provide a
- warranty) and that users may redistribute the program under these
- conditions, and telling the user how to view a copy of this General
- Public License.
- @item
- You may charge a fee for the physical act of transferring a
- copy, and you may at your option offer warranty protection in
- exchange for a fee.
- @end itemize
- Mere aggregation of another independent work with the Program (or its
- derivative) on a volume of a storage or distribution medium does not bring
- the other work under the scope of these terms.
- @item
- You may copy and distribute the Program (or a portion or derivative of
- it, under Paragraph 2) in object code or executable form under the terms of
- Paragraphs 1 and 2 above provided that you also do one of the following:
- @itemize @bullet
- @item
- accompany it with the complete corresponding machine-readable
- source code, which must be distributed under the terms of
- Paragraphs 1 and 2 above; or,
- @item
- accompany it with a written offer, valid for at least three
- years, to give any third party free (except for a nominal charge
- for the cost of distribution) a complete machine-readable copy of the
- corresponding source code, to be distributed under the terms of
- Paragraphs 1 and 2 above; or,
- @item
- accompany it with the information you received as to where the
- corresponding source code may be obtained. (This alternative is
- allowed only for noncommercial distribution and only if you
- received the program in object code or executable form alone.)
- @end itemize
- Source code for a work means the preferred form of the work for making
- modifications to it. For an executable file, complete source code means
- all the source code for all modules it contains; but, as a special
- exception, it need not include source code for modules which are standard
- libraries that accompany the operating system on which the executable
- file runs, or for standard header files or definitions files that
- accompany that operating system.
- @item
- You may not copy, modify, sublicense, distribute or transfer the
- Program except as expressly provided under this General Public License.
- Any attempt otherwise to copy, modify, sublicense, distribute or transfer
- the Program is void, and will automatically terminate your rights to use
- the Program under this License. However, parties who have received
- copies, or rights to use copies, from you under this General Public
- License will not have their licenses terminated so long as such parties
- remain in full compliance.
- @item
- By copying, distributing or modifying the Program (or any work based
- on the Program) you indicate your acceptance of this license to do so,
- and all its terms and conditions.
- @item
- Each time you redistribute the Program (or any work based on the
- Program), the recipient automatically receives a license from the original
- licensor to copy, distribute or modify the Program subject to these
- terms and conditions. You may not impose any further restrictions on the
- recipients' exercise of the rights granted herein.
- @item
- The Free Software Foundation may publish revised and/or new versions
- of the General Public License from time to time. Such new versions will
- be similar in spirit to the present version, but may differ in detail to
- address new problems or concerns.
- Each version is given a distinguishing version number. If the Program
- specifies a version number of the license which applies to it and ``any
- later version'', you have the option of following the terms and conditions
- either of that version or of any later version published by the Free
- Software Foundation. If the Program does not specify a version number of
- the license, you may choose any version ever published by the Free Software
- Foundation.
- @item
- If you wish to incorporate parts of the Program into other free
- programs whose distribution conditions are different, write to the author
- to ask for permission. For software which is copyrighted by the Free
- Software Foundation, write to the Free Software Foundation; we sometimes
- make exceptions for this. Our decision will be guided by the two goals
- of preserving the free status of all derivatives of our free software and
- of promoting the sharing and reuse of software generally.
- @iftex
- @heading NO WARRANTY
- @end iftex
- @ifinfo
- @center NO WARRANTY
- @end ifinfo
- @item
- BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
- FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
- OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
- PROVIDE THE PROGRAM ``AS IS'' WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
- OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
- TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
- PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
- REPAIR OR CORRECTION.
- @item
- IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL
- ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
- REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
- INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES
- ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT
- LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES
- SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE
- WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN
- ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
- @end enumerate
- @node Getting Started, Tutorial, Copying, Top
- @chapter Getting Started
- @noindent
- This chapter provides a general overview of Calc, the GNU Emacs
- Calculator: What it is, how to start it and how to exit from it,
- and what are the various ways that it can be used.
- @menu
- * What is Calc::
- * About This Manual::
- * Notations Used in This Manual::
- * Using Calc::
- * Demonstration of Calc::
- * History and Acknowledgements::
- @end menu
- @node What is Calc, About This Manual, Getting Started, Getting Started
- @section What is Calc?
- @noindent
- @dfn{Calc} is an advanced calculator and mathematical tool that runs as
- part of the GNU Emacs environment. Very roughly based on the HP-28/48
- series of calculators, its many features include:
- @itemize @bullet
- @item
- Choice of algebraic or RPN (stack-based) entry of calculations.
- @item
- Arbitrary precision integers and floating-point numbers.
- @item
- Arithmetic on rational numbers, complex numbers (rectangular and polar),
- error forms with standard deviations, open and closed intervals, vectors
- and matrices, dates and times, infinities, sets, quantities with units,
- and algebraic formulas.
- @item
- Mathematical operations such as logarithms and trigonometric functions.
- @item
- Programmer's features (bitwise operations, non-decimal numbers).
- @item
- Financial functions such as future value and internal rate of return.
- @item
- Number theoretical features such as prime factorization and arithmetic
- modulo @var{m} for any @var{m}.
- @item
- Algebraic manipulation features, including symbolic calculus.
- @item
- Moving data to and from regular editing buffers.
- @item
- ``Embedded mode'' for manipulating Calc formulas and data directly
- inside any editing buffer.
- @item
- Graphics using GNUPLOT, a versatile (and free) plotting program.
- @item
- Easy programming using keyboard macros, algebraic formulas,
- algebraic rewrite rules, or extended Emacs Lisp.
- @end itemize
- Calc tries to include a little something for everyone; as a result it is
- large and might be intimidating to the first-time user. If you plan to
- use Calc only as a traditional desk calculator, all you really need to
- read is the ``Getting Started'' chapter of this manual and possibly the
- first few sections of the tutorial. As you become more comfortable with
- the program you can learn its additional features. In terms of efficiency,
- scope and depth, Calc cannot replace a powerful tool like Mathematica.
- But Calc has the advantages of convenience, portability, and availability
- of the source code. And, of course, it's free!
- @node About This Manual, Notations Used in This Manual, What is Calc, Getting Started
- @section About This Manual
- @noindent
- This document serves as a complete description of the GNU Emacs
- Calculator. It works both as an introduction for novices, and as
- a reference for experienced users. While it helps to have some
- experience with GNU Emacs in order to get the most out of Calc,
- this manual ought to be readable even if you don't know or use Emacs
- regularly.
- @ifinfo
- The manual is divided into three major parts:@: the ``Getting
- Started'' chapter you are reading now, the Calc tutorial (chapter 2),
- and the Calc reference manual (the remaining chapters and appendices).
- @end ifinfo
- @iftex
- The manual is divided into three major parts:@: the ``Getting
- Started'' chapter you are reading now, the Calc tutorial (chapter 2),
- and the Calc reference manual (the remaining chapters and appendices).
- @c [when-split]
- @c This manual has been printed in two volumes, the @dfn{Tutorial} and the
- @c @dfn{Reference}. Both volumes include a copy of the ``Getting Started''
- @c chapter.
- @end iftex
- If you are in a hurry to use Calc, there is a brief ``demonstration''
- below which illustrates the major features of Calc in just a couple of
- pages. If you don't have time to go through the full tutorial, this
- will show you everything you need to know to begin.
- @xref{Demonstration of Calc}.
- The tutorial chapter walks you through the various parts of Calc
- with lots of hands-on examples and explanations. If you are new
- to Calc and you have some time, try going through at least the
- beginning of the tutorial. The tutorial includes about 70 exercises
- with answers. These exercises give you some guided practice with
- Calc, as well as pointing out some interesting and unusual ways
- to use its features.
- The reference section discusses Calc in complete depth. You can read
- the reference from start to finish if you want to learn every aspect
- of Calc. Or, you can look in the table of contents or the Concept
- Index to find the parts of the manual that discuss the things you
- need to know.
- @cindex Marginal notes
- Every Calc keyboard command is listed in the Calc Summary, and also
- in the Key Index. Algebraic functions, @kbd{M-x} commands, and
- variables also have their own indices. @c{Each}
- @asis{In the printed manual, each}
- paragraph that is referenced in the Key or Function Index is marked
- in the margin with its index entry.
- @c [fix-ref Help Commands]
- You can access this manual on-line at any time within Calc by
- pressing the @kbd{h i} key sequence. Outside of the Calc window,
- you can press @kbd{M-# i} to read the manual on-line. Also, you
- can jump directly to the Tutorial by pressing @kbd{h t} or @kbd{M-# t},
- or to the Summary by pressing @kbd{h s} or @kbd{M-# s}. Within Calc,
- you can also go to the part of the manual describing any Calc key,
- function, or variable using @w{@kbd{h k}}, @kbd{h f}, or @kbd{h v},
- respectively. @xref{Help Commands}.
- Printed copies of this manual are also available from the Free Software
- Foundation.
- @node Notations Used in This Manual, Demonstration of Calc, About This Manual, Getting Started
- @section Notations Used in This Manual
- @noindent
- This section describes the various notations that are used
- throughout the Calc manual.
- In keystroke sequences, uppercase letters mean you must hold down
- the shift key while typing the letter. Keys pressed with Control
- held down are shown as @kbd{C-x}. Keys pressed with Meta held down
- are shown as @kbd{M-x}. Other notations are @key{RET} for the
- Return key, @key{SPC} for the space bar, @key{TAB} for the Tab key,
- @key{DEL} for the Delete key, and @key{LFD} for the Line-Feed key.
- (If you don't have the @key{LFD} or @key{TAB} keys on your keyboard,
- the @kbd{C-j} and @kbd{C-i} keys are equivalent to them, respectively.
- If you don't have a Meta key, look for Alt or Extend Char. You can
- also press @key{ESC} or @key{C-[} first to get the same effect, so
- that @kbd{M-x}, @kbd{@key{ESC} x}, and @kbd{C-[ x} are all equivalent.)
- Sometimes the @key{RET} key is not shown when it is ``obvious''
- that you must press @key{RET} to proceed. For example, the @key{RET}
- is usually omitted in key sequences like @kbd{M-x calc-keypad @key{RET}}.
- Commands are generally shown like this: @kbd{p} (@code{calc-precision})
- or @kbd{M-# k} (@code{calc-keypad}). This means that the command is
- normally used by pressing the @kbd{p} key or @kbd{M-# k} key sequence,
- but it also has the full-name equivalent shown, e.g., @kbd{M-x calc-precision}.
- Commands that correspond to functions in algebraic notation
- are written: @kbd{C} (@code{calc-cos}) [@code{cos}]. This means
- the @kbd{C} key is equivalent to @kbd{M-x calc-cos}, and that
- the corresponding function in an algebraic-style formula would
- be @samp{cos(@var{x})}.
- A few commands don't have key equivalents: @code{calc-sincos}
- [@code{sincos}].@refill
- @node Demonstration of Calc, Using Calc, Notations Used in This Manual, Getting Started
- @section A Demonstration of Calc
- @noindent
- @cindex Demonstration of Calc
- This section will show some typical small problems being solved with
- Calc. The focus is more on demonstration than explanation, but
- everything you see here will be covered more thoroughly in the
- Tutorial.
- To begin, start Emacs if necessary (usually the command @code{emacs}
- does this), and type @kbd{M-# c} (or @kbd{@key{ESC} # c}) to start the
- Calculator. (@xref{Starting Calc}, if this doesn't work for you.)
- Be sure to type all the sample input exactly, especially noting the
- difference between lower-case and upper-case letters. Remember,
- @key{RET}, @key{TAB}, @key{DEL}, and @key{SPC} are the Return, Tab,
- Delete, and Space keys.
- @strong{RPN calculation.} In RPN, you type the input number(s) first,
- then the command to operate on the numbers.
- @noindent
- Type @kbd{2 @key{RET} 3 + Q} to compute @c{$\sqrt{2+3} = 2.2360679775$}
- @asis{the square root of 2+3, which is 2.2360679775}.
- @noindent
- Type @kbd{P 2 ^} to compute @c{$\pi^2 = 9.86960440109$}
- @asis{the value of `pi' squared, 9.86960440109}.
- @noindent
- Type @key{TAB} to exchange the order of these two results.
- @noindent
- Type @kbd{- I H S} to subtract these results and compute the Inverse
- Hyperbolic sine of the difference, 2.72996136574.
- @noindent
- Type @key{DEL} to erase this result.
- @strong{Algebraic calculation.} You can also enter calculations using
- conventional ``algebraic'' notation. To enter an algebraic formula,
- use the apostrophe key.
- @noindent
- Type @kbd{' sqrt(2+3) @key{RET}} to compute @c{$\sqrt{2+3}$}
- @asis{the square root of 2+3}.
- @noindent
- Type @kbd{' pi^2 @key{RET}} to enter @c{$\pi^2$}
- @asis{`pi' squared}. To evaluate this symbolic
- formula as a number, type @kbd{=}.
- @noindent
- Type @kbd{' arcsinh($ - $$) @key{RET}} to subtract the second-most-recent
- result from the most-recent and compute the Inverse Hyperbolic sine.
- @strong{Keypad mode.} If you are using the X window system, press
- @w{@kbd{M-# k}} to get Keypad mode. (If you don't use X, skip to
- the next section.)
- @noindent
- Click on the @key{2}, @key{ENTER}, @key{3}, @key{+}, and @key{SQRT}
- ``buttons'' using your left mouse button.
- @noindent
- Click on @key{PI}, @key{2}, and @t{y^x}.
- @noindent
- Click on @key{INV}, then @key{ENTER} to swap the two results.
- @noindent
- Click on @key{-}, @key{INV}, @key{HYP}, and @key{SIN}.
- @noindent
- Click on @key{<-} to erase the result, then click @key{OFF} to turn
- the Keypad Calculator off.
- @strong{Grabbing data.} Type @kbd{M-# x} if necessary to exit Calc.
- Now select the following numbers as an Emacs region: ``Mark'' the
- front of the list by typing @kbd{C-@key{SPC}} or @kbd{C-@@} there,
- then move to the other end of the list. (Either get this list from
- the on-line copy of this manual, accessed by @w{@kbd{M-# i}}, or just
- type these numbers into a scratch file.) Now type @kbd{M-# g} to
- ``grab'' these numbers into Calc.
- @example
- @group
- 1.23 1.97
- 1.6 2
- 1.19 1.08
- @end group
- @end example
- @noindent
- The result @samp{[1.23, 1.97, 1.6, 2, 1.19, 1.08]} is a Calc ``vector.''
- Type @w{@kbd{V R +}} to compute the sum of these numbers.
- @noindent
- Type @kbd{U} to Undo this command, then type @kbd{V R *} to compute
- the product of the numbers.
- @noindent
- You can also grab data as a rectangular matrix. Place the cursor on
- the upper-leftmost @samp{1} and set the mark, then move to just after
- the lower-right @samp{8} and press @kbd{M-# r}.
- @noindent
- Type @kbd{v t} to transpose this @c{$3\times2$}
- @asis{3x2} matrix into a @c{$2\times3$}
- @asis{2x3} matrix. Type
- @w{@kbd{v u}} to unpack the rows into two separate vectors. Now type
- @w{@kbd{V R + @key{TAB} V R +}} to compute the sums of the two original columns.
- (There is also a special grab-and-sum-columns command, @kbd{M-# :}.)
- @strong{Units conversion.} Units are entered algebraically.
- Type @w{@kbd{' 43 mi/hr @key{RET}}} to enter the quantity 43 miles-per-hour.
- Type @w{@kbd{u c km/hr @key{RET}}}. Type @w{@kbd{u c m/s @key{RET}}}.
- @strong{Date arithmetic.} Type @kbd{t N} to get the current date and
- time. Type @kbd{90 +} to find the date 90 days from now. Type
- @kbd{' <25 dec 87> @key{RET}} to enter a date, then @kbd{- 7 /} to see how
- many weeks have passed since then.
- @strong{Algebra.} Algebraic entries can also include formulas
- or equations involving variables. Type @kbd{@w{' [x + y} = a, x y = 1] @key{RET}}
- to enter a pair of equations involving three variables.
- (Note the leading apostrophe in this example; also, note that the space
- between @samp{x y} is required.) Type @w{@kbd{a S x,y @key{RET}}} to solve
- these equations for the variables @cite{x} and @cite{y}.@refill
- @noindent
- Type @kbd{d B} to view the solutions in more readable notation.
- Type @w{@kbd{d C}} to view them in C language notation, and @kbd{d T}
- to view them in the notation for the @TeX{} typesetting system.
- Type @kbd{d N} to return to normal notation.
- @noindent
- Type @kbd{7.5}, then @kbd{s l a @key{RET}} to let @cite{a = 7.5} in these formulas.
- (That's a letter @kbd{l}, not a numeral @kbd{1}.)
- @iftex
- @strong{Help functions.} You can read about any command in the on-line
- manual. Type @kbd{M-# c} to return to Calc after each of these
- commands: @kbd{h k t N} to read about the @kbd{t N} command,
- @kbd{h f sqrt @key{RET}} to read about the @code{sqrt} function, and
- @kbd{h s} to read the Calc summary.
- @end iftex
- @ifinfo
- @strong{Help functions.} You can read about any command in the on-line
- manual. Remember to type the letter @kbd{l}, then @kbd{M-# c}, to
- return here after each of these commands: @w{@kbd{h k t N}} to read
- about the @w{@kbd{t N}} command, @kbd{h f sqrt @key{RET}} to read about the
- @code{sqrt} function, and @kbd{h s} to read the Calc summary.
- @end ifinfo
- Press @key{DEL} repeatedly to remove any leftover results from the stack.
- To exit from Calc, press @kbd{q} or @kbd{M-# c} again.
- @node Using Calc, History and Acknowledgements, Demonstration of Calc, Getting Started
- @section Using Calc
- @noindent
- Calc has several user interfaces that are specialized for
- different kinds of tasks. As well as Calc's standard interface,
- there are Quick Mode, Keypad Mode, and Embedded Mode.
- @c [fix-ref Installation]
- Calc must be @dfn{installed} before it can be used. @xref{Installation},
- for instructions on setting up and installing Calc. We will assume
- you or someone on your system has already installed Calc as described
- there.
- @menu
- * Starting Calc::
- * The Standard Interface::
- * Quick Mode Overview::
- * Keypad Mode Overview::
- * Standalone Operation::
- * Embedded Mode Overview::
- * Other M-# Commands::
- @end menu
- @node Starting Calc, The Standard Interface, Using Calc, Using Calc
- @subsection Starting Calc
- @noindent
- On most systems, you can type @kbd{M-#} to start the Calculator.
- The notation @kbd{M-#} is short for Meta-@kbd{#}. On most
- keyboards this means holding down the Meta (or Alt) and
- Shift keys while typing @kbd{3}.
- @cindex META key
- Once again, if you don't have a Meta key on your keyboard you can type
- @key{ESC} first, then @kbd{#}, to accomplish the same thing. If you
- don't even have an @key{ESC} key, you can fake it by holding down
- Control or @key{CTRL} while typing a left square bracket
- (that's @kbd{C-[} in Emacs notation).@refill
- @kbd{M-#} is a @dfn{prefix key}; when you press it, Emacs waits for
- you to press a second key to complete the command. In this case,
- you will follow @kbd{M-#} with a letter (upper- or lower-case, it
- doesn't matter for @kbd{M-#}) that says which Calc interface you
- want to use.
- To get Calc's standard interface, type @kbd{M-# c}. To get
- Keypad Mode, type @kbd{M-# k}. Type @kbd{M-# ?} to get a brief
- list of the available options, and type a second @kbd{?} to get
- a complete list.
- To ease typing, @kbd{M-# M-#} (or @kbd{M-# #} if that's easier)
- also works to start Calc. It starts the same interface (either
- @kbd{M-# c} or @w{@kbd{M-# k}}) that you last used, selecting the
- @kbd{M-# c} interface by default. (If your installation has
- a special function key set up to act like @kbd{M-#}, hitting that
- function key twice is just like hitting @kbd{M-# M-#}.)
- If @kbd{M-#} doesn't work for you, you can always type explicit
- commands like @kbd{M-x calc} (for the standard user interface) or
- @w{@kbd{M-x calc-keypad}} (for Keypad Mode). First type @kbd{M-x}
- (that's Meta with the letter @kbd{x}), then, at the prompt,
- type the full command (like @kbd{calc-keypad}) and press Return.
- If you type @kbd{M-x calc} and Emacs still doesn't recognize the
- command (it will say @samp{[No match]} when you try to press
- @key{RET}), then Calc has not been properly installed.
- The same commands (like @kbd{M-# c} or @kbd{M-# M-#}) that start
- the Calculator also turn it off if it is already on.
- @node The Standard Interface, Quick Mode Overview, Starting Calc, Using Calc
- @subsection The Standard Calc Interface
- @noindent
- @cindex Standard user interface
- Calc's standard interface acts like a traditional RPN calculator,
- operated by the normal Emacs keyboard. When you type @kbd{M-# c}
- to start the Calculator, the Emacs screen splits into two windows
- with the file you were editing on top and Calc on the bottom.
- @smallexample
- @group
- ...
- --**-Emacs: myfile (Fundamental)----All----------------------
- --- Emacs Calculator Mode --- |Emacs Calc Mode v2.00...
- 2: 17.3 | 17.3
- 1: -5 | 3
- . | 2
- | 4
- | * 8
- | ->-5
- |
- --%%-Calc: 12 Deg (Calculator)----All----- --%%-Emacs: *Calc Trail*
- @end group
- @end smallexample
- In this figure, the mode-line for @file{myfile} has moved up and the
- ``Calculator'' window has appeared below it. As you can see, Calc
- actually makes two windows side-by-side. The lefthand one is
- called the @dfn{stack window} and the righthand one is called the
- @dfn{trail window.} The stack holds the numbers involved in the
- calculation you are currently performing. The trail holds a complete
- record of all calculations you have done. In a desk calculator with
- a printer, the trail corresponds to the paper tape that records what
- you do.
- In this case, the trail shows that four numbers (17.3, 3, 2, and 4)
- were first entered into the Calculator, then the 2 and 4 were
- multiplied to get 8, then the 3 and 8 were subtracted to get @i{-5}.
- (The @samp{>} symbol shows that this was the most recent calculation.)
- The net result is the two numbers 17.3 and @i{-5} sitting on the stack.
- Most Calculator commands deal explicitly with the stack only, but
- there is a set of commands that allow you to search back through
- the trail and retrieve any previous result.
- Calc commands use the digits, letters, and punctuation keys.
- Shifted (i.e., upper-case) letters are different from lowercase
- letters. Some letters are @dfn{prefix} keys that begin two-letter
- commands. For example, @kbd{e} means ``enter exponent'' and shifted
- @kbd{E} means @cite{e^x}. With the @kbd{d} (``display modes'') prefix
- the letter ``e'' takes on very different meanings: @kbd{d e} means
- ``engineering notation'' and @kbd{d E} means ``@dfn{eqn} language mode.''
- There is nothing stopping you from switching out of the Calc
- window and back into your editing window, say by using the Emacs
- @w{@kbd{C-x o}} (@code{other-window}) command. When the cursor is
- inside a regular window, Emacs acts just like normal. When the
- cursor is in the Calc stack or trail windows, keys are interpreted
- as Calc commands.
- When you quit by pressing @kbd{M-# c} a second time, the Calculator
- windows go away but the actual Stack and Trail are not gone, just
- hidden. When you press @kbd{M-# c} once again you will get the
- same stack and trail contents you had when you last used the
- Calculator.
- The Calculator does not remember its state between Emacs sessions.
- Thus if you quit Emacs and start it again, @kbd{M-# c} will give you
- a fresh stack and trail. There is a command (@kbd{m m}) that lets
- you save your favorite mode settings between sessions, though.
- One of the things it saves is which user interface (standard or
- Keypad) you last used; otherwise, a freshly started Emacs will
- always treat @kbd{M-# M-#} the same as @kbd{M-# c}.
- The @kbd{q} key is another equivalent way to turn the Calculator off.
- If you type @kbd{M-# b} first and then @kbd{M-# c}, you get a
- full-screen version of Calc (@code{full-calc}) in which the stack and
- trail windows are still side-by-side but are now as tall as the whole
- Emacs screen. When you press @kbd{q} or @kbd{M-# c} again to quit,
- the file you were editing before reappears. The @kbd{M-# b} key
- switches back and forth between ``big'' full-screen mode and the
- normal partial-screen mode.
- Finally, @kbd{M-# o} (@code{calc-other-window}) is like @kbd{M-# c}
- except that the Calc window is not selected. The buffer you were
- editing before remains selected instead. @kbd{M-# o} is a handy
- way to switch out of Calc momentarily to edit your file; type
- @kbd{M-# c} to switch back into Calc when you are done.
- @node Quick Mode Overview, Keypad Mode Overview, The Standard Interface, Using Calc
- @subsection Quick Mode (Overview)
- @noindent
- @dfn{Quick Mode} is a quick way to use Calc when you don't need the
- full complexity of the stack and trail. To use it, type @kbd{M-# q}
- (@code{quick-calc}) in any regular editing buffer.
- Quick Mode is very simple: It prompts you to type any formula in
- standard algebraic notation (like @samp{4 - 2/3}) and then displays
- the result at the bottom of the Emacs screen (@i{3.33333333333}
- in this case). You are then back in the same editing buffer you
- were in before, ready to continue editing or to type @kbd{M-# q}
- again to do another quick calculation. The result of the calculation
- will also be in the Emacs ``kill ring'' so that a @kbd{C-y} command
- at this point will yank the result into your editing buffer.
- Calc mode settings affect Quick Mode, too, though you will have to
- go into regular Calc (with @kbd{M-# c}) to change the mode settings.
- @c [fix-ref Quick Calculator mode]
- @xref{Quick Calculator}, for further information.
- @node Keypad Mode Overview, Standalone Operation, Quick Mode Overview, Using Calc
- @subsection Keypad Mode (Overview)
- @noindent
- @dfn{Keypad Mode} is a mouse-based interface to the Calculator.
- It is designed for use with the X window system. If you don't
- have X, you will have to operate keypad mode with your arrow
- keys (which is probably more trouble than it's worth). Keypad
- mode is currently not supported under Emacs 19.
- Type @kbd{M-# k} to turn Keypad Mode on or off. Once again you
- get two new windows, this time on the righthand side of the screen
- instead of at the bottom. The upper window is the familiar Calc
- Stack; the lower window is a picture of a typical calculator keypad.
- @tex
- \dimen0=\pagetotal%
- \advance \dimen0 by 24\baselineskip%
- \ifdim \dimen0>\pagegoal \vfill\eject \fi%
- \medskip
- @end tex
- @smallexample
- |--- Emacs Calculator Mode ---
- |2: 17.3
- |1: -5
- | .
- |--%%-Calc: 12 Deg (Calcul
- |----+-----Calc 2.00-----+----1
- |FLR |CEIL|RND |TRNC|CLN2|FLT |
- |----+----+----+----+----+----|
- | LN |EXP | |ABS |IDIV|MOD |
- |----+----+----+----+----+----|
- |SIN |COS |TAN |SQRT|y^x |1/x |
- |----+----+----+----+----+----|
- | ENTER |+/- |EEX |UNDO| <- |
- |-----+---+-+--+--+-+---++----|
- | INV | 7 | 8 | 9 | / |
- |-----+-----+-----+-----+-----|
- | HYP | 4 | 5 | 6 | * |
- |-----+-----+-----+-----+-----|
- |EXEC | 1 | 2 | 3 | - |
- |-----+-----+-----+-----+-----|
- | OFF | 0 | . | PI | + |
- |-----+-----+-----+-----+-----+
- @end smallexample
- Keypad Mode is much easier for beginners to learn, because there
- is no need to memorize lots of obscure key sequences. But not all
- commands in regular Calc are available on the Keypad. You can
- always switch the cursor into the Calc stack window to use
- standard Calc commands if you need. Serious Calc users, though,
- often find they prefer the standard interface over Keypad Mode.
- To operate the Calculator, just click on the ``buttons'' of the
- keypad using your left mouse button. To enter the two numbers
- shown here you would click @w{@kbd{1 7 .@: 3 ENTER 5 +/- ENTER}}; to
- add them together you would then click @kbd{+} (to get 12.3 on
- the stack).
- If you click the right mouse button, the top three rows of the
- keypad change to show other sets of commands, such as advanced
- math functions, vector operations, and operations on binary
- numbers.
- Because Keypad Mode doesn't use the regular keyboard, Calc leaves
- the cursor in your original editing buffer. You can type in
- this buffer in the usual way while also clicking on the Calculator
- keypad. One advantage of Keypad Mode is that you don't need an
- explicit command to switch between editing and calculating.
- If you press @kbd{M-# b} first, you get a full-screen Keypad Mode
- (@code{full-calc-keypad}) with three windows: The keypad in the lower
- left, the stack in the lower right, and the trail on top.
- @c [fix-ref Keypad Mode]
- @xref{Keypad Mode}, for further information.
- @node Standalone Operation, Embedded Mode Overview, Keypad Mode Overview, Using Calc
- @subsection Standalone Operation
- @noindent
- @cindex Standalone Operation
- If you are not in Emacs at the moment but you wish to use Calc,
- you must start Emacs first. If all you want is to run Calc, you
- can give the commands:
- @example
- emacs -f full-calc
- @end example
- @noindent
- or
- @example
- emacs -f full-calc-keypad
- @end example
- @noindent
- which run a full-screen Calculator (as if by @kbd{M-# b M-# c}) or
- a full-screen X-based Calculator (as if by @kbd{M-# b M-# k}).
- In standalone operation, quitting the Calculator (by pressing
- @kbd{q} or clicking on the keypad @key{EXIT} button) quits Emacs
- itself.
- @node Embedded Mode Overview, Other M-# Commands, Standalone Operation, Using Calc
- @subsection Embedded Mode (Overview)
- @noindent
- @dfn{Embedded Mode} is a way to use Calc directly from inside an
- editing buffer. Suppose you have a formula written as part of a
- document like this:
- @smallexample
- @group
- The derivative of
- ln(ln(x))
- is
- @end group
- @end smallexample
- @noindent
- and you wish to have Calc compute and format the derivative for
- you and store this derivative in the buffer automatically. To
- do this with Embedded Mode, first copy the formula down to where
- you want the result to be:
- @smallexample
- @group
- The derivative of
- ln(ln(x))
- is
- ln(ln(x))
- @end group
- @end smallexample
- Now, move the cursor onto this new formula and press @kbd{M-# e}.
- Calc will read the formula (using the surrounding blank lines to
- tell how much text to read), then push this formula (invisibly)
- onto the Calc stack. The cursor will stay on the formula in the
- editing buffer, but the buffer's mode line will change to look
- like the Calc mode line (with mode indicators like @samp{12 Deg}
- and so on). Even though you are still in your editing buffer,
- the keyboard now acts like the Calc keyboard, and any new result
- you get is copied from the stack back into the buffer. To take
- the derivative, you would type @kbd{a d x @key{RET}}.
- @smallexample
- @group
- The derivative of
- ln(ln(x))
- is
- 1 / ln(x) x
- @end group
- @end smallexample
- To make this look nicer, you might want to press @kbd{d =} to center
- the formula, and even @kbd{d B} to use ``big'' display mode.
- @smallexample
- @group
- The derivative of
- ln(ln(x))
- is
- % [calc-mode: justify: center]
- % [calc-mode: language: big]
- 1
- -------
- ln(x) x
- @end group
- @end smallexample
- Calc has added annotations to the file to help it remember the modes
- that were used for this formula. They are formatted like comments
- in the @TeX{} typesetting language, just in case you are using @TeX{}.
- (In this example @TeX{} is not being used, so you might want to move
- these comments up to the top of the file or otherwise put them out
- of the way.)
- As an extra flourish, we can add an equation number using a
- righthand label: Type @kbd{d @} (1) @key{RET}}.
- @smallexample
- @group
- % [calc-mode: justify: center]
- % [calc-mode: language: big]
- % [calc-mode: right-label: " (1)"]
- 1
- ------- (1)
- ln(x) x
- @end group
- @end smallexample
- To leave Embedded Mode, type @kbd{M-# e} again. The mode line
- and keyboard will revert to the way they were before. (If you have
- actually been trying this as you read along, you'll want to press
- @kbd{M-# 0} [with the digit zero] now to reset the modes you changed.)
- The related command @kbd{M-# w} operates on a single word, which
- generally means a single number, inside text. It uses any
- non-numeric characters rather than blank lines to delimit the
- formula it reads. Here's an example of its use:
- @smallexample
- A slope of one-third corresponds to an angle of 1 degrees.
- @end smallexample
- Place the cursor on the @samp{1}, then type @kbd{M-# w} to enable
- Embedded Mode on that number. Now type @kbd{3 /} (to get one-third),
- and @kbd{I T} (the Inverse Tangent converts a slope into an angle),
- then @w{@kbd{M-# w}} again to exit Embedded mode.
- @smallexample
- A slope of one-third corresponds to an angle of 18.4349488229 degrees.
- @end smallexample
- @c [fix-ref Embedded Mode]
- @xref{Embedded Mode}, for full details.
- @node Other M-# Commands, , Embedded Mode Overview, Using Calc
- @subsection Other @kbd{M-#} Commands
- @noindent
- Two more Calc-related commands are @kbd{M-# g} and @kbd{M-# r},
- which ``grab'' data from a selected region of a buffer into the
- Calculator. The region is defined in the usual Emacs way, by
- a ``mark'' placed at one end of the region, and the Emacs
- cursor or ``point'' placed at the other.
- The @kbd{M-# g} command reads the region in the usual left-to-right,
- top-to-bottom order. The result is packaged into a Calc vector
- of numbers and placed on the stack. Calc (in its standard
- user interface) is then started. Type @kbd{v u} if you want
- to unpack this vector into separate numbers on the stack. Also,
- @kbd{C-u M-# g} interprets the region as a single number or
- formula.
- The @kbd{M-# r} command reads a rectangle, with the point and
- mark defining opposite corners of the rectangle. The result
- is a matrix of numbers on the Calculator stack.
- Complementary to these is @kbd{M-# y}, which ``yanks'' the
- value at the top of the Calc stack back into an editing buffer.
- If you type @w{@kbd{M-# y}} while in such a buffer, the value is
- yanked at the current position. If you type @kbd{M-# y} while
- in the Calc buffer, Calc makes an educated guess as to which
- editing buffer you want to use. The Calc window does not have
- to be visible in order to use this command, as long as there
- is something on the Calc stack.
- Here, for reference, is the complete list of @kbd{M-#} commands.
- The shift, control, and meta keys are ignored for the keystroke
- following @kbd{M-#}.
- @noindent
- Commands for turning Calc on and off:
- @table @kbd
- @item #
- Turn Calc on or off, employing the same user interface as last time.
- @item C
- Turn Calc on or off using its standard bottom-of-the-screen
- interface. If Calc is already turned on but the cursor is not
- in the Calc window, move the cursor into the window.
- @item O
- Same as @kbd{C}, but don't select the new Calc window. If
- Calc is already turned on and the cursor is in the Calc window,
- move it out of that window.
- @item B
- Control whether @kbd{M-# c} and @kbd{M-# k} use the full screen.
- @item Q
- Use Quick Mode for a single short calculation.
- @item K
- Turn Calc Keypad mode on or off.
- @item E
- Turn Calc Embedded mode on or off at the current formula.
- @item J
- Turn Calc Embedded mode on or off, select the interesting part.
- @item W
- Turn Calc Embedded mode on or off at the current word (number).
- @item Z
- Turn Calc on in a user-defined way, as defined by a @kbd{Z I} command.
- @item X
- Quit Calc; turn off standard, Keypad, or Embedded mode if on.
- (This is like @kbd{q} or @key{OFF} inside of Calc.)
- @end table
- @iftex
- @sp 2
- @end iftex
- @noindent
- Commands for moving data into and out of the Calculator:
- @table @kbd
- @item G
- Grab the region into the Calculator as a vector.
- @item R
- Grab the rectangular region into the Calculator as a matrix.
- @item :
- Grab the rectangular region and compute the sums of its columns.
- @item _
- Grab the rectangular region and compute the sums of its rows.
- @item Y
- Yank a value from the Calculator into the current editing buffer.
- @end table
- @iftex
- @sp 2
- @end iftex
- @noindent
- Commands for use with Embedded Mode:
- @table @kbd
- @item A
- ``Activate'' the current buffer. Locate all formulas that
- contain @samp{:=} or @samp{=>} symbols and record their locations
- so that they can be updated automatically as variables are changed.
- @item D
- Duplicate the current formula immediately below and select
- the duplicate.
- @item F
- Insert a new formula at the current point.
- @item N
- Move the cursor to the next active formula in the buffer.
- @item P
- Move the cursor to the previous active formula in the buffer.
- @item U
- Update (i.e., as if by the @kbd{=} key) the formula at the current point.
- @item `
- Edit (as if by @code{calc-edit}) the formula at the current point.
- @end table
- @iftex
- @sp 2
- @end iftex
- @noindent
- Miscellaneous commands:
- @table @kbd
- @item I
- Run the Emacs Info system to read the Calc manual.
- (This is the same as @kbd{h i} inside of Calc.)
- @item T
- Run the Emacs Info system to read the Calc Tutorial.
- @item S
- Run the Emacs Info system to read the Calc Summary.
- @item L
- Load Calc entirely into memory. (Normally the various parts
- are loaded only as they are needed.)
- @item M
- Read a region of written keystroke names (like @kbd{C-n a b c @key{RET}})
- and record them as the current keyboard macro.
- @item 0
- (This is the ``zero'' digit key.) Reset the Calculator to
- its default state: Empty stack, and default mode settings.
- With any prefix argument, reset everything but the stack.
- @end table
- @node History and Acknowledgements, , Using Calc, Getting Started
- @section History and Acknowledgements
- @noindent
- Calc was originally started as a two-week project to occupy a lull
- in the author's schedule. Basically, a friend asked if I remembered
- the value of @c{$2^{32}$}
- @cite{2^32}. I didn't offhand, but I said, ``that's
- easy, just call up an @code{xcalc}.'' @code{Xcalc} duly reported
- that the answer to our question was @samp{4.294967e+09}---with no way to
- see the full ten digits even though we knew they were there in the
- program's memory! I was so annoyed, I vowed to write a calculator
- of my own, once and for all.
- I chose Emacs Lisp, a) because I had always been curious about it
- and b) because, being only a text editor extension language after
- all, Emacs Lisp would surely reach its limits long before the project
- got too far out of hand.
- To make a long story short, Emacs Lisp turned out to be a distressingly
- solid implementation of Lisp, and the humble task of calculating
- turned out to be more open-ended than one might have expected.
- Emacs Lisp doesn't have built-in floating point math, so it had to be
- simulated in software. In fact, Emacs integers will only comfortably
- fit six decimal digits or so---not enough for a decent calculator. So
- I had to write my own high-precision integer code as well, and once I had
- this I figured that arbitrary-size integers were just as easy as large
- integers. Arbitrary floating-point precision was the logical next step.
- Also, since the large integer arithmetic was there anyway it seemed only
- fair to give the user direct access to it, which in turn made it practical
- to support fractions as well as floats. All these features inspired me
- to look around for other data types that might be worth having.
- Around this time, my friend Rick Koshi showed me his nifty new HP-28
- calculator. It allowed the user to manipulate formulas as well as
- numerical quantities, and it could also operate on matrices. I decided
- that these would be good for Calc to have, too. And once things had
- gone this far, I figured I might as well take a look at serious algebra
- systems like Mathematica, Macsyma, and Maple for further ideas. Since
- these systems did far more than I could ever hope to implement, I decided
- to focus on rewrite rules and other programming features so that users
- could implement what they needed for themselves.
- Rick complained that matrices were hard to read, so I put in code to
- format them in a 2D style. Once these routines were in place, Big mode
- was obligatory. Gee, what other language modes would be useful?
- Scott Hemphill and Allen Knutson, two friends with a strong mathematical
- bent, contributed ideas and algorithms for a number of Calc features
- including modulo forms, primality testing, and float-to-fraction conversion.
- Units were added at the eager insistence of Mass Sivilotti. Later,
- Ulrich Mueller at CERN and Przemek Klosowski at NIST provided invaluable
- expert assistance with the units table. As far as I can remember, the
- idea of using algebraic formulas and variables to represent units dates
- back to an ancient article in Byte magazine about muMath, an early
- algebra system for microcomputers.
- Many people have contributed to Calc by reporting bugs and suggesting
- features, large and small. A few deserve special mention: Tim Peters,
- who helped develop the ideas that led to the selection commands, rewrite
- rules, and many other algebra features; @c{Fran\c cois}
- @asis{Francois} Pinard, who contributed
- an early prototype of the Calc Summary appendix as well as providing
- valuable suggestions in many other areas of Calc; Carl Witty, whose eagle
- eyes discovered many typographical and factual errors in the Calc manual;
- Tim Kay, who drove the development of Embedded mode; Ove Ewerlid, who
- made many suggestions relating to the algebra commands and contributed
- some code for polynomial operations; Randal Schwartz, who suggested the
- @code{calc-eval} function; Robert J. Chassell, who suggested the Calc
- Tutorial and exercises; and Juha Sarlin, who first worked out how to split
- Calc into quickly-loading parts. Bob Weiner helped immensely with the
- Lucid Emacs port.
- @cindex Bibliography
- @cindex Knuth, Art of Computer Programming
- @cindex Numerical Recipes
- @c Should these be expanded into more complete references?
- Among the books used in the development of Calc were Knuth's @emph{Art
- of Computer Programming} (especially volume II, @emph{Seminumerical
- Algorithms}); @emph{Numerical Recipes} by Press, Flannery, Teukolsky,
- and Vetterling; Bevington's @emph{Data Reduction and Error Analysis for
- the Physical Sciences}; @emph{Concrete Mathematics} by Graham, Knuth,
- and Patashnik; Steele's @emph{Common Lisp, the Language}; the @emph{CRC
- Standard Math Tables} (William H. Beyer, ed.); and Abramowitz and
- Stegun's venerable @emph{Handbook of Mathematical Functions}. I
- consulted the user's manuals for the HP-28 and HP-48 calculators, as
- well as for the programs Mathematica, SMP, Macsyma, Maple, MathCAD,
- Gnuplot, and others. Also, of course, Calc could not have been written
- without the excellent @emph{GNU Emacs Lisp Reference Manual}, by Bil
- Lewis and Dan LaLiberte.
- Final thanks go to Richard Stallman, without whose fine implementations
- of the Emacs editor, language, and environment, Calc would have been
- finished in two weeks.
- @c [tutorial]
- @ifinfo
- @c This node is accessed by the `M-# t' command.
- @node Interactive Tutorial, , , Top
- @chapter Tutorial
- @noindent
- Some brief instructions on using the Emacs Info system for this tutorial:
- Press the space bar and Delete keys to go forward and backward in a
- section by screenfuls (or use the regular Emacs scrolling commands
- for this).
- Press @kbd{n} or @kbd{p} to go to the Next or Previous section.
- If the section has a @dfn{menu}, press a digit key like @kbd{1}
- or @kbd{2} to go to a sub-section from the menu. Press @kbd{u} to
- go back up from a sub-section to the menu it is part of.
- Exercises in the tutorial all have cross-references to the
- appropriate page of the ``answers'' section. Press @kbd{f}, then
- the exercise number, to see the answer to an exercise. After
- you have followed a cross-reference, you can press the letter
- @kbd{l} to return to where you were before.
- You can press @kbd{?} at any time for a brief summary of Info commands.
- Press @kbd{1} now to enter the first section of the Tutorial.
- @menu
- * Tutorial::
- @end menu
- @end ifinfo
- @node Tutorial, Introduction, Getting Started, Top
- @chapter Tutorial
- @noindent
- This chapter explains how to use Calc and its many features, in
- a step-by-step, tutorial way. You are encouraged to run Calc and
- work along with the examples as you read (@pxref{Starting Calc}).
- If you are already familiar with advanced calculators, you may wish
- @c [not-split]
- to skip on to the rest of this manual.
- @c [when-split]
- @c to skip on to volume II of this manual, the @dfn{Calc Reference}.
- @c [fix-ref Embedded Mode]
- This tutorial describes the standard user interface of Calc only.
- The ``Quick Mode'' and ``Keypad Mode'' interfaces are fairly
- self-explanatory. @xref{Embedded Mode}, for a description of
- the ``Embedded Mode'' interface.
- @ifinfo
- The easiest way to read this tutorial on-line is to have two windows on
- your Emacs screen, one with Calc and one with the Info system. (If you
- have a printed copy of the manual you can use that instead.) Press
- @kbd{M-# c} to turn Calc on or to switch into the Calc window, and
- press @kbd{M-# i} to start the Info system or to switch into its window.
- Or, you may prefer to use the tutorial in printed form.
- @end ifinfo
- @iftex
- The easiest way to read this tutorial on-line is to have two windows on
- your Emacs screen, one with Calc and one with the Info system. (If you
- have a printed copy of the manual you can use that instead.) Press
- @kbd{M-# c} to turn Calc on or to switch into the Calc window, and
- press @kbd{M-# i} to start the Info system or to switch into its window.
- @end iftex
- This tutorial is designed to be done in sequence. But the rest of this
- manual does not assume you have gone through the tutorial. The tutorial
- does not cover everything in the Calculator, but it touches on most
- general areas.
- @ifinfo
- You may wish to print out a copy of the Calc Summary and keep notes on
- it as you learn Calc. @xref{Installation}, to see how to make a printed
- summary. @xref{Summary}.
- @end ifinfo
- @iftex
- The Calc Summary at the end of the reference manual includes some blank
- space for your own use. You may wish to keep notes there as you learn
- Calc.
- @end iftex
- @menu
- * Basic Tutorial::
- * Arithmetic Tutorial::
- * Vector/Matrix Tutorial::
- * Types Tutorial::
- * Algebra Tutorial::
- * Programming Tutorial::
- * Answers to Exercises::
- @end menu
- @node Basic Tutorial, Arithmetic Tutorial, Tutorial, Tutorial
- @section Basic Tutorial
- @noindent
- In this section, we learn how RPN and algebraic-style calculations
- work, how to undo and redo an operation done by mistake, and how
- to control various modes of the Calculator.
- @menu
- * RPN Tutorial:: Basic operations with the stack.
- * Algebraic Tutorial:: Algebraic entry; variables.
- * Undo Tutorial:: If you make a mistake: Undo and the trail.
- * Modes Tutorial:: Common mode-setting commands.
- @end menu
- @node RPN Tutorial, Algebraic Tutorial, Basic Tutorial, Basic Tutorial
- @subsection RPN Calculations and the Stack
- @cindex RPN notation
- @ifinfo
- @noindent
- Calc normally uses RPN notation. You may be familiar with the RPN
- system from Hewlett-Packard calculators, FORTH, or PostScript.
- (Reverse Polish Notation, RPN, is named after the Polish mathematician
- Jan Lukasiewicz.)
- @end ifinfo
- @tex
- \noindent
- Calc normally uses RPN notation. You may be familiar with the RPN
- system from Hewlett-Packard calculators, FORTH, or PostScript.
- (Reverse Polish Notation, RPN, is named after the Polish mathematician
- Jan \L ukasiewicz.)
- @end tex
- The central component of an RPN calculator is the @dfn{stack}. A
- calculator stack is like a stack of dishes. New dishes (numbers) are
- added at the top of the stack, and numbers are normally only removed
- from the top of the stack.
- @cindex Operators
- @cindex Operands
- In an operation like @cite{2+3}, the 2 and 3 are called the @dfn{operands}
- and the @cite{+} is the @dfn{operator}. In an RPN calculator you always
- enter the operands first, then the operator. Each time you type a
- number, Calc adds or @dfn{pushes} it onto the top of the Stack.
- When you press an operator key like @kbd{+}, Calc @dfn{pops} the appropriate
- number of operands from the stack and pushes back the result.
- Thus we could add the numbers 2 and 3 in an RPN calculator by typing:
- @kbd{2 @key{RET} 3 @key{RET} +}. (The @key{RET} key, Return, corresponds to
- the @key{ENTER} key on traditional RPN calculators.) Try this now if
- you wish; type @kbd{M-# c} to switch into the Calc window (you can type
- @kbd{M-# c} again or @kbd{M-# o} to switch back to the Tutorial window).
- The first four keystrokes ``push'' the numbers 2 and 3 onto the stack.
- The @kbd{+} key ``pops'' the top two numbers from the stack, adds them,
- and pushes the result (5) back onto the stack. Here's how the stack
- will look at various points throughout the calculation:@refill
- @smallexample
- @group
- . 1: 2 2: 2 1: 5 .
- . 1: 3 .
- .
- M-# c 2 @key{RET} 3 @key{RET} + @key{DEL}
- @end group
- @end smallexample
- The @samp{.} symbol is a marker that represents the top of the stack.
- Note that the ``top'' of the stack is really shown at the bottom of
- the Stack window. This may seem backwards, but it turns out to be
- less distracting in regular use.
- @cindex Stack levels
- @cindex Levels of stack
- The numbers @samp{1:} and @samp{2:} on the left are @dfn{stack level
- numbers}. Old RPN calculators always had four stack levels called
- @cite{x}, @cite{y}, @cite{z}, and @cite{t}. Calc's stack can grow
- as large as you like, so it uses numbers instead of letters. Some
- stack-manipulation commands accept a numeric argument that says
- which stack level to work on. Normal commands like @kbd{+} always
- work on the top few levels of the stack.@refill
- @c [fix-ref Truncating the Stack]
- The Stack buffer is just an Emacs buffer, and you can move around in
- it using the regular Emacs motion commands. But no matter where the
- cursor is, even if you have scrolled the @samp{.} marker out of
- view, most Calc commands always move the cursor back down to level 1
- before doing anything. It is possible to move the @samp{.} marker
- upwards through the stack, temporarily ``hiding'' some numbers from
- commands like @kbd{+}. This is called @dfn{stack truncation} and
- we will not cover it in this tutorial; @pxref{Truncating the Stack},
- if you are interested.
- You don't really need the second @key{RET} in @kbd{2 @key{RET} 3
- @key{RET} +}. That's because if you type any operator name or
- other non-numeric key when you are entering a number, the Calculator
- automatically enters that number and then does the requested command.
- Thus @kbd{2 @key{RET} 3 +} will work just as well.@refill
- Examples in this tutorial will often omit @key{RET} even when the
- stack displays shown would only happen if you did press @key{RET}:
- @smallexample
- @group
- 1: 2 2: 2 1: 5
- . 1: 3 .
- .
- 2 @key{RET} 3 +
- @end group
- @end smallexample
- @noindent
- Here, after pressing @kbd{3} the stack would really show @samp{1: 2}
- with @samp{Calc:@: 3} in the minibuffer. In these situations, you can
- press the optional @key{RET} to see the stack as the figure shows.
- (@bullet{}) @strong{Exercise 1.} (This tutorial will include exercises
- at various points. Try them if you wish. Answers to all the exercises
- are located at the end of the Tutorial chapter. Each exercise will
- include a cross-reference to its particular answer. If you are
- reading with the Emacs Info system, press @kbd{f} and the
- exercise number to go to the answer, then the letter @kbd{l} to
- return to where you were.)
- @noindent
- Here's the first exercise: What will the keystrokes @kbd{1 @key{RET} 2
- @key{RET} 3 @key{RET} 4 + * -} compute? (@samp{*} is the symbol for
- multiplication.) Figure it out by hand, then try it with Calc to see
- if you're right. @xref{RPN Answer 1, 1}. (@bullet{})
- (@bullet{}) @strong{Exercise 2.} Compute @c{$(2\times4) + (7\times9.4) + {5\over4}$}
- @cite{2*4 + 7*9.5 + 5/4} using the
- stack. @xref{RPN Answer 2, 2}. (@bullet{})
- The @key{DEL} key is called Backspace on some keyboards. It is
- whatever key you would use to correct a simple typing error when
- regularly using Emacs. The @key{DEL} key pops and throws away the
- top value on the stack. (You can still get that value back from
- the Trail if you should need it later on.) There are many places
- in this tutorial where we assume you have used @key{DEL} to erase the
- results of the previous example at the beginning of a new example.
- In the few places where it is really important to use @key{DEL} to
- clear away old results, the text will remind you to do so.
- (It won't hurt to let things accumulate on the stack, except that
- whenever you give a display-mode-changing command Calc will have to
- spend a long time reformatting such a large stack.)
- Since the @kbd{-} key is also an operator (it subtracts the top two
- stack elements), how does one enter a negative number? Calc uses
- the @kbd{_} (underscore) key to act like the minus sign in a number.
- So, typing @kbd{-5 @key{RET}} won't work because the @kbd{-} key
- will try to do a subtraction, but @kbd{_5 @key{RET}} works just fine.
- You can also press @kbd{n}, which means ``change sign.'' It changes
- the number at the top of the stack (or the number being entered)
- from positive to negative or vice-versa: @kbd{5 n @key{RET}}.
- @cindex Duplicating a stack entry
- If you press @key{RET} when you're not entering a number, the effect
- is to duplicate the top number on the stack. Consider this calculation:
- @smallexample
- @group
- 1: 3 2: 3 1: 9 2: 9 1: 81
- . 1: 3 . 1: 9 .
- . .
- 3 @key{RET} @key{RET} * @key{RET} *
- @end group
- @end smallexample
- @noindent
- (Of course, an easier way to do this would be @kbd{3 @key{RET} 4 ^},
- to raise 3 to the fourth power.)
- The space-bar key (denoted @key{SPC} here) performs the same function
- as @key{RET}; you could replace all three occurrences of @key{RET} in
- the above example with @key{SPC} and the effect would be the same.
- @cindex Exchanging stack entries
- Another stack manipulation key is @key{TAB}. This exchanges the top
- two stack entries. Suppose you have computed @kbd{2 @key{RET} 3 +}
- to get 5, and then you realize what you really wanted to compute
- was @cite{20 / (2+3)}.
- @smallexample
- @group
- 1: 5 2: 5 2: 20 1: 4
- . 1: 20 1: 5 .
- . .
- 2 @key{RET} 3 + 20 @key{TAB} /
- @end group
- @end smallexample
- @noindent
- Planning ahead, the calculation would have gone like this:
- @smallexample
- @group
- 1: 20 2: 20 3: 20 2: 20 1: 4
- . 1: 2 2: 2 1: 5 .
- . 1: 3 .
- .
- 20 @key{RET} 2 @key{RET} 3 + /
- @end group
- @end smallexample
- A related stack command is @kbd{M-@key{TAB}} (hold @key{META} and type
- @key{TAB}). It rotates the top three elements of the stack upward,
- bringing the object in level 3 to the top.
- @smallexample
- @group
- 1: 10 2: 10 3: 10 3: 20 3: 30
- . 1: 20 2: 20 2: 30 2: 10
- . 1: 30 1: 10 1: 20
- . . .
- 10 @key{RET} 20 @key{RET} 30 @key{RET} M-@key{TAB} M-@key{TAB}
- @end group
- @end smallexample
- (@bullet{}) @strong{Exercise 3.} Suppose the numbers 10, 20, and 30 are
- on the stack. Figure out how to add one to the number in level 2
- without affecting the rest of the stack. Also figure out how to add
- one to the number in level 3. @xref{RPN Answer 3, 3}. (@bullet{})
- Operations like @kbd{+}, @kbd{-}, @kbd{*}, @kbd{/}, and @kbd{^} pop two
- arguments from the stack and push a result. Operations like @kbd{n} and
- @kbd{Q} (square root) pop a single number and push the result. You can
- think of them as simply operating on the top element of the stack.
- @smallexample
- @group
- 1: 3 1: 9 2: 9 1: 25 1: 5
- . . 1: 16 . .
- .
- 3 @key{RET} @key{RET} * 4 @key{RET} @key{RET} * + Q
- @end group
- @end smallexample
- @noindent
- (Note that capital @kbd{Q} means to hold down the Shift key while
- typing @kbd{q}. Remember, plain unshifted @kbd{q} is the Quit command.)
- @cindex Pythagorean Theorem
- Here we've used the Pythagorean Theorem to determine the hypotenuse of a
- right triangle. Calc actually has a built-in command for that called
- @kbd{f h}, but let's suppose we can't remember the necessary keystrokes.
- We can still enter it by its full name using @kbd{M-x} notation:
- @smallexample
- @group
- 1: 3 2: 3 1: 5
- . 1: 4 .
- .
- 3 @key{RET} 4 @key{RET} M-x calc-hypot
- @end group
- @end smallexample
- All Calculator commands begin with the word @samp{calc-}. Since it
- gets tiring to type this, Calc provides an @kbd{x} key which is just
- like the regular Emacs @kbd{M-x} key except that it types the @samp{calc-}
- prefix for you:
- @smallexample
- @group
- 1: 3 2: 3 1: 5
- . 1: 4 .
- .
- 3 @key{RET} 4 @key{RET} x hypot
- @end group
- @end smallexample
- What happens if you take the square root of a negative number?
- @smallexample
- @group
- 1: 4 1: -4 1: (0, 2)
- . . .
- 4 @key{RET} n Q
- @end group
- @end smallexample
- @noindent
- The notation @cite{(a, b)} represents a complex number.
- Complex numbers are more traditionally written @c{$a + b i$}
- @cite{a + b i};
- Calc can display in this format, too, but for now we'll stick to the
- @cite{(a, b)} notation.
- If you don't know how complex numbers work, you can safely ignore this
- feature. Complex numbers only arise from operations that would be
- errors in a calculator that didn't have complex numbers. (For example,
- taking the square root or logarithm of a negative number produces a
- complex result.)
- Complex numbers are entered in the notation shown. The @kbd{(} and
- @kbd{,} and @kbd{)} keys manipulate ``incomplete complex numbers.''
- @smallexample
- @group
- 1: ( ... 2: ( ... 1: (2, ... 1: (2, ... 1: (2, 3)
- . 1: 2 . 3 .
- . .
- ( 2 , 3 )
- @end group
- @end smallexample
- You can perform calculations while entering parts of incomplete objects.
- However, an incomplete object cannot actually participate in a calculation:
- @smallexample
- @group
- 1: ( ... 2: ( ... 3: ( ... 1: ( ... 1: ( ...
- . 1: 2 2: 2 5 5
- . 1: 3 . .
- .
- (error)
- ( 2 @key{RET} 3 + +
- @end group
- @end smallexample
- @noindent
- Adding 5 to an incomplete object makes no sense, so the last command
- produces an error message and leaves the stack the same.
- Incomplete objects can't participate in arithmetic, but they can be
- moved around by the regular stack commands.
- @smallexample
- @group
- 2: 2 3: 2 3: 3 1: ( ... 1: (2, 3)
- 1: 3 2: 3 2: ( ... 2 .
- . 1: ( ... 1: 2 3
- . . .
- 2 @key{RET} 3 @key{RET} ( M-@key{TAB} M-@key{TAB} )
- @end group
- @end smallexample
- @noindent
- Note that the @kbd{,} (comma) key did not have to be used here.
- When you press @kbd{)} all the stack entries between the incomplete
- entry and the top are collected, so there's never really a reason
- to use the comma. It's up to you.
- (@bullet{}) @strong{Exercise 4.} To enter the complex number @cite{(2, 3)},
- your friend Joe typed @kbd{( 2 , @key{SPC} 3 )}. What happened?
- (Joe thought of a clever way to correct his mistake in only two
- keystrokes, but it didn't quite work. Try it to find out why.)
- @xref{RPN Answer 4, 4}. (@bullet{})
- Vectors are entered the same way as complex numbers, but with square
- brackets in place of parentheses. We'll meet vectors again later in
- the tutorial.
- Any Emacs command can be given a @dfn{numeric prefix argument} by
- typing a series of @key{META}-digits beforehand. If @key{META} is
- awkward for you, you can instead type @kbd{C-u} followed by the
- necessary digits. Numeric prefix arguments can be negative, as in
- @kbd{M-- M-3 M-5} or @w{@kbd{C-u - 3 5}}. Calc commands use numeric
- prefix arguments in a variety of ways. For example, a numeric prefix
- on the @kbd{+} operator adds any number of stack entries at once:
- @smallexample
- @group
- 1: 10 2: 10 3: 10 3: 10 1: 60
- . 1: 20 2: 20 2: 20 .
- . 1: 30 1: 30
- . .
- 10 @key{RET} 20 @key{RET} 30 @key{RET} C-u 3 +
- @end group
- @end smallexample
- For stack manipulation commands like @key{RET}, a positive numeric
- prefix argument operates on the top @var{n} stack entries at once. A
- negative argument operates on the entry in level @var{n} only. An
- argument of zero operates on the entire stack. In this example, we copy
- the second-to-top element of the stack:
- @smallexample
- @group
- 1: 10 2: 10 3: 10 3: 10 4: 10
- . 1: 20 2: 20 2: 20 3: 20
- . 1: 30 1: 30 2: 30
- . . 1: 20
- .
- 10 @key{RET} 20 @key{RET} 30 @key{RET} C-u -2 @key{RET}
- @end group
- @end smallexample
- @cindex Clearing the stack
- @cindex Emptying the stack
- Another common idiom is @kbd{M-0 @key{DEL}}, which clears the stack.
- (The @kbd{M-0} numeric prefix tells @key{DEL} to operate on the
- entire stack.)
- @node Algebraic Tutorial, Undo Tutorial, RPN Tutorial, Basic Tutorial
- @subsection Algebraic-Style Calculations
- @noindent
- If you are not used to RPN notation, you may prefer to operate the
- Calculator in ``algebraic mode,'' which is closer to the way
- non-RPN calculators work. In algebraic mode, you enter formulas
- in traditional @cite{2+3} notation.
- You don't really need any special ``mode'' to enter algebraic formulas.
- You can enter a formula at any time by pressing the apostrophe (@kbd{'})
- key. Answer the prompt with the desired formula, then press @key{RET}.
- The formula is evaluated and the result is pushed onto the RPN stack.
- If you don't want to think in RPN at all, you can enter your whole
- computation as a formula, read the result from the stack, then press
- @key{DEL} to delete it from the stack.
- Try pressing the apostrophe key, then @kbd{2+3+4}, then @key{RET}.
- The result should be the number 9.
- Algebraic formulas use the operators @samp{+}, @samp{-}, @samp{*},
- @samp{/}, and @samp{^}. You can use parentheses to make the order
- of evaluation clear. In the absence of parentheses, @samp{^} is
- evaluated first, then @samp{*}, then @samp{/}, then finally
- @samp{+} and @samp{-}. For example, the expression
- @example
- 2 + 3*4*5 / 6*7^8 - 9
- @end example
- @noindent
- is equivalent to
- @example
- 2 + ((3*4*5) / (6*(7^8)) - 9
- @end example
- @noindent
- or, in large mathematical notation,
- @ifinfo
- @example
- @group
- 3 * 4 * 5
- 2 + --------- - 9
- 8
- 6 * 7
- @end group
- @end example
- @end ifinfo
- @tex
- \turnoffactive
- \beforedisplay
- $$ 2 + { 3 \times 4 \times 5 \over 6 \times 7^8 } - 9 $$
- \afterdisplay
- @end tex
- @noindent
- The result of this expression will be the number @i{-6.99999826533}.
- Calc's order of evaluation is the same as for most computer languages,
- except that @samp{*} binds more strongly than @samp{/}, as the above
- example shows. As in normal mathematical notation, the @samp{*} symbol
- can often be omitted: @samp{2 a} is the same as @samp{2*a}.
- Operators at the same level are evaluated from left to right, except
- that @samp{^} is evaluated from right to left. Thus, @samp{2-3-4} is
- equivalent to @samp{(2-3)-4} or @i{-5}, whereas @samp{2^3^4} is equivalent
- to @samp{2^(3^4)} (a very large integer; try it!).
- If you tire of typing the apostrophe all the time, there is an
- ``algebraic mode'' you can select in which Calc automatically senses
- when you are about to type an algebraic expression. To enter this
- mode, press the two letters @w{@kbd{m a}}. (An @samp{Alg} indicator
- should appear in the Calc window's mode line.)
- Press @kbd{m a}, then @kbd{2+3+4} with no apostrophe, then @key{RET}.
- In algebraic mode, when you press any key that would normally begin
- entering a number (such as a digit, a decimal point, or the @kbd{_}
- key), or if you press @kbd{(} or @kbd{[}, Calc automatically begins
- an algebraic entry.
- Functions which do not have operator symbols like @samp{+} and @samp{*}
- must be entered in formulas using function-call notation. For example,
- the function name corresponding to the square-root key @kbd{Q} is
- @code{sqrt}. To compute a square root in a formula, you would use
- the notation @samp{sqrt(@var{x})}.
- Press the apostrophe, then type @kbd{sqrt(5*2) - 3}. The result should
- be @cite{0.16227766017}.
- Note that if the formula begins with a function name, you need to use
- the apostrophe even if you are in algebraic mode. If you type @kbd{arcsin}
- out of the blue, the @kbd{a r} will be taken as an Algebraic Rewrite
- command, and the @kbd{csin} will be taken as the name of the rewrite
- rule to use!
- Some people prefer to enter complex numbers and vectors in algebraic
- form because they find RPN entry with incomplete objects to be too
- distracting, even though they otherwise use Calc as an RPN calculator.
- Still in algebraic mode, type:
- @smallexample
- @group
- 1: (2, 3) 2: (2, 3) 1: (8, -1) 2: (8, -1) 1: (9, -1)
- . 1: (1, -2) . 1: 1 .
- . .
- (2,3) @key{RET} (1,-2) @key{RET} * 1 @key{RET} +
- @end group
- @end smallexample
- Algebraic mode allows us to enter complex numbers without pressing
- an apostrophe first, but it also means we need to press @key{RET}
- after every entry, even for a simple number like @cite{1}.
- (You can type @kbd{C-u m a} to enable a special ``incomplete algebraic
- mode'' in which the @kbd{(} and @kbd{[} keys use algebraic entry even
- though regular numeric keys still use RPN numeric entry. There is also
- a ``total algebraic mode,'' started by typing @kbd{m t}, in which all
- normal keys begin algebraic entry. You must then use the @key{META} key
- to type Calc commands: @kbd{M-m t} to get back out of total algebraic
- mode, @kbd{M-q} to quit, etc. Total algebraic mode is not supported
- under Emacs 19.)
- If you're still in algebraic mode, press @kbd{m a} again to turn it off.
- Actual non-RPN calculators use a mixture of algebraic and RPN styles.
- In general, operators of two numbers (like @kbd{+} and @kbd{*})
- use algebraic form, but operators of one number (like @kbd{n} and @kbd{Q})
- use RPN form. Also, a non-RPN calculator allows you to see the
- intermediate results of a calculation as you go along. You can
- accomplish this in Calc by performing your calculation as a series
- of algebraic entries, using the @kbd{$} sign to tie them together.
- In an algebraic formula, @kbd{$} represents the number on the top
- of the stack. Here, we perform the calculation @c{$\sqrt{2\times4+1}$}
- @cite{sqrt(2*4+1)},
- which on a traditional calculator would be done by pressing
- @kbd{2 * 4 + 1 =} and then the square-root key.
- @smallexample
- @group
- 1: 8 1: 9 1: 3
- . . .
- ' 2*4 @key{RET} $+1 @key{RET} Q
- @end group
- @end smallexample
- @noindent
- Notice that we didn't need to press an apostrophe for the @kbd{$+1},
- because the dollar sign always begins an algebraic entry.
- (@bullet{}) @strong{Exercise 1.} How could you get the same effect as
- pressing @kbd{Q} but using an algebraic entry instead? How about
- if the @kbd{Q} key on your keyboard were broken?
- @xref{Algebraic Answer 1, 1}. (@bullet{})
- The notations @kbd{$$}, @kbd{$$$}, and so on stand for higher stack
- entries. For example, @kbd{' $$+$ @key{RET}} is just like typing @kbd{+}.
- Algebraic formulas can include @dfn{variables}. To store in a
- variable, press @kbd{s s}, then type the variable name, then press
- @key{RET}. (There are actually two flavors of store command:
- @kbd{s s} stores a number in a variable but also leaves the number
- on the stack, while @w{@kbd{s t}} removes a number from the stack and
- stores it in the variable.) A variable name should consist of one
- or more letters or digits, beginning with a letter.
- @smallexample
- @group
- 1: 17 . 1: a + a^2 1: 306
- . . .
- 17 s t a @key{RET} ' a+a^2 @key{RET} =
- @end group
- @end smallexample
- @noindent
- The @kbd{=} key @dfn{evaluates} a formula by replacing all its
- variables by the values that were stored in them.
- For RPN calculations, you can recall a variable's value on the
- stack either by entering its name as a formula and pressing @kbd{=},
- or by using the @kbd{s r} command.
- @smallexample
- @group
- 1: 17 2: 17 3: 17 2: 17 1: 306
- . 1: 17 2: 17 1: 289 .
- . 1: 2 .
- .
- s r a @key{RET} ' a @key{RET} = 2 ^ +
- @end group
- @end smallexample
- If you press a single digit for a variable name (as in @kbd{s t 3}, you
- get one of ten @dfn{quick variables} @code{q0} through @code{q9}.
- They are ``quick'' simply because you don't have to type the letter
- @code{q} or the @key{RET} after their names. In fact, you can type
- simply @kbd{s 3} as a shorthand for @kbd{s s 3}, and likewise for
- @kbd{t 3} and @w{@kbd{r 3}}.
- Any variables in an algebraic formula for which you have not stored
- values are left alone, even when you evaluate the formula.
- @smallexample
- @group
- 1: 2 a + 2 b 1: 34 + 2 b
- . .
- ' 2a+2b @key{RET} =
- @end group
- @end smallexample
- Calls to function names which are undefined in Calc are also left
- alone, as are calls for which the value is undefined.
- @smallexample
- @group
- 1: 2 + log10(0) + log10(x) + log10(5, 6) + foo(3)
- .
- ' log10(100) + log10(0) + log10(x) + log10(5,6) + foo(3) @key{RET}
- @end group
- @end smallexample
- @noindent
- In this example, the first call to @code{log10} works, but the other
- calls are not evaluated. In the second call, the logarithm is
- undefined for that value of the argument; in the third, the argument
- is symbolic, and in the fourth, there are too many arguments. In the
- fifth case, there is no function called @code{foo}. You will see a
- ``Wrong number of arguments'' message referring to @samp{log10(5,6)}.
- Press the @kbd{w} (``why'') key to see any other messages that may
- have arisen from the last calculation. In this case you will get
- ``logarithm of zero,'' then ``number expected: @code{x}''. Calc
- automatically displays the first message only if the message is
- sufficiently important; for example, Calc considers ``wrong number
- of arguments'' and ``logarithm of zero'' to be important enough to
- report automatically, while a message like ``number expected: @code{x}''
- will only show up if you explicitly press the @kbd{w} key.
- (@bullet{}) @strong{Exercise 2.} Joe entered the formula @samp{2 x y},
- stored 5 in @code{x}, pressed @kbd{=}, and got the expected result,
- @samp{10 y}. He then tried the same for the formula @samp{2 x (1+y)},
- expecting @samp{10 (1+y)}, but it didn't work. Why not?
- @xref{Algebraic Answer 2, 2}. (@bullet{})
- (@bullet{}) @strong{Exercise 3.} What result would you expect
- @kbd{1 @key{RET} 0 /} to give? What if you then type @kbd{0 *}?
- @xref{Algebraic Answer 3, 3}. (@bullet{})
- One interesting way to work with variables is to use the
- @dfn{evaluates-to} (@samp{=>}) operator. It works like this:
- Enter a formula algebraically in the usual way, but follow
- the formula with an @samp{=>} symbol. (There is also an @kbd{s =}
- command which builds an @samp{=>} formula using the stack.) On
- the stack, you will see two copies of the formula with an @samp{=>}
- between them. The lefthand formula is exactly like you typed it;
- the righthand formula has been evaluated as if by typing @kbd{=}.
- @smallexample
- @group
- 2: 2 + 3 => 5 2: 2 + 3 => 5
- 1: 2 a + 2 b => 34 + 2 b 1: 2 a + 2 b => 20 + 2 b
- . .
- ' 2+3 => @key{RET} ' 2a+2b @key{RET} s = 10 s t a @key{RET}
- @end group
- @end smallexample
- @noindent
- Notice that the instant we stored a new value in @code{a}, all
- @samp{=>} operators already on the stack that referred to @cite{a}
- were updated to use the new value. With @samp{=>}, you can push a
- set of formulas on the stack, then change the variables experimentally
- to see the effects on the formulas' values.
- You can also ``unstore'' a variable when you are through with it:
- @smallexample
- @group
- 2: 2 + 5 => 5
- 1: 2 a + 2 b => 2 a + 2 b
- .
- s u a @key{RET}
- @end group
- @end smallexample
- We will encounter formulas involving variables and functions again
- when we discuss the algebra and calculus features of the Calculator.
- @node Undo Tutorial, Modes Tutorial, Algebraic Tutorial, Basic Tutorial
- @subsection Undo and Redo
- @noindent
- If you make a mistake, you can usually correct it by pressing shift-@kbd{U},
- the ``undo'' command. First, clear the stack (@kbd{M-0 @key{DEL}}) and exit
- and restart Calc (@kbd{M-# M-# M-# M-#}) to make sure things start off
- with a clean slate. Now:
- @smallexample
- @group
- 1: 2 2: 2 1: 8 2: 2 1: 6
- . 1: 3 . 1: 3 .
- . .
- 2 @key{RET} 3 ^ U *
- @end group
- @end smallexample
- You can undo any number of times. Calc keeps a complete record of
- all you have done since you last opened the Calc window. After the
- above example, you could type:
- @smallexample
- @group
- 1: 6 2: 2 1: 2 . .
- . 1: 3 .
- .
- (error)
- U U U U
- @end group
- @end smallexample
- You can also type @kbd{D} to ``redo'' a command that you have undone
- mistakenly.
- @smallexample
- @group
- . 1: 2 2: 2 1: 6 1: 6
- . 1: 3 . .
- .
- (error)
- D D D D
- @end group
- @end smallexample
- @noindent
- It was not possible to redo past the @cite{6}, since that was placed there
- by something other than an undo command.
- @cindex Time travel
- You can think of undo and redo as a sort of ``time machine.'' Press
- @kbd{U} to go backward in time, @kbd{D} to go forward. If you go
- backward and do something (like @kbd{*}) then, as any science fiction
- reader knows, you have changed your future and you cannot go forward
- again. Thus, the inability to redo past the @cite{6} even though there
- was an earlier undo command.
- You can always recall an earlier result using the Trail. We've ignored
- the trail so far, but it has been faithfully recording everything we
- did since we loaded the Calculator. If the Trail is not displayed,
- press @kbd{t d} now to turn it on.
- Let's try grabbing an earlier result. The @cite{8} we computed was
- undone by a @kbd{U} command, and was lost even to Redo when we pressed
- @kbd{*}, but it's still there in the trail. There should be a little
- @samp{>} arrow (the @dfn{trail pointer}) resting on the last trail
- entry. If there isn't, press @kbd{t ]} to reset the trail pointer.
- Now, press @w{@kbd{t p}} to move the arrow onto the line containing
- @cite{8}, and press @w{@kbd{t y}} to ``yank'' that number back onto the
- stack.
- If you press @kbd{t ]} again, you will see that even our Yank command
- went into the trail.
- Let's go further back in time. Earlier in the tutorial we computed
- a huge integer using the formula @samp{2^3^4}. We don't remember
- what it was, but the first digits were ``241''. Press @kbd{t r}
- (which stands for trail-search-reverse), then type @kbd{241}.
- The trail cursor will jump back to the next previous occurrence of
- the string ``241'' in the trail. This is just a regular Emacs
- incremental search; you can now press @kbd{C-s} or @kbd{C-r} to
- continue the search forwards or backwards as you like.
- To finish the search, press @key{RET}. This halts the incremental
- search and leaves the trail pointer at the thing we found. Now we
- can type @kbd{t y} to yank that number onto the stack. If we hadn't
- remembered the ``241'', we could simply have searched for @kbd{2^3^4},
- then pressed @kbd{@key{RET} t n} to halt and then move to the next item.
- You may have noticed that all the trail-related commands begin with
- the letter @kbd{t}. (The store-and-recall commands, on the other hand,
- all began with @kbd{s}.) Calc has so many commands that there aren't
- enough keys for all of them, so various commands are grouped into
- two-letter sequences where the first letter is called the @dfn{prefix}
- key. If you type a prefix key by accident, you can press @kbd{C-g}
- to cancel it. (In fact, you can press @kbd{C-g} to cancel almost
- anything in Emacs.) To get help on a prefix key, press that key
- followed by @kbd{?}. Some prefixes have several lines of help,
- so you need to press @kbd{?} repeatedly to see them all. This may
- not work under Lucid Emacs, but you can also type @kbd{h h} to
- see all the help at once.
- Try pressing @kbd{t ?} now. You will see a line of the form,
- @smallexample
- trail/time: Display; Fwd, Back; Next, Prev, Here, [, ]; Yank: [MORE] t-
- @end smallexample
- @noindent
- The word ``trail'' indicates that the @kbd{t} prefix key contains
- trail-related commands. Each entry on the line shows one command,
- with a single capital letter showing which letter you press to get
- that command. We have used @kbd{t n}, @kbd{t p}, @kbd{t ]}, and
- @kbd{t y} so far. The @samp{[MORE]} means you can press @kbd{?}
- again to see more @kbd{t}-prefix comands. Notice that the commands
- are roughly divided (by semicolons) into related groups.
- When you are in the help display for a prefix key, the prefix is
- still active. If you press another key, like @kbd{y} for example,
- it will be interpreted as a @kbd{t y} command. If all you wanted
- was to look at the help messages, press @kbd{C-g} afterwards to cancel
- the prefix.
- One more way to correct an error is by editing the stack entries.
- The actual Stack buffer is marked read-only and must not be edited
- directly, but you can press @kbd{`} (the backquote or accent grave)
- to edit a stack entry.
- Try entering @samp{3.141439} now. If this is supposed to represent
- @c{$\pi$}
- @cite{pi}, it's got several errors. Press @kbd{`} to edit this number.
- Now use the normal Emacs cursor motion and editing keys to change
- the second 4 to a 5, and to transpose the 3 and the 9. When you
- press @key{RET}, the number on the stack will be replaced by your
- new number. This works for formulas, vectors, and all other types
- of values you can put on the stack. The @kbd{`} key also works
- during entry of a number or algebraic formula.
- @node Modes Tutorial, , Undo Tutorial, Basic Tutorial
- @subsection Mode-Setting Commands
- @noindent
- Calc has many types of @dfn{modes} that affect the way it interprets
- your commands or the way it displays data. We have already seen one
- mode, namely algebraic mode. There are many others, too; we'll
- try some of the most common ones here.
- Perhaps the most fundamental mode in Calc is the current @dfn{precision}.
- Notice the @samp{12} on the Calc window's mode line:
- @smallexample
- --%%-Calc: 12 Deg (Calculator)----All------
- @end smallexample
- @noindent
- Most of the symbols there are Emacs things you don't need to worry
- about, but the @samp{12} and the @samp{Deg} are mode indicators.
- The @samp{12} means that calculations should always be carried to
- 12 significant figures. That is why, when we type @kbd{1 @key{RET} 7 /},
- we get @cite{0.142857142857} with exactly 12 digits, not counting
- leading and trailing zeros.
- You can set the precision to anything you like by pressing @kbd{p},
- then entering a suitable number. Try pressing @kbd{p 30 @key{RET}},
- then doing @kbd{1 @key{RET} 7 /} again:
- @smallexample
- @group
- 1: 0.142857142857
- 2: 0.142857142857142857142857142857
- .
- @end group
- @end smallexample
- Although the precision can be set arbitrarily high, Calc always
- has to have @emph{some} value for the current precision. After
- all, the true value @cite{1/7} is an infinitely repeating decimal;
- Calc has to stop somewhere.
- Of course, calculations are slower the more digits you request.
- Press @w{@kbd{p 12}} now to set the precision back down to the default.
- Calculations always use the current precision. For example, even
- though we have a 30-digit value for @cite{1/7} on the stack, if
- we use it in a calculation in 12-digit mode it will be rounded
- down to 12 digits before it is used. Try it; press @key{RET} to
- duplicate the number, then @w{@kbd{1 +}}. Notice that the @key{RET}
- key didn't round the number, because it doesn't do any calculation.
- But the instant we pressed @kbd{+}, the number was rounded down.
- @smallexample
- @group
- 1: 0.142857142857
- 2: 0.142857142857142857142857142857
- 3: 1.14285714286
- .
- @end group
- @end smallexample
- @noindent
- In fact, since we added a digit on the left, we had to lose one
- digit on the right from even the 12-digit value of @cite{1/7}.
- How did we get more than 12 digits when we computed @samp{2^3^4}? The
- answer is that Calc makes a distinction between @dfn{integers} and
- @dfn{floating-point} numbers, or @dfn{floats}. An integer is a number
- that does not contain a decimal point. There is no such thing as an
- ``infinitely repeating fraction integer,'' so Calc doesn't have to limit
- itself. If you asked for @samp{2^10000} (don't try this!), you would
- have to wait a long time but you would eventually get an exact answer.
- If you ask for @samp{2.^10000}, you will quickly get an answer which is
- correct only to 12 places. The decimal point tells Calc that it should
- use floating-point arithmetic to get the answer, not exact integer
- arithmetic.
- You can use the @kbd{F} (@code{calc-floor}) command to convert a
- floating-point value to an integer, and @kbd{c f} (@code{calc-float})
- to convert an integer to floating-point form.
- Let's try entering that last calculation:
- @smallexample
- @group
- 1: 2. 2: 2. 1: 1.99506311689e3010
- . 1: 10000 .
- .
- 2.0 @key{RET} 10000 @key{RET} ^
- @end group
- @end smallexample
- @noindent
- @cindex Scientific notation, entry of
- Notice the letter @samp{e} in there. It represents ``times ten to the
- power of,'' and is used by Calc automatically whenever writing the
- number out fully would introduce more extra zeros than you probably
- want to see. You can enter numbers in this notation, too.
- @smallexample
- @group
- 1: 2. 2: 2. 1: 1.99506311678e3010
- . 1: 10000. .
- .
- 2.0 @key{RET} 1e4 @key{RET} ^
- @end group
- @end smallexample
- @cindex Round-off errors
- @noindent
- Hey, the answer is different! Look closely at the middle columns
- of the two examples. In the first, the stack contained the
- exact integer @cite{10000}, but in the second it contained
- a floating-point value with a decimal point. When you raise a
- number to an integer power, Calc uses repeated squaring and
- multiplication to get the answer. When you use a floating-point
- power, Calc uses logarithms and exponentials. As you can see,
- a slight error crept in during one of these methods. Which
- one should we trust? Let's raise the precision a bit and find
- out:
- @smallexample
- @group
- . 1: 2. 2: 2. 1: 1.995063116880828e3010
- . 1: 10000. .
- .
- p 16 @key{RET} 2. @key{RET} 1e4 ^ p 12 @key{RET}
- @end group
- @end smallexample
- @noindent
- @cindex Guard digits
- Presumably, it doesn't matter whether we do this higher-precision
- calculation using an integer or floating-point power, since we
- have added enough ``guard digits'' to trust the first 12 digits
- no matter what. And the verdict is@dots{} Integer powers were more
- accurate; in fact, the result was only off by one unit in the
- last place.
- @cindex Guard digits
- Calc does many of its internal calculations to a slightly higher
- precision, but it doesn't always bump the precision up enough.
- In each case, Calc added about two digits of precision during
- its calculation and then rounded back down to 12 digits
- afterward. In one case, it was enough; in the other, it
- wasn't. If you really need @var{x} digits of precision, it
- never hurts to do the calculation with a few extra guard digits.
- What if we want guard digits but don't want to look at them?
- We can set the @dfn{float format}. Calc supports four major
- formats for floating-point numbers, called @dfn{normal},
- @dfn{fixed-point}, @dfn{scientific notation}, and @dfn{engineering
- notation}. You get them by pressing @w{@kbd{d n}}, @kbd{d f},
- @kbd{d s}, and @kbd{d e}, respectively. In each case, you can
- supply a numeric prefix argument which says how many digits
- should be displayed. As an example, let's put a few numbers
- onto the stack and try some different display modes. First,
- use @kbd{M-0 @key{DEL}} to clear the stack, then enter the four
- numbers shown here:
- @smallexample
- @group
- 4: 12345 4: 12345 4: 12345 4: 12345 4: 12345
- 3: 12345. 3: 12300. 3: 1.2345e4 3: 1.23e4 3: 12345.000
- 2: 123.45 2: 123. 2: 1.2345e2 2: 1.23e2 2: 123.450
- 1: 12.345 1: 12.3 1: 1.2345e1 1: 1.23e1 1: 12.345
- . . . . .
- d n M-3 d n d s M-3 d s M-3 d f
- @end group
- @end smallexample
- @noindent
- Notice that when we typed @kbd{M-3 d n}, the numbers were rounded down
- to three significant digits, but then when we typed @kbd{d s} all
- five significant figures reappeared. The float format does not
- affect how numbers are stored, it only affects how they are
- displayed. Only the current precision governs the actual rounding
- of numbers in the Calculator's memory.
- Engineering notation, not shown here, is like scientific notation
- except the exponent (the power-of-ten part) is always adjusted to be
- a multiple of three (as in ``kilo,'' ``micro,'' etc.). As a result
- there will be one, two, or three digits before the decimal point.
- Whenever you change a display-related mode, Calc redraws everything
- in the stack. This may be slow if there are many things on the stack,
- so Calc allows you to type shift-@kbd{H} before any mode command to
- prevent it from updating the stack. Anything Calc displays after the
- mode-changing command will appear in the new format.
- @smallexample
- @group
- 4: 12345 4: 12345 4: 12345 4: 12345 4: 12345
- 3: 12345.000 3: 12345.000 3: 12345.000 3: 1.2345e4 3: 12345.
- 2: 123.450 2: 123.450 2: 1.2345e1 2: 1.2345e1 2: 123.45
- 1: 12.345 1: 1.2345e1 1: 1.2345e2 1: 1.2345e2 1: 12.345
- . . . . .
- H d s @key{DEL} U @key{TAB} d @key{SPC} d n
- @end group
- @end smallexample
- @noindent
- Here the @kbd{H d s} command changes to scientific notation but without
- updating the screen. Deleting the top stack entry and undoing it back
- causes it to show up in the new format; swapping the top two stack
- entries reformats both entries. The @kbd{d @key{SPC}} command refreshes the
- whole stack. The @kbd{d n} command changes back to the normal float
- format; since it doesn't have an @kbd{H} prefix, it also updates all
- the stack entries to be in @kbd{d n} format.
- Notice that the integer @cite{12345} was not affected by any
- of the float formats. Integers are integers, and are always
- displayed exactly.
- @cindex Large numbers, readability
- Large integers have their own problems. Let's look back at
- the result of @kbd{2^3^4}.
- @example
- 2417851639229258349412352
- @end example
- @noindent
- Quick---how many digits does this have? Try typing @kbd{d g}:
- @example
- 2,417,851,639,229,258,349,412,352
- @end example
- @noindent
- Now how many digits does this have? It's much easier to tell!
- We can actually group digits into clumps of any size. Some
- people prefer @kbd{M-5 d g}:
- @example
- 24178,51639,22925,83494,12352
- @end example
- Let's see what happens to floating-point numbers when they are grouped.
- First, type @kbd{p 25 @key{RET}} to make sure we have enough precision
- to get ourselves into trouble. Now, type @kbd{1e13 /}:
- @example
- 24,17851,63922.9258349412352
- @end example
- @noindent
- The integer part is grouped but the fractional part isn't. Now try
- @kbd{M-- M-5 d g} (that's meta-minus-sign, meta-five):
- @example
- 24,17851,63922.92583,49412,352
- @end example
- If you find it hard to tell the decimal point from the commas, try
- changing the grouping character to a space with @kbd{d , @key{SPC}}:
- @example
- 24 17851 63922.92583 49412 352
- @end example
- Type @kbd{d , ,} to restore the normal grouping character, then
- @kbd{d g} again to turn grouping off. Also, press @kbd{p 12} to
- restore the default precision.
- Press @kbd{U} enough times to get the original big integer back.
- (Notice that @kbd{U} does not undo each mode-setting command; if
- you want to undo a mode-setting command, you have to do it yourself.)
- Now, type @kbd{d r 16 @key{RET}}:
- @example
- 16#200000000000000000000
- @end example
- @noindent
- The number is now displayed in @dfn{hexadecimal}, or ``base-16'' form.
- Suddenly it looks pretty simple; this should be no surprise, since we
- got this number by computing a power of two, and 16 is a power of 2.
- In fact, we can use @w{@kbd{d r 2 @key{RET}}} to see it in actual binary
- form:
- @example
- 2#1000000000000000000000000000000000000000000000000000000 @dots{}
- @end example
- @noindent
- We don't have enough space here to show all the zeros! They won't
- fit on a typical screen, either, so you will have to use horizontal
- scrolling to see them all. Press @kbd{<} and @kbd{>} to scroll the
- stack window left and right by half its width. Another way to view
- something large is to press @kbd{`} (back-quote) to edit the top of
- stack in a separate window. (Press @kbd{M-# M-#} when you are done.)
- You can enter non-decimal numbers using the @kbd{#} symbol, too.
- Let's see what the hexadecimal number @samp{5FE} looks like in
- binary. Type @kbd{16#5FE} (the letters can be typed in upper or
- lower case; they will always appear in upper case). It will also
- help to turn grouping on with @kbd{d g}:
- @example
- 2#101,1111,1110
- @end example
- Notice that @kbd{d g} groups by fours by default if the display radix
- is binary or hexadecimal, but by threes if it is decimal, octal, or any
- other radix.
- Now let's see that number in decimal; type @kbd{d r 10}:
- @example
- 1,534
- @end example
- Numbers are not @emph{stored} with any particular radix attached. They're
- just numbers; they can be entered in any radix, and are always displayed
- in whatever radix you've chosen with @kbd{d r}. The current radix applies
- to integers, fractions, and floats.
- @cindex Roundoff errors, in non-decimal numbers
- (@bullet{}) @strong{Exercise 1.} Your friend Joe tried to enter one-third
- as @samp{3#0.1} in @kbd{d r 3} mode with a precision of 12. He got
- @samp{3#0.0222222...} (with 25 2's) in the display. When he multiplied
- that by three, he got @samp{3#0.222222...} instead of the expected
- @samp{3#1}. Next, Joe entered @samp{3#0.2} and, to his great relief,
- saw @samp{3#0.2} on the screen. But when he typed @kbd{2 /}, he got
- @samp{3#0.10000001} (some zeros omitted). What's going on here?
- @xref{Modes Answer 1, 1}. (@bullet{})
- @cindex Scientific notation, in non-decimal numbers
- (@bullet{}) @strong{Exercise 2.} Scientific notation works in non-decimal
- modes in the natural way (the exponent is a power of the radix instead of
- a power of ten, although the exponent itself is always written in decimal).
- Thus @samp{8#1.23e3 = 8#1230.0}. Suppose we have the hexadecimal number
- @samp{f.e8f} times 16 to the 15th power: We write @samp{16#f.e8fe15}.
- What is wrong with this picture? What could we write instead that would
- work better? @xref{Modes Answer 2, 2}. (@bullet{})
- The @kbd{m} prefix key has another set of modes, relating to the way
- Calc interprets your inputs and does computations. Whereas @kbd{d}-prefix
- modes generally affect the way things look, @kbd{m}-prefix modes affect
- the way they are actually computed.
- The most popular @kbd{m}-prefix mode is the @dfn{angular mode}. Notice
- the @samp{Deg} indicator in the mode line. This means that if you use
- a command that interprets a number as an angle, it will assume the
- angle is measured in degrees. For example,
- @smallexample
- @group
- 1: 45 1: 0.707106781187 1: 0.500000000001 1: 0.5
- . . . .
- 45 S 2 ^ c 1
- @end group
- @end smallexample
- @noindent
- The shift-@kbd{S} command computes the sine of an angle. The sine
- of 45 degrees is @c{$\sqrt{2}/2$}
- @cite{sqrt(2)/2}; squaring this yields @cite{2/4 = 0.5}.
- However, there has been a slight roundoff error because the
- representation of @c{$\sqrt{2}/2$}
- @cite{sqrt(2)/2} wasn't exact. The @kbd{c 1}
- command is a handy way to clean up numbers in this case; it
- temporarily reduces the precision by one digit while it
- re-rounds the number on the top of the stack.
- @cindex Roundoff errors, examples
- (@bullet{}) @strong{Exercise 3.} Your friend Joe computed the sine
- of 45 degrees as shown above, then, hoping to avoid an inexact
- result, he increased the precision to 16 digits before squaring.
- What happened? @xref{Modes Answer 3, 3}. (@bullet{})
- To do this calculation in radians, we would type @kbd{m r} first.
- (The indicator changes to @samp{Rad}.) 45 degrees corresponds to
- @c{$\pi\over4$}
- @cite{pi/4} radians. To get @c{$\pi$}
- @cite{pi}, press the @kbd{P} key. (Once
- again, this is a shifted capital @kbd{P}. Remember, unshifted
- @kbd{p} sets the precision.)
- @smallexample
- @group
- 1: 3.14159265359 1: 0.785398163398 1: 0.707106781187
- . . .
- P 4 / m r S
- @end group
- @end smallexample
- Likewise, inverse trigonometric functions generate results in
- either radians or degrees, depending on the current angular mode.
- @smallexample
- @group
- 1: 0.707106781187 1: 0.785398163398 1: 45.
- . . .
- .5 Q m r I S m d U I S
- @end group
- @end smallexample
- @noindent
- Here we compute the Inverse Sine of @c{$\sqrt{0.5}$}
- @cite{sqrt(0.5)}, first in
- radians, then in degrees.
- Use @kbd{c d} and @kbd{c r} to convert a number from radians to degrees
- and vice-versa.
- @smallexample
- @group
- 1: 45 1: 0.785398163397 1: 45.
- . . .
- 45 c r c d
- @end group
- @end smallexample
- Another interesting mode is @dfn{fraction mode}. Normally,
- dividing two integers produces a floating-point result if the
- quotient can't be expressed as an exact integer. Fraction mode
- causes integer division to produce a fraction, i.e., a rational
- number, instead.
- @smallexample
- @group
- 2: 12 1: 1.33333333333 1: 4:3
- 1: 9 . .
- .
- 12 @key{RET} 9 / m f U / m f
- @end group
- @end smallexample
- @noindent
- In the first case, we get an approximate floating-point result.
- In the second case, we get an exact fractional result (four-thirds).
- You can enter a fraction at any time using @kbd{:} notation.
- (Calc uses @kbd{:} instead of @kbd{/} as the fraction separator
- because @kbd{/} is already used to divide the top two stack
- elements.) Calculations involving fractions will always
- produce exact fractional results; fraction mode only says
- what to do when dividing two integers.
- @cindex Fractions vs. floats
- @cindex Floats vs. fractions
- (@bullet{}) @strong{Exercise 4.} If fractional arithmetic is exact,
- why would you ever use floating-point numbers instead?
- @xref{Modes Answer 4, 4}. (@bullet{})
- Typing @kbd{m f} doesn't change any existing values in the stack.
- In the above example, we had to Undo the division and do it over
- again when we changed to fraction mode. But if you use the
- evaluates-to operator you can get commands like @kbd{m f} to
- recompute for you.
- @smallexample
- @group
- 1: 12 / 9 => 1.33333333333 1: 12 / 9 => 1.333 1: 12 / 9 => 4:3
- . . .
- ' 12/9 => @key{RET} p 4 @key{RET} m f
- @end group
- @end smallexample
- @noindent
- In this example, the righthand side of the @samp{=>} operator
- on the stack is recomputed when we change the precision, then
- again when we change to fraction mode. All @samp{=>} expressions
- on the stack are recomputed every time you change any mode that
- might affect their values.
- @node Arithmetic Tutorial, Vector/Matrix Tutorial, Basic Tutorial, Tutorial
- @section Arithmetic Tutorial
- @noindent
- In this section, we explore the arithmetic and scientific functions
- available in the Calculator.
- The standard arithmetic commands are @kbd{+}, @kbd{-}, @kbd{*}, @kbd{/},
- and @kbd{^}. Each normally takes two numbers from the top of the stack
- and pushes back a result. The @kbd{n} and @kbd{&} keys perform
- change-sign and reciprocal operations, respectively.
- @smallexample
- @group
- 1: 5 1: 0.2 1: 5. 1: -5. 1: 5.
- . . . . .
- 5 & & n n
- @end group
- @end smallexample
- @cindex Binary operators
- You can apply a ``binary operator'' like @kbd{+} across any number of
- stack entries by giving it a numeric prefix. You can also apply it
- pairwise to several stack elements along with the top one if you use
- a negative prefix.
- @smallexample
- @group
- 3: 2 1: 9 3: 2 4: 2 3: 12
- 2: 3 . 2: 3 3: 3 2: 13
- 1: 4 1: 4 2: 4 1: 14
- . . 1: 10 .
- .
- 2 @key{RET} 3 @key{RET} 4 M-3 + U 10 M-- M-3 +
- @end group
- @end smallexample
- @cindex Unary operators
- You can apply a ``unary operator'' like @kbd{&} to the top @var{n}
- stack entries with a numeric prefix, too.
- @smallexample
- @group
- 3: 2 3: 0.5 3: 0.5
- 2: 3 2: 0.333333333333 2: 3.
- 1: 4 1: 0.25 1: 4.
- . . .
- 2 @key{RET} 3 @key{RET} 4 M-3 & M-2 &
- @end group
- @end smallexample
- Notice that the results here are left in floating-point form.
- We can convert them back to integers by pressing @kbd{F}, the
- ``floor'' function. This function rounds down to the next lower
- integer. There is also @kbd{R}, which rounds to the nearest
- integer.
- @smallexample
- @group
- 7: 2. 7: 2 7: 2
- 6: 2.4 6: 2 6: 2
- 5: 2.5 5: 2 5: 3
- 4: 2.6 4: 2 4: 3
- 3: -2. 3: -2 3: -2
- 2: -2.4 2: -3 2: -2
- 1: -2.6 1: -3 1: -3
- . . .
- M-7 F U M-7 R
- @end group
- @end smallexample
- Since dividing-and-flooring (i.e., ``integer quotient'') is such a
- common operation, Calc provides a special command for that purpose, the
- backslash @kbd{\}. Another common arithmetic operator is @kbd{%}, which
- computes the remainder that would arise from a @kbd{\} operation, i.e.,
- the ``modulo'' of two numbers. For example,
- @smallexample
- @group
- 2: 1234 1: 12 2: 1234 1: 34
- 1: 100 . 1: 100 .
- . .
- 1234 @key{RET} 100 \ U %
- @end group
- @end smallexample
- These commands actually work for any real numbers, not just integers.
- @smallexample
- @group
- 2: 3.1415 1: 3 2: 3.1415 1: 0.1415
- 1: 1 . 1: 1 .
- . .
- 3.1415 @key{RET} 1 \ U %
- @end group
- @end smallexample
- (@bullet{}) @strong{Exercise 1.} The @kbd{\} command would appear to be a
- frill, since you could always do the same thing with @kbd{/ F}. Think
- of a situation where this is not true---@kbd{/ F} would be inadequate.
- Now think of a way you could get around the problem if Calc didn't
- provide a @kbd{\} command. @xref{Arithmetic Answer 1, 1}. (@bullet{})
- We've already seen the @kbd{Q} (square root) and @kbd{S} (sine)
- commands. Other commands along those lines are @kbd{C} (cosine),
- @kbd{T} (tangent), @kbd{E} (@cite{e^x}) and @kbd{L} (natural
- logarithm). These can be modified by the @kbd{I} (inverse) and
- @kbd{H} (hyperbolic) prefix keys.
- Let's compute the sine and cosine of an angle, and verify the
- identity @c{$\sin^2x + \cos^2x = 1$}
- @cite{sin(x)^2 + cos(x)^2 = 1}. We'll
- arbitrarily pick @i{-64} degrees as a good value for @cite{x}. With
- the angular mode set to degrees (type @w{@kbd{m d}}), do:
- @smallexample
- @group
- 2: -64 2: -64 2: -0.89879 2: -0.89879 1: 1.
- 1: -64 1: -0.89879 1: -64 1: 0.43837 .
- . . . .
- 64 n @key{RET} @key{RET} S @key{TAB} C f h
- @end group
- @end smallexample
- @noindent
- (For brevity, we're showing only five digits of the results here.
- You can of course do these calculations to any precision you like.)
- Remember, @kbd{f h} is the @code{calc-hypot}, or square-root of sum
- of squares, command.
- Another identity is @c{$\displaystyle\tan x = {\sin x \over \cos x}$}
- @cite{tan(x) = sin(x) / cos(x)}.
- @smallexample
- @group
- 2: -0.89879 1: -2.0503 1: -64.
- 1: 0.43837 . .
- .
- U / I T
- @end group
- @end smallexample
- A physical interpretation of this calculation is that if you move
- @cite{0.89879} units downward and @cite{0.43837} units to the right,
- your direction of motion is @i{-64} degrees from horizontal. Suppose
- we move in the opposite direction, up and to the left:
- @smallexample
- @group
- 2: -0.89879 2: 0.89879 1: -2.0503 1: -64.
- 1: 0.43837 1: -0.43837 . .
- . .
- U U M-2 n / I T
- @end group
- @end smallexample
- @noindent
- How can the angle be the same? The answer is that the @kbd{/} operation
- loses information about the signs of its inputs. Because the quotient
- is negative, we know exactly one of the inputs was negative, but we
- can't tell which one. There is an @kbd{f T} [@code{arctan2}] function which
- computes the inverse tangent of the quotient of a pair of numbers.
- Since you feed it the two original numbers, it has enough information
- to give you a full 360-degree answer.
- @smallexample
- @group
- 2: 0.89879 1: 116. 3: 116. 2: 116. 1: 180.
- 1: -0.43837 . 2: -0.89879 1: -64. .
- . 1: 0.43837 .
- .
- U U f T M-@key{RET} M-2 n f T -
- @end group
- @end smallexample
- @noindent
- The resulting angles differ by 180 degrees; in other words, they
- point in opposite directions, just as we would expect.
- The @key{META}-@key{RET} we used in the third step is the
- ``last-arguments'' command. It is sort of like Undo, except that it
- restores the arguments of the last command to the stack without removing
- the command's result. It is useful in situations like this one,
- where we need to do several operations on the same inputs. We could
- have accomplished the same thing by using @kbd{M-2 @key{RET}} to duplicate
- the top two stack elements right after the @kbd{U U}, then a pair of
- @kbd{M-@key{TAB}} commands to cycle the 116 up around the duplicates.
- A similar identity is supposed to hold for hyperbolic sines and cosines,
- except that it is the @emph{difference}
- @c{$\cosh^2x - \sinh^2x$}
- @cite{cosh(x)^2 - sinh(x)^2} that always equals one.
- Let's try to verify this identity.@refill
- @smallexample
- @group
- 2: -64 2: -64 2: -64 2: 9.7192e54 2: 9.7192e54
- 1: -64 1: -3.1175e27 1: 9.7192e54 1: -64 1: 9.7192e54
- . . . . .
- 64 n @key{RET} @key{RET} H C 2 ^ @key{TAB} H S 2 ^
- @end group
- @end smallexample
- @noindent
- @cindex Roundoff errors, examples
- Something's obviously wrong, because when we subtract these numbers
- the answer will clearly be zero! But if you think about it, if these
- numbers @emph{did} differ by one, it would be in the 55th decimal
- place. The difference we seek has been lost entirely to roundoff
- error.
- We could verify this hypothesis by doing the actual calculation with,
- say, 60 decimal places of precision. This will be slow, but not
- enormously so. Try it if you wish; sure enough, the answer is
- 0.99999, reasonably close to 1.
- Of course, a more reasonable way to verify the identity is to use
- a more reasonable value for @cite{x}!
- @cindex Common logarithm
- Some Calculator commands use the Hyperbolic prefix for other purposes.
- The logarithm and exponential functions, for example, work to the base
- @cite{e} normally but use base-10 instead if you use the Hyperbolic
- prefix.
- @smallexample
- @group
- 1: 1000 1: 6.9077 1: 1000 1: 3
- . . . .
- 1000 L U H L
- @end group
- @end smallexample
- @noindent
- First, we mistakenly compute a natural logarithm. Then we undo
- and compute a common logarithm instead.
- The @kbd{B} key computes a general base-@var{b} logarithm for any
- value of @var{b}.
- @smallexample
- @group
- 2: 1000 1: 3 1: 1000. 2: 1000. 1: 6.9077
- 1: 10 . . 1: 2.71828 .
- . .
- 1000 @key{RET} 10 B H E H P B
- @end group
- @end smallexample
- @noindent
- Here we first use @kbd{B} to compute the base-10 logarithm, then use
- the ``hyperbolic'' exponential as a cheap hack to recover the number
- 1000, then use @kbd{B} again to compute the natural logarithm. Note
- that @kbd{P} with the hyperbolic prefix pushes the constant @cite{e}
- onto the stack.
- You may have noticed that both times we took the base-10 logarithm
- of 1000, we got an exact integer result. Calc always tries to give
- an exact rational result for calculations involving rational numbers
- where possible. But when we used @kbd{H E}, the result was a
- floating-point number for no apparent reason. In fact, if we had
- computed @kbd{10 @key{RET} 3 ^} we @emph{would} have gotten an
- exact integer 1000. But the @kbd{H E} command is rigged to generate
- a floating-point result all of the time so that @kbd{1000 H E} will
- not waste time computing a thousand-digit integer when all you
- probably wanted was @samp{1e1000}.
- (@bullet{}) @strong{Exercise 2.} Find a pair of integer inputs to
- the @kbd{B} command for which Calc could find an exact rational
- result but doesn't. @xref{Arithmetic Answer 2, 2}. (@bullet{})
- The Calculator also has a set of functions relating to combinatorics
- and statistics. You may be familiar with the @dfn{factorial} function,
- which computes the product of all the integers up to a given number.
- @smallexample
- @group
- 1: 100 1: 93326215443... 1: 100. 1: 9.3326e157
- . . . .
- 100 ! U c f !
- @end group
- @end smallexample
- @noindent
- Recall, the @kbd{c f} command converts the integer or fraction at the
- top of the stack to floating-point format. If you take the factorial
- of a floating-point number, you get a floating-point result
- accurate to the current precision. But if you give @kbd{!} an
- exact integer, you get an exact integer result (158 digits long
- in this case).
- If you take the factorial of a non-integer, Calc uses a generalized
- factorial function defined in terms of Euler's Gamma function
- @c{$\Gamma(n)$}
- @cite{gamma(n)}
- (which is itself available as the @kbd{f g} command).
- @smallexample
- @group
- 3: 4. 3: 24. 1: 5.5 1: 52.342777847
- 2: 4.5 2: 52.3427777847 . .
- 1: 5. 1: 120.
- . .
- M-3 ! M-0 @key{DEL} 5.5 f g
- @end group
- @end smallexample
- @noindent
- Here we verify the identity @c{$n! = \Gamma(n+1)$}
- @cite{@var{n}!@: = gamma(@var{n}+1)}.
- The binomial coefficient @var{n}-choose-@var{m}@c{ or $\displaystyle {n \choose m}$}
- @asis{} is defined by
- @c{$\displaystyle {n! \over m! \, (n-m)!}$}
- @cite{n!@: / m!@: (n-m)!} for all reals @cite{n} and
- @cite{m}. The intermediate results in this formula can become quite
- large even if the final result is small; the @kbd{k c} command computes
- a binomial coefficient in a way that avoids large intermediate
- values.
- The @kbd{k} prefix key defines several common functions out of
- combinatorics and number theory. Here we compute the binomial
- coefficient 30-choose-20, then determine its prime factorization.
- @smallexample
- @group
- 2: 30 1: 30045015 1: [3, 3, 5, 7, 11, 13, 23, 29]
- 1: 20 . .
- .
- 30 @key{RET} 20 k c k f
- @end group
- @end smallexample
- @noindent
- You can verify these prime factors by using @kbd{v u} to ``unpack''
- this vector into 8 separate stack entries, then @kbd{M-8 *} to
- multiply them back together. The result is the original number,
- 30045015.
- @cindex Hash tables
- Suppose a program you are writing needs a hash table with at least
- 10000 entries. It's best to use a prime number as the actual size
- of a hash table. Calc can compute the next prime number after 10000:
- @smallexample
- @group
- 1: 10000 1: 10007 1: 9973
- . . .
- 10000 k n I k n
- @end group
- @end smallexample
- @noindent
- Just for kicks we've also computed the next prime @emph{less} than
- 10000.
- @c [fix-ref Financial Functions]
- @xref{Financial Functions}, for a description of the Calculator
- commands that deal with business and financial calculations (functions
- like @code{pv}, @code{rate}, and @code{sln}).
- @c [fix-ref Binary Number Functions]
- @xref{Binary Functions}, to read about the commands for operating
- on binary numbers (like @code{and}, @code{xor}, and @code{lsh}).
- @node Vector/Matrix Tutorial, Types Tutorial, Arithmetic Tutorial, Tutorial
- @section Vector/Matrix Tutorial
- @noindent
- A @dfn{vector} is a list of numbers or other Calc data objects.
- Calc provides a large set of commands that operate on vectors. Some
- are familiar operations from vector analysis. Others simply treat
- a vector as a list of objects.
- @menu
- * Vector Analysis Tutorial::
- * Matrix Tutorial::
- * List Tutorial::
- @end menu
- @node Vector Analysis Tutorial, Matrix Tutorial, Vector/Matrix Tutorial, Vector/Matrix Tutorial
- @subsection Vector Analysis
- @noindent
- If you add two vectors, the result is a vector of the sums of the
- elements, taken pairwise.
- @smallexample
- @group
- 1: [1, 2, 3] 2: [1, 2, 3] 1: [8, 8, 3]
- . 1: [7, 6, 0] .
- .
- [1,2,3] s 1 [7 6 0] s 2 +
- @end group
- @end smallexample
- @noindent
- Note that we can separate the vector elements with either commas or
- spaces. This is true whether we are using incomplete vectors or
- algebraic entry. The @kbd{s 1} and @kbd{s 2} commands save these
- vectors so we can easily reuse them later.
- If you multiply two vectors, the result is the sum of the products
- of the elements taken pairwise. This is called the @dfn{dot product}
- of the vectors.
- @smallexample
- @group
- 2: [1, 2, 3] 1: 19
- 1: [7, 6, 0] .
- .
- r 1 r 2 *
- @end group
- @end smallexample
- @cindex Dot product
- The dot product of two vectors is equal to the product of their
- lengths times the cosine of the angle between them. (Here the vector
- is interpreted as a line from the origin @cite{(0,0,0)} to the
- specified point in three-dimensional space.) The @kbd{A}
- (absolute value) command can be used to compute the length of a
- vector.
- @smallexample
- @group
- 3: 19 3: 19 1: 0.550782 1: 56.579
- 2: [1, 2, 3] 2: 3.741657 . .
- 1: [7, 6, 0] 1: 9.219544
- . .
- M-@key{RET} M-2 A * / I C
- @end group
- @end smallexample
- @noindent
- First we recall the arguments to the dot product command, then
- we compute the absolute values of the top two stack entries to
- obtain the lengths of the vectors, then we divide the dot product
- by the product of the lengths to get the cosine of the angle.
- The inverse cosine finds that the angle between the vectors
- is about 56 degrees.
- @cindex Cross product
- @cindex Perpendicular vectors
- The @dfn{cross product} of two vectors is a vector whose length
- is the product of the lengths of the inputs times the sine of the
- angle between them, and whose direction is perpendicular to both
- input vectors. Unlike the dot product, the cross product is
- defined only for three-dimensional vectors. Let's double-check
- our computation of the angle using the cross product.
- @smallexample
- @group
- 2: [1, 2, 3] 3: [-18, 21, -8] 1: [-0.52, 0.61, -0.23] 1: 56.579
- 1: [7, 6, 0] 2: [1, 2, 3] . .
- . 1: [7, 6, 0]
- .
- r 1 r 2 V C s 3 M-@key{RET} M-2 A * / A I S
- @end group
- @end smallexample
- @noindent
- First we recall the original vectors and compute their cross product,
- which we also store for later reference. Now we divide the vector
- by the product of the lengths of the original vectors. The length of
- this vector should be the sine of the angle; sure enough, it is!
- @c [fix-ref General Mode Commands]
- Vector-related commands generally begin with the @kbd{v} prefix key.
- Some are uppercase letters and some are lowercase. To make it easier
- to type these commands, the shift-@kbd{V} prefix key acts the same as
- the @kbd{v} key. (@xref{General Mode Commands}, for a way to make all
- prefix keys have this property.)
- If we take the dot product of two perpendicular vectors we expect
- to get zero, since the cosine of 90 degrees is zero. Let's check
- that the cross product is indeed perpendicular to both inputs:
- @smallexample
- @group
- 2: [1, 2, 3] 1: 0 2: [7, 6, 0] 1: 0
- 1: [-18, 21, -8] . 1: [-18, 21, -8] .
- . .
- r 1 r 3 * @key{DEL} r 2 r 3 *
- @end group
- @end smallexample
- @cindex Normalizing a vector
- @cindex Unit vectors
- (@bullet{}) @strong{Exercise 1.} Given a vector on the top of the
- stack, what keystrokes would you use to @dfn{normalize} the
- vector, i.e., to reduce its length to one without changing its
- direction? @xref{Vector Answer 1, 1}. (@bullet{})
- (@bullet{}) @strong{Exercise 2.} Suppose a certain particle can be
- at any of several positions along a ruler. You have a list of
- those positions in the form of a vector, and another list of the
- probabilities for the particle to be at the corresponding positions.
- Find the average position of the particle.
- @xref{Vector Answer 2, 2}. (@bullet{})
- @node Matrix Tutorial, List Tutorial, Vector Analysis Tutorial, Vector/Matrix Tutorial
- @subsection Matrices
- @noindent
- A @dfn{matrix} is just a vector of vectors, all the same length.
- This means you can enter a matrix using nested brackets. You can
- also use the semicolon character to enter a matrix. We'll show
- both methods here:
- @smallexample
- @group
- 1: [ [ 1, 2, 3 ] 1: [ [ 1, 2, 3 ]
- [ 4, 5, 6 ] ] [ 4, 5, 6 ] ]
- . .
- [[1 2 3] [4 5 6]] ' [1 2 3; 4 5 6] @key{RET}
- @end group
- @end smallexample
- @noindent
- We'll be using this matrix again, so type @kbd{s 4} to save it now.
- Note that semicolons work with incomplete vectors, but they work
- better in algebraic entry. That's why we use the apostrophe in
- the second example.
- When two matrices are multiplied, the lefthand matrix must have
- the same number of columns as the righthand matrix has rows.
- Row @cite{i}, column @cite{j} of the result is effectively the
- dot product of row @cite{i} of the left matrix by column @cite{j}
- of the right matrix.
- If we try to duplicate this matrix and multiply it by itself,
- the dimensions are wrong and the multiplication cannot take place:
- @smallexample
- @group
- 1: [ [ 1, 2, 3 ] * [ [ 1, 2, 3 ]
- [ 4, 5, 6 ] ] [ 4, 5, 6 ] ]
- .
- @key{RET} *
- @end group
- @end smallexample
- @noindent
- Though rather hard to read, this is a formula which shows the product
- of two matrices. The @samp{*} function, having invalid arguments, has
- been left in symbolic form.
- We can multiply the matrices if we @dfn{transpose} one of them first.
- @smallexample
- @group
- 2: [ [ 1, 2, 3 ] 1: [ [ 14, 32 ] 1: [ [ 17, 22, 27 ]
- [ 4, 5, 6 ] ] [ 32, 77 ] ] [ 22, 29, 36 ]
- 1: [ [ 1, 4 ] . [ 27, 36, 45 ] ]
- [ 2, 5 ] .
- [ 3, 6 ] ]
- .
- U v t * U @key{TAB} *
- @end group
- @end smallexample
- Matrix multiplication is not commutative; indeed, switching the
- order of the operands can even change the dimensions of the result
- matrix, as happened here!
- If you multiply a plain vector by a matrix, it is treated as a
- single row or column depending on which side of the matrix it is
- on. The result is a plain vector which should also be interpreted
- as a row or column as appropriate.
- @smallexample
- @group
- 2: [ [ 1, 2, 3 ] 1: [14, 32]
- [ 4, 5, 6 ] ] .
- 1: [1, 2, 3]
- .
- r 4 r 1 *
- @end group
- @end smallexample
- Multiplying in the other order wouldn't work because the number of
- rows in the matrix is different from the number of elements in the
- vector.
- (@bullet{}) @strong{Exercise 1.} Use @samp{*} to sum along the rows
- of the above @c{$2\times3$}
- @asis{2x3} matrix to get @cite{[6, 15]}. Now use @samp{*} to
- sum along the columns to get @cite{[5, 7, 9]}.
- @xref{Matrix Answer 1, 1}. (@bullet{})
- @cindex Identity matrix
- An @dfn{identity matrix} is a square matrix with ones along the
- diagonal and zeros elsewhere. It has the property that multiplication
- by an identity matrix, on the left or on the right, always produces
- the original matrix.
- @smallexample
- @group
- 1: [ [ 1, 2, 3 ] 2: [ [ 1, 2, 3 ] 1: [ [ 1, 2, 3 ]
- [ 4, 5, 6 ] ] [ 4, 5, 6 ] ] [ 4, 5, 6 ] ]
- . 1: [ [ 1, 0, 0 ] .
- [ 0, 1, 0 ]
- [ 0, 0, 1 ] ]
- .
- r 4 v i 3 @key{RET} *
- @end group
- @end smallexample
- If a matrix is square, it is often possible to find its @dfn{inverse},
- that is, a matrix which, when multiplied by the original matrix, yields
- an identity matrix. The @kbd{&} (reciprocal) key also computes the
- inverse of a matrix.
- @smallexample
- @group
- 1: [ [ 1, 2, 3 ] 1: [ [ -2.4, 1.2, -0.2 ]
- [ 4, 5, 6 ] [ 2.8, -1.4, 0.4 ]
- [ 7, 6, 0 ] ] [ -0.73333, 0.53333, -0.2 ] ]
- . .
- r 4 r 2 | s 5 &
- @end group
- @end smallexample
- @noindent
- The vertical bar @kbd{|} @dfn{concatenates} numbers, vectors, and
- matrices together. Here we have used it to add a new row onto
- our matrix to make it square.
- We can multiply these two matrices in either order to get an identity.
- @smallexample
- @group
- 1: [ [ 1., 0., 0. ] 1: [ [ 1., 0., 0. ]
- [ 0., 1., 0. ] [ 0., 1., 0. ]
- [ 0., 0., 1. ] ] [ 0., 0., 1. ] ]
- . .
- M-@key{RET} * U @key{TAB} *
- @end group
- @end smallexample
- @cindex Systems of linear equations
- @cindex Linear equations, systems of
- Matrix inverses are related to systems of linear equations in algebra.
- Suppose we had the following set of equations:
- @ifinfo
- @group
- @example
- a + 2b + 3c = 6
- 4a + 5b + 6c = 2
- 7a + 6b = 3
- @end example
- @end group
- @end ifinfo
- @tex
- \turnoffactive
- \beforedisplayh
- $$ \openup1\jot \tabskip=0pt plus1fil
- \halign to\displaywidth{\tabskip=0pt
- $\hfil#$&$\hfil{}#{}$&
- $\hfil#$&$\hfil{}#{}$&
- $\hfil#$&${}#\hfil$\tabskip=0pt plus1fil\cr
- a&+&2b&+&3c&=6 \cr
- 4a&+&5b&+&6c&=2 \cr
- 7a&+&6b& & &=3 \cr}
- $$
- \afterdisplayh
- @end tex
- @noindent
- This can be cast into the matrix equation,
- @ifinfo
- @group
- @example
- [ [ 1, 2, 3 ] [ [ a ] [ [ 6 ]
- [ 4, 5, 6 ] * [ b ] = [ 2 ]
- [ 7, 6, 0 ] ] [ c ] ] [ 3 ] ]
- @end example
- @end group
- @end ifinfo
- @tex
- \turnoffactive
- \beforedisplay
- $$ \pmatrix{ 1 & 2 & 3 \cr 4 & 5 & 6 \cr 7 & 6 & 0 }
- \times
- \pmatrix{ a \cr b \cr c } = \pmatrix{ 6 \cr 2 \cr 3 }
- $$
- \afterdisplay
- @end tex
- We can solve this system of equations by multiplying both sides by the
- inverse of the matrix. Calc can do this all in one step:
- @smallexample
- @group
- 2: [6, 2, 3] 1: [-12.6, 15.2, -3.93333]
- 1: [ [ 1, 2, 3 ] .
- [ 4, 5, 6 ]
- [ 7, 6, 0 ] ]
- .
- [6,2,3] r 5 /
- @end group
- @end smallexample
- @noindent
- The result is the @cite{[a, b, c]} vector that solves the equations.
- (Dividing by a square matrix is equivalent to multiplying by its
- inverse.)
- Let's verify this solution:
- @smallexample
- @group
- 2: [ [ 1, 2, 3 ] 1: [6., 2., 3.]
- [ 4, 5, 6 ] .
- [ 7, 6, 0 ] ]
- 1: [-12.6, 15.2, -3.93333]
- .
- r 5 @key{TAB} *
- @end group
- @end smallexample
- @noindent
- Note that we had to be careful about the order in which we multiplied
- the matrix and vector. If we multiplied in the other order, Calc would
- assume the vector was a row vector in order to make the dimensions
- come out right, and the answer would be incorrect. If you
- don't feel safe letting Calc take either interpretation of your
- vectors, use explicit @c{$N\times1$}
- @asis{Nx1} or @c{$1\times N$}
- @asis{1xN} matrices instead.
- In this case, you would enter the original column vector as
- @samp{[[6], [2], [3]]} or @samp{[6; 2; 3]}.
- (@bullet{}) @strong{Exercise 2.} Algebraic entry allows you to make
- vectors and matrices that include variables. Solve the following
- system of equations to get expressions for @cite{x} and @cite{y}
- in terms of @cite{a} and @cite{b}.
- @ifinfo
- @group
- @example
- x + a y = 6
- x + b y = 10
- @end example
- @end group
- @end ifinfo
- @tex
- \turnoffactive
- \beforedisplay
- $$ \eqalign{ x &+ a y = 6 \cr
- x &+ b y = 10}
- $$
- \afterdisplay
- @end tex
- @noindent
- @xref{Matrix Answer 2, 2}. (@bullet{})
- @cindex Least-squares for over-determined systems
- @cindex Over-determined systems of equations
- (@bullet{}) @strong{Exercise 3.} A system of equations is ``over-determined''
- if it has more equations than variables. It is often the case that
- there are no values for the variables that will satisfy all the
- equations at once, but it is still useful to find a set of values
- which ``nearly'' satisfy all the equations. In terms of matrix equations,
- you can't solve @cite{A X = B} directly because the matrix @cite{A}
- is not square for an over-determined system. Matrix inversion works
- only for square matrices. One common trick is to multiply both sides
- on the left by the transpose of @cite{A}:
- @ifinfo
- @samp{trn(A)*A*X = trn(A)*B}.
- @end ifinfo
- @tex
- \turnoffactive
- $A^T A \, X = A^T B$, where $A^T$ is the transpose \samp{trn(A)}.
- @end tex
- Now @c{$A^T A$}
- @cite{trn(A)*A} is a square matrix so a solution is possible. It
- turns out that the @cite{X} vector you compute in this way will be a
- ``least-squares'' solution, which can be regarded as the ``closest''
- solution to the set of equations. Use Calc to solve the following
- over-determined system:@refill
- @ifinfo
- @group
- @example
- a + 2b + 3c = 6
- 4a + 5b + 6c = 2
- 7a + 6b = 3
- 2a + 4b + 6c = 11
- @end example
- @end group
- @end ifinfo
- @tex
- \turnoffactive
- \beforedisplayh
- $$ \openup1\jot \tabskip=0pt plus1fil
- \halign to\displaywidth{\tabskip=0pt
- $\hfil#$&$\hfil{}#{}$&
- $\hfil#$&$\hfil{}#{}$&
- $\hfil#$&${}#\hfil$\tabskip=0pt plus1fil\cr
- a&+&2b&+&3c&=6 \cr
- 4a&+&5b&+&6c&=2 \cr
- 7a&+&6b& & &=3 \cr
- 2a&+&4b&+&6c&=11 \cr}
- $$
- \afterdisplayh
- @end tex
- @noindent
- @xref{Matrix Answer 3, 3}. (@bullet{})
- @node List Tutorial, , Matrix Tutorial, Vector/Matrix Tutorial
- @subsection Vectors as Lists
- @noindent
- @cindex Lists
- Although Calc has a number of features for manipulating vectors and
- matrices as mathematical objects, you can also treat vectors as
- simple lists of values. For example, we saw that the @kbd{k f}
- command returns a vector which is a list of the prime factors of a
- number.
- You can pack and unpack stack entries into vectors:
- @smallexample
- @group
- 3: 10 1: [10, 20, 30] 3: 10
- 2: 20 . 2: 20
- 1: 30 1: 30
- . .
- M-3 v p v u
- @end group
- @end smallexample
- You can also build vectors out of consecutive integers, or out
- of many copies of a given value:
- @smallexample
- @group
- 1: [1, 2, 3, 4] 2: [1, 2, 3, 4] 2: [1, 2, 3, 4]
- . 1: 17 1: [17, 17, 17, 17]
- . .
- v x 4 @key{RET} 17 v b 4 @key{RET}
- @end group
- @end smallexample
- You can apply an operator to every element of a vector using the
- @dfn{map} command.
- @smallexample
- @group
- 1: [17, 34, 51, 68] 1: [289, 1156, 2601, 4624] 1: [17, 34, 51, 68]
- . . .
- V M * 2 V M ^ V M Q
- @end group
- @end smallexample
- @noindent
- In the first step, we multiply the vector of integers by the vector
- of 17's elementwise. In the second step, we raise each element to
- the power two. (The general rule is that both operands must be
- vectors of the same length, or else one must be a vector and the
- other a plain number.) In the final step, we take the square root
- of each element.
- (@bullet{}) @strong{Exercise 1.} Compute a vector of powers of two
- from @c{$2^{-4}$}
- @cite{2^-4} to @cite{2^4}. @xref{List Answer 1, 1}. (@bullet{})
- You can also @dfn{reduce} a binary operator across a vector.
- For example, reducing @samp{*} computes the product of all the
- elements in the vector:
- @smallexample
- @group
- 1: 123123 1: [3, 7, 11, 13, 41] 1: 123123
- . . .
- 123123 k f V R *
- @end group
- @end smallexample
- @noindent
- In this example, we decompose 123123 into its prime factors, then
- multiply those factors together again to yield the original number.
- We could compute a dot product ``by hand'' using mapping and
- reduction:
- @smallexample
- @group
- 2: [1, 2, 3] 1: [7, 12, 0] 1: 19
- 1: [7, 6, 0] . .
- .
- r 1 r 2 V M * V R +
- @end group
- @end smallexample
- @noindent
- Recalling two vectors from the previous section, we compute the
- sum of pairwise products of the elements to get the same answer
- for the dot product as before.
- A slight variant of vector reduction is the @dfn{accumulate} operation,
- @kbd{V U}. This produces a vector of the intermediate results from
- a corresponding reduction. Here we compute a table of factorials:
- @smallexample
- @group
- 1: [1, 2, 3, 4, 5, 6] 1: [1, 2, 6, 24, 120, 720]
- . .
- v x 6 @key{RET} V U *
- @end group
- @end smallexample
- Calc allows vectors to grow as large as you like, although it gets
- rather slow if vectors have more than about a hundred elements.
- Actually, most of the time is spent formatting these large vectors
- for display, not calculating on them. Try the following experiment
- (if your computer is very fast you may need to substitute a larger
- vector size).
- @smallexample
- @group
- 1: [1, 2, 3, 4, ... 1: [2, 3, 4, 5, ...
- . .
- v x 500 @key{RET} 1 V M +
- @end group
- @end smallexample
- Now press @kbd{v .} (the letter @kbd{v}, then a period) and try the
- experiment again. In @kbd{v .} mode, long vectors are displayed
- ``abbreviated'' like this:
- @smallexample
- @group
- 1: [1, 2, 3, ..., 500] 1: [2, 3, 4, ..., 501]
- . .
- v x 500 @key{RET} 1 V M +
- @end group
- @end smallexample
- @noindent
- (where now the @samp{...} is actually part of the Calc display).
- You will find both operations are now much faster. But notice that
- even in @w{@kbd{v .}} mode, the full vectors are still shown in the Trail.
- Type @w{@kbd{t .}} to cause the trail to abbreviate as well, and try the
- experiment one more time. Operations on long vectors are now quite
- fast! (But of course if you use @kbd{t .} you will lose the ability
- to get old vectors back using the @kbd{t y} command.)
- An easy way to view a full vector when @kbd{v .} mode is active is
- to press @kbd{`} (back-quote) to edit the vector; editing always works
- with the full, unabbreviated value.
- @cindex Least-squares for fitting a straight line
- @cindex Fitting data to a line
- @cindex Line, fitting data to
- @cindex Data, extracting from buffers
- @cindex Columns of data, extracting
- As a larger example, let's try to fit a straight line to some data,
- using the method of least squares. (Calc has a built-in command for
- least-squares curve fitting, but we'll do it by hand here just to
- practice working with vectors.) Suppose we have the following list
- of values in a file we have loaded into Emacs:
- @smallexample
- x y
- --- ---
- 1.34 0.234
- 1.41 0.298
- 1.49 0.402
- 1.56 0.412
- 1.64 0.466
- 1.73 0.473
- 1.82 0.601
- 1.91 0.519
- 2.01 0.603
- 2.11 0.637
- 2.22 0.645
- 2.33 0.705
- 2.45 0.917
- 2.58 1.009
- 2.71 0.971
- 2.85 1.062
- 3.00 1.148
- 3.15 1.157
- 3.32 1.354
- @end smallexample
- @noindent
- If you are reading this tutorial in printed form, you will find it
- easiest to press @kbd{M-# i} to enter the on-line Info version of
- the manual and find this table there. (Press @kbd{g}, then type
- @kbd{List Tutorial}, to jump straight to this section.)
- Position the cursor at the upper-left corner of this table, just
- to the left of the @cite{1.34}. Press @kbd{C-@@} to set the mark.
- (On your system this may be @kbd{C-2}, @kbd{C-@key{SPC}}, or @kbd{NUL}.)
- Now position the cursor to the lower-right, just after the @cite{1.354}.
- You have now defined this region as an Emacs ``rectangle.'' Still
- in the Info buffer, type @kbd{M-# r}. This command
- (@code{calc-grab-rectangle}) will pop you back into the Calculator, with
- the contents of the rectangle you specified in the form of a matrix.@refill
- @smallexample
- @group
- 1: [ [ 1.34, 0.234 ]
- [ 1.41, 0.298 ]
- @dots{}
- @end group
- @end smallexample
- @noindent
- (You may wish to use @kbd{v .} mode to abbreviate the display of this
- large matrix.)
- We want to treat this as a pair of lists. The first step is to
- transpose this matrix into a pair of rows. Remember, a matrix is
- just a vector of vectors. So we can unpack the matrix into a pair
- of row vectors on the stack.
- @smallexample
- @group
- 1: [ [ 1.34, 1.41, 1.49, ... ] 2: [1.34, 1.41, 1.49, ... ]
- [ 0.234, 0.298, 0.402, ... ] ] 1: [0.234, 0.298, 0.402, ... ]
- . .
- v t v u
- @end group
- @end smallexample
- @noindent
- Let's store these in quick variables 1 and 2, respectively.
- @smallexample
- @group
- 1: [1.34, 1.41, 1.49, ... ] .
- .
- t 2 t 1
- @end group
- @end smallexample
- @noindent
- (Recall that @kbd{t 2} is a variant of @kbd{s 2} that removes the
- stored value from the stack.)
- In a least squares fit, the slope @cite{m} is given by the formula
- @ifinfo
- @example
- m = (N sum(x y) - sum(x) sum(y)) / (N sum(x^2) - sum(x)^2)
- @end example
- @end ifinfo
- @tex
- \turnoffactive
- \beforedisplay
- $$ m = {N \sum x y - \sum x \sum y \over
- N \sum x^2 - \left( \sum x \right)^2} $$
- \afterdisplay
- @end tex
- @noindent
- where @c{$\sum x$}
- @cite{sum(x)} represents the sum of all the values of @cite{x}.
- While there is an actual @code{sum} function in Calc, it's easier to
- sum a vector using a simple reduction. First, let's compute the four
- different sums that this formula uses.
- @smallexample
- @group
- 1: 41.63 1: 98.0003
- . .
- r 1 V R + t 3 r 1 2 V M ^ V R + t 4
- @end group
- @end smallexample
- @noindent
- @smallexample
- @group
- 1: 13.613 1: 33.36554
- . .
- r 2 V R + t 5 r 1 r 2 V M * V R + t 6
- @end group
- @end smallexample
- @ifinfo
- @noindent
- These are @samp{sum(x)}, @samp{sum(x^2)}, @samp{sum(y)}, and @samp{sum(x y)},
- respectively. (We could have used @kbd{*} to compute @samp{sum(x^2)} and
- @samp{sum(x y)}.)
- @end ifinfo
- @tex
- \turnoffactive
- These are $\sum x$, $\sum x^2$, $\sum y$, and $\sum x y$,
- respectively. (We could have used \kbd{*} to compute $\sum x^2$ and
- $\sum x y$.)
- @end tex
- Finally, we also need @cite{N}, the number of data points. This is just
- the length of either of our lists.
- @smallexample
- @group
- 1: 19
- .
- r 1 v l t 7
- @end group
- @end smallexample
- @noindent
- (That's @kbd{v} followed by a lower-case @kbd{l}.)
- Now we grind through the formula:
- @smallexample
- @group
- 1: 633.94526 2: 633.94526 1: 67.23607
- . 1: 566.70919 .
- .
- r 7 r 6 * r 3 r 5 * -
- @end group
- @end smallexample
- @noindent
- @smallexample
- @group
- 2: 67.23607 3: 67.23607 2: 67.23607 1: 0.52141679
- 1: 1862.0057 2: 1862.0057 1: 128.9488 .
- . 1: 1733.0569 .
- .
- r 7 r 4 * r 3 2 ^ - / t 8
- @end group
- @end smallexample
- That gives us the slope @cite{m}. The y-intercept @cite{b} can now
- be found with the simple formula,
- @ifinfo
- @example
- b = (sum(y) - m sum(x)) / N
- @end example
- @end ifinfo
- @tex
- \turnoffactive
- \beforedisplay
- $$ b = {\sum y - m \sum x \over N} $$
- \afterdisplay
- \vskip10pt
- @end tex
- @smallexample
- @group
- 1: 13.613 2: 13.613 1: -8.09358 1: -0.425978
- . 1: 21.70658 . .
- .
- r 5 r 8 r 3 * - r 7 / t 9
- @end group
- @end smallexample
- Let's ``plot'' this straight line approximation, @c{$y \approx m x + b$}
- @cite{m x + b}, and compare it with the original data.@refill
- @smallexample
- @group
- 1: [0.699, 0.735, ... ] 1: [0.273, 0.309, ... ]
- . .
- r 1 r 8 * r 9 + s 0
- @end group
- @end smallexample
- @noindent
- Notice that multiplying a vector by a constant, and adding a constant
- to a vector, can be done without mapping commands since these are
- common operations from vector algebra. As far as Calc is concerned,
- we've just been doing geometry in 19-dimensional space!
- We can subtract this vector from our original @cite{y} vector to get
- a feel for the error of our fit. Let's find the maximum error:
- @smallexample
- @group
- 1: [0.0387, 0.0112, ... ] 1: [0.0387, 0.0112, ... ] 1: 0.0897
- . . .
- r 2 - V M A V R X
- @end group
- @end smallexample
- @noindent
- First we compute a vector of differences, then we take the absolute
- values of these differences, then we reduce the @code{max} function
- across the vector. (The @code{max} function is on the two-key sequence
- @kbd{f x}; because it is so common to use @code{max} in a vector
- operation, the letters @kbd{X} and @kbd{N} are also accepted for
- @code{max} and @code{min} in this context. In general, you answer
- the @kbd{V M} or @kbd{V R} prompt with the actual key sequence that
- invokes the function you want. You could have typed @kbd{V R f x} or
- even @kbd{V R x max @key{RET}} if you had preferred.)
- If your system has the GNUPLOT program, you can see graphs of your
- data and your straight line to see how well they match. (If you have
- GNUPLOT 3.0, the following instructions will work regardless of the
- kind of display you have. Some GNUPLOT 2.0, non-X-windows systems
- may require additional steps to view the graphs.)
- Let's start by plotting the original data. Recall the ``@var{x}'' and ``@var{y}''
- vectors onto the stack and press @kbd{g f}. This ``fast'' graphing
- command does everything you need to do for simple, straightforward
- plotting of data.
- @smallexample
- @group
- 2: [1.34, 1.41, 1.49, ... ]
- 1: [0.234, 0.298, 0.402, ... ]
- .
- r 1 r 2 g f
- @end group
- @end smallexample
- If all goes well, you will shortly get a new window containing a graph
- of the data. (If not, contact your GNUPLOT or Calc installer to find
- out what went wrong.) In the X window system, this will be a separate
- graphics window. For other kinds of displays, the default is to
- display the graph in Emacs itself using rough character graphics.
- Press @kbd{q} when you are done viewing the character graphics.
- Next, let's add the line we got from our least-squares fit:
- @smallexample
- @group
- 2: [1.34, 1.41, 1.49, ... ]
- 1: [0.273, 0.309, 0.351, ... ]
- .
- @key{DEL} r 0 g a g p
- @end group
- @end smallexample
- It's not very useful to get symbols to mark the data points on this
- second curve; you can type @kbd{g S g p} to remove them. Type @kbd{g q}
- when you are done to remove the X graphics window and terminate GNUPLOT.
- (@bullet{}) @strong{Exercise 2.} An earlier exercise showed how to do
- least squares fitting to a general system of equations. Our 19 data
- points are really 19 equations of the form @cite{y_i = m x_i + b} for
- different pairs of @cite{(x_i,y_i)}. Use the matrix-transpose method
- to solve for @cite{m} and @cite{b}, duplicating the above result.
- @xref{List Answer 2, 2}. (@bullet{})
- @cindex Geometric mean
- (@bullet{}) @strong{Exercise 3.} If the input data do not form a
- rectangle, you can use @w{@kbd{M-# g}} (@code{calc-grab-region})
- to grab the data the way Emacs normally works with regions---it reads
- left-to-right, top-to-bottom, treating line breaks the same as spaces.
- Use this command to find the geometric mean of the following numbers.
- (The geometric mean is the @var{n}th root of the product of @var{n} numbers.)
- @example
- 2.3 6 22 15.1 7
- 15 14 7.5
- 2.5
- @end example
- @noindent
- The @kbd{M-# g} command accepts numbers separated by spaces or commas,
- with or without surrounding vector brackets.
- @xref{List Answer 3, 3}. (@bullet{})
- @ifinfo
- As another example, a theorem about binomial coefficients tells
- us that the alternating sum of binomial coefficients
- @var{n}-choose-0 minus @var{n}-choose-1 plus @var{n}-choose-2, and so
- on up to @var{n}-choose-@var{n},
- always comes out to zero. Let's verify this
- for @cite{n=6}.@refill
- @end ifinfo
- @tex
- As another example, a theorem about binomial coefficients tells
- us that the alternating sum of binomial coefficients
- ${n \choose 0} - {n \choose 1} + {n \choose 2} - \cdots \pm {n \choose n}$
- always comes out to zero. Let's verify this
- for \cite{n=6}.
- @end tex
- @smallexample
- @group
- 1: [1, 2, 3, 4, 5, 6, 7] 1: [0, 1, 2, 3, 4, 5, 6]
- . .
- v x 7 @key{RET} 1 -
- @end group
- @end smallexample
- @noindent
- @smallexample
- @group
- 1: [1, -6, 15, -20, 15, -6, 1] 1: 0
- . .
- V M ' (-1)^$ choose(6,$) @key{RET} V R +
- @end group
- @end smallexample
- The @kbd{V M '} command prompts you to enter any algebraic expression
- to define the function to map over the vector. The symbol @samp{$}
- inside this expression represents the argument to the function.
- The Calculator applies this formula to each element of the vector,
- substituting each element's value for the @samp{$} sign(s) in turn.
- To define a two-argument function, use @samp{$$} for the first
- argument and @samp{$} for the second: @kbd{V M ' $$-$ @key{RET}} is
- equivalent to @kbd{V M -}. This is analogous to regular algebraic
- entry, where @samp{$$} would refer to the next-to-top stack entry
- and @samp{$} would refer to the top stack entry, and @kbd{' $$-$ @key{RET}}
- would act exactly like @kbd{-}.
- Notice that the @kbd{V M '} command has recorded two things in the
- trail: The result, as usual, and also a funny-looking thing marked
- @samp{oper} that represents the operator function you typed in.
- The function is enclosed in @samp{< >} brackets, and the argument is
- denoted by a @samp{#} sign. If there were several arguments, they
- would be shown as @samp{#1}, @samp{#2}, and so on. (For example,
- @kbd{V M ' $$-$} will put the function @samp{<#1 - #2>} on the
- trail.) This object is a ``nameless function''; you can use nameless
- @w{@samp{< >}} notation to answer the @kbd{V M '} prompt if you like.
- Nameless function notation has the interesting, occasionally useful
- property that a nameless function is not actually evaluated until
- it is used. For example, @kbd{V M ' $+random(2.0)} evaluates
- @samp{random(2.0)} once and adds that random number to all elements
- of the vector, but @kbd{V M ' <#+random(2.0)>} evaluates the
- @samp{random(2.0)} separately for each vector element.
- Another group of operators that are often useful with @kbd{V M} are
- the relational operators: @kbd{a =}, for example, compares two numbers
- and gives the result 1 if they are equal, or 0 if not. Similarly,
- @w{@kbd{a <}} checks for one number being less than another.
- Other useful vector operations include @kbd{v v}, to reverse a
- vector end-for-end; @kbd{V S}, to sort the elements of a vector
- into increasing order; and @kbd{v r} and @w{@kbd{v c}}, to extract
- one row or column of a matrix, or (in both cases) to extract one
- element of a plain vector. With a negative argument, @kbd{v r}
- and @kbd{v c} instead delete one row, column, or vector element.
- @cindex Divisor functions
- (@bullet{}) @strong{Exercise 4.} The @cite{k}th @dfn{divisor function}
- @tex
- $\sigma_k(n)$
- @end tex
- is the sum of the @cite{k}th powers of all the divisors of an
- integer @cite{n}. Figure out a method for computing the divisor
- function for reasonably small values of @cite{n}. As a test,
- the 0th and 1st divisor functions of 30 are 8 and 72, respectively.
- @xref{List Answer 4, 4}. (@bullet{})
- @cindex Square-free numbers
- @cindex Duplicate values in a list
- (@bullet{}) @strong{Exercise 5.} The @kbd{k f} command produces a
- list of prime factors for a number. Sometimes it is important to
- know that a number is @dfn{square-free}, i.e., that no prime occurs
- more than once in its list of prime factors. Find a sequence of
- keystrokes to tell if a number is square-free; your method should
- leave 1 on the stack if it is, or 0 if it isn't.
- @xref{List Answer 5, 5}. (@bullet{})
- @cindex Triangular lists
- (@bullet{}) @strong{Exercise 6.} Build a list of lists that looks
- like the following diagram. (You may wish to use the @kbd{v /}
- command to enable multi-line display of vectors.)
- @smallexample
- @group
- 1: [ [1],
- [1, 2],
- [1, 2, 3],
- [1, 2, 3, 4],
- [1, 2, 3, 4, 5],
- [1, 2, 3, 4, 5, 6] ]
- @end group
- @end smallexample
- @noindent
- @xref{List Answer 6, 6}. (@bullet{})
- (@bullet{}) @strong{Exercise 7.} Build the following list of lists.
- @smallexample
- @group
- 1: [ [0],
- [1, 2],
- [3, 4, 5],
- [6, 7, 8, 9],
- [10, 11, 12, 13, 14],
- [15, 16, 17, 18, 19, 20] ]
- @end group
- @end smallexample
- @noindent
- @xref{List Answer 7, 7}. (@bullet{})
- @cindex Maximizing a function over a list of values
- @c [fix-ref Numerical Solutions]
- (@bullet{}) @strong{Exercise 8.} Compute a list of values of Bessel's
- @c{$J_1(x)$}
- @cite{J1} function @samp{besJ(1,x)} for @cite{x} from 0 to 5
- in steps of 0.25.
- Find the value of @cite{x} (from among the above set of values) for
- which @samp{besJ(1,x)} is a maximum. Use an ``automatic'' method,
- i.e., just reading along the list by hand to find the largest value
- is not allowed! (There is an @kbd{a X} command which does this kind
- of thing automatically; @pxref{Numerical Solutions}.)
- @xref{List Answer 8, 8}. (@bullet{})@refill
- @cindex Digits, vectors of
- (@bullet{}) @strong{Exercise 9.} You are given an integer in the range
- @c{$0 \le N < 10^m$}
- @cite{0 <= N < 10^m} for @cite{m=12} (i.e., an integer of less than
- twelve digits). Convert this integer into a vector of @cite{m}
- digits, each in the range from 0 to 9. In vector-of-digits notation,
- add one to this integer to produce a vector of @cite{m+1} digits
- (since there could be a carry out of the most significant digit).
- Convert this vector back into a regular integer. A good integer
- to try is 25129925999. @xref{List Answer 9, 9}. (@bullet{})
- (@bullet{}) @strong{Exercise 10.} Your friend Joe tried to use
- @kbd{V R a =} to test if all numbers in a list were equal. What
- happened? How would you do this test? @xref{List Answer 10, 10}. (@bullet{})
- (@bullet{}) @strong{Exercise 11.} The area of a circle of radius one
- is @c{$\pi$}
- @cite{pi}. The area of the @c{$2\times2$}
- @asis{2x2} square that encloses that
- circle is 4. So if we throw @var{n} darts at random points in the square,
- about @c{$\pi/4$}
- @cite{pi/4} of them will land inside the circle. This gives us
- an entertaining way to estimate the value of @c{$\pi$}
- @cite{pi}. The @w{@kbd{k r}}
- command picks a random number between zero and the value on the stack.
- We could get a random floating-point number between @i{-1} and 1 by typing
- @w{@kbd{2.0 k r 1 -}}. Build a vector of 100 random @cite{(x,y)} points in
- this square, then use vector mapping and reduction to count how many
- points lie inside the unit circle. Hint: Use the @kbd{v b} command.
- @xref{List Answer 11, 11}. (@bullet{})
- @cindex Matchstick problem
- (@bullet{}) @strong{Exercise 12.} The @dfn{matchstick problem} provides
- another way to calculate @c{$\pi$}
- @cite{pi}. Say you have an infinite field
- of vertical lines with a spacing of one inch. Toss a one-inch matchstick
- onto the field. The probability that the matchstick will land crossing
- a line turns out to be @c{$2/\pi$}
- @cite{2/pi}. Toss 100 matchsticks to estimate
- @c{$\pi$}
- @cite{pi}. (If you want still more fun, the probability that the GCD
- (@w{@kbd{k g}}) of two large integers is one turns out to be @c{$6/\pi^2$}
- @cite{6/pi^2}.
- That provides yet another way to estimate @c{$\pi$}
- @cite{pi}.)
- @xref{List Answer 12, 12}. (@bullet{})
- (@bullet{}) @strong{Exercise 13.} An algebraic entry of a string in
- double-quote marks, @samp{"hello"}, creates a vector of the numerical
- (ASCII) codes of the characters (here, @cite{[104, 101, 108, 108, 111]}).
- Sometimes it is convenient to compute a @dfn{hash code} of a string,
- which is just an integer that represents the value of that string.
- Two equal strings have the same hash code; two different strings
- @dfn{probably} have different hash codes. (For example, Calc has
- over 400 function names, but Emacs can quickly find the definition for
- any given name because it has sorted the functions into ``buckets'' by
- their hash codes. Sometimes a few names will hash into the same bucket,
- but it is easier to search among a few names than among all the names.)
- One popular hash function is computed as follows: First set @cite{h = 0}.
- Then, for each character from the string in turn, set @cite{h = 3h + c_i}
- where @cite{c_i} is the character's ASCII code. If we have 511 buckets,
- we then take the hash code modulo 511 to get the bucket number. Develop a
- simple command or commands for converting string vectors into hash codes.
- The hash code for @samp{"Testing, 1, 2, 3"} is 1960915098, which modulo
- 511 is 121. @xref{List Answer 13, 13}. (@bullet{})
- (@bullet{}) @strong{Exercise 14.} The @kbd{H V R} and @kbd{H V U}
- commands do nested function evaluations. @kbd{H V U} takes a starting
- value and a number of steps @var{n} from the stack; it then applies the
- function you give to the starting value 0, 1, 2, up to @var{n} times
- and returns a vector of the results. Use this command to create a
- ``random walk'' of 50 steps. Start with the two-dimensional point
- @cite{(0,0)}; then take one step a random distance between @i{-1} and 1
- in both @cite{x} and @cite{y}; then take another step, and so on. Use the
- @kbd{g f} command to display this random walk. Now modify your random
- walk to walk a unit distance, but in a random direction, at each step.
- (Hint: The @code{sincos} function returns a vector of the cosine and
- sine of an angle.) @xref{List Answer 14, 14}. (@bullet{})
- @node Types Tutorial, Algebra Tutorial, Vector/Matrix Tutorial, Tutorial
- @section Types Tutorial
- @noindent
- Calc understands a variety of data types as well as simple numbers.
- In this section, we'll experiment with each of these types in turn.
- The numbers we've been using so far have mainly been either @dfn{integers}
- or @dfn{floats}. We saw that floats are usually a good approximation to
- the mathematical concept of real numbers, but they are only approximations
- and are susceptible to roundoff error. Calc also supports @dfn{fractions},
- which can exactly represent any rational number.
- @smallexample
- @group
- 1: 3628800 2: 3628800 1: 518400:7 1: 518414:7 1: 7:518414
- . 1: 49 . . .
- .
- 10 ! 49 @key{RET} : 2 + &
- @end group
- @end smallexample
- @noindent
- The @kbd{:} command divides two integers to get a fraction; @kbd{/}
- would normally divide integers to get a floating-point result.
- Notice we had to type @key{RET} between the @kbd{49} and the @kbd{:}
- since the @kbd{:} would otherwise be interpreted as part of a
- fraction beginning with 49.
- You can convert between floating-point and fractional format using
- @kbd{c f} and @kbd{c F}:
- @smallexample
- @group
- 1: 1.35027217629e-5 1: 7:518414
- . .
- c f c F
- @end group
- @end smallexample
- The @kbd{c F} command replaces a floating-point number with the
- ``simplest'' fraction whose floating-point representation is the
- same, to within the current precision.
- @smallexample
- @group
- 1: 3.14159265359 1: 1146408:364913 1: 3.1416 1: 355:113
- . . . .
- P c F @key{DEL} p 5 @key{RET} P c F
- @end group
- @end smallexample
- (@bullet{}) @strong{Exercise 1.} A calculation has produced the
- result 1.26508260337. You suspect it is the square root of the
- product of @c{$\pi$}
- @cite{pi} and some rational number. Is it? (Be sure
- to allow for roundoff error!) @xref{Types Answer 1, 1}. (@bullet{})
- @dfn{Complex numbers} can be stored in both rectangular and polar form.
- @smallexample
- @group
- 1: -9 1: (0, 3) 1: (3; 90.) 1: (6; 90.) 1: (2.4495; 45.)
- . . . . .
- 9 n Q c p 2 * Q
- @end group
- @end smallexample
- @noindent
- The square root of @i{-9} is by default rendered in rectangular form
- (@w{@cite{0 + 3i}}), but we can convert it to polar form (3 with a
- phase angle of 90 degrees). All the usual arithmetic and scientific
- operations are defined on both types of complex numbers.
- Another generalized kind of number is @dfn{infinity}. Infinity
- isn't really a number, but it can sometimes be treated like one.
- Calc uses the symbol @code{inf} to represent positive infinity,
- i.e., a value greater than any real number. Naturally, you can
- also write @samp{-inf} for minus infinity, a value less than any
- real number. The word @code{inf} can only be input using
- algebraic entry.
- @smallexample
- @group
- 2: inf 2: -inf 2: -inf 2: -inf 1: nan
- 1: -17 1: -inf 1: -inf 1: inf .
- . . . .
- ' inf @key{RET} 17 n * @key{RET} 72 + A +
- @end group
- @end smallexample
- @noindent
- Since infinity is infinitely large, multiplying it by any finite
- number (like @i{-17}) has no effect, except that since @i{-17}
- is negative, it changes a plus infinity to a minus infinity.
- (``A huge positive number, multiplied by @i{-17}, yields a huge
- negative number.'') Adding any finite number to infinity also
- leaves it unchanged. Taking an absolute value gives us plus
- infinity again. Finally, we add this plus infinity to the minus
- infinity we had earlier. If you work it out, you might expect
- the answer to be @i{-72} for this. But the 72 has been completely
- lost next to the infinities; by the time we compute @w{@samp{inf - inf}}
- the finite difference between them, if any, is indetectable.
- So we say the result is @dfn{indeterminate}, which Calc writes
- with the symbol @code{nan} (for Not A Number).
- Dividing by zero is normally treated as an error, but you can get
- Calc to write an answer in terms of infinity by pressing @kbd{m i}
- to turn on ``infinite mode.''
- @smallexample
- @group
- 3: nan 2: nan 2: nan 2: nan 1: nan
- 2: 1 1: 1 / 0 1: uinf 1: uinf .
- 1: 0 . . .
- .
- 1 @key{RET} 0 / m i U / 17 n * +
- @end group
- @end smallexample
- @noindent
- Dividing by zero normally is left unevaluated, but after @kbd{m i}
- it instead gives an infinite result. The answer is actually
- @code{uinf}, ``undirected infinity.'' If you look at a graph of
- @cite{1 / x} around @w{@cite{x = 0}}, you'll see that it goes toward
- plus infinity as you approach zero from above, but toward minus
- infinity as you approach from below. Since we said only @cite{1 / 0},
- Calc knows that the answer is infinite but not in which direction.
- That's what @code{uinf} means. Notice that multiplying @code{uinf}
- by a negative number still leaves plain @code{uinf}; there's no
- point in saying @samp{-uinf} because the sign of @code{uinf} is
- unknown anyway. Finally, we add @code{uinf} to our @code{nan},
- yielding @code{nan} again. It's easy to see that, because
- @code{nan} means ``totally unknown'' while @code{uinf} means
- ``unknown sign but known to be infinite,'' the more mysterious
- @code{nan} wins out when it is combined with @code{uinf}, or, for
- that matter, with anything else.
- (@bullet{}) @strong{Exercise 2.} Predict what Calc will answer
- for each of these formulas: @samp{inf / inf}, @samp{exp(inf)},
- @samp{exp(-inf)}, @samp{sqrt(-inf)}, @samp{sqrt(uinf)},
- @samp{abs(uinf)}, @samp{ln(0)}.
- @xref{Types Answer 2, 2}. (@bullet{})
- (@bullet{}) @strong{Exercise 3.} We saw that @samp{inf - inf = nan},
- which stands for an unknown value. Can @code{nan} stand for
- a complex number? Can it stand for infinity?
- @xref{Types Answer 3, 3}. (@bullet{})
- @dfn{HMS forms} represent a value in terms of hours, minutes, and
- seconds.
- @smallexample
- @group
- 1: 2@@ 30' 0" 1: 3@@ 30' 0" 2: 3@@ 30' 0" 1: 2.
- . . 1: 1@@ 45' 0." .
- .
- 2@@ 30' @key{RET} 1 + @key{RET} 2 / /
- @end group
- @end smallexample
- HMS forms can also be used to hold angles in degrees, minutes, and
- seconds.
- @smallexample
- @group
- 1: 0.5 1: 26.56505 1: 26@@ 33' 54.18" 1: 0.44721
- . . . .
- 0.5 I T c h S
- @end group
- @end smallexample
- @noindent
- First we convert the inverse tangent of 0.5 to degrees-minutes-seconds
- form, then we take the sine of that angle. Note that the trigonometric
- functions will accept HMS forms directly as input.
- @cindex Beatles
- (@bullet{}) @strong{Exercise 4.} The Beatles' @emph{Abbey Road} is
- 47 minutes and 26 seconds long, and contains 17 songs. What is the
- average length of a song on @emph{Abbey Road}? If the Extended Disco
- Version of @emph{Abbey Road} added 20 seconds to the length of each
- song, how long would the album be? @xref{Types Answer 4, 4}. (@bullet{})
- A @dfn{date form} represents a date, or a date and time. Dates must
- be entered using algebraic entry. Date forms are surrounded by
- @samp{< >} symbols; most standard formats for dates are recognized.
- @smallexample
- @group
- 2: <Sun Jan 13, 1991> 1: 2.25
- 1: <6:00pm Thu Jan 10, 1991> .
- .
- ' <13 Jan 1991>, <1/10/91, 6pm> @key{RET} -
- @end group
- @end smallexample
- @noindent
- In this example, we enter two dates, then subtract to find the
- number of days between them. It is also possible to add an
- HMS form or a number (of days) to a date form to get another
- date form.
- @smallexample
- @group
- 1: <4:45:59pm Mon Jan 14, 1991> 1: <2:50:59am Thu Jan 17, 1991>
- . .
- t N 2 + 10@@ 5' +
- @end group
- @end smallexample
- @c [fix-ref Date Arithmetic]
- @noindent
- The @kbd{t N} (``now'') command pushes the current date and time on the
- stack; then we add two days, ten hours and five minutes to the date and
- time. Other date-and-time related commands include @kbd{t J}, which
- does Julian day conversions, @kbd{t W}, which finds the beginning of
- the week in which a date form lies, and @kbd{t I}, which increments a
- date by one or several months. @xref{Date Arithmetic}, for more.
- (@bullet{}) @strong{Exercise 5.} How many days until the next
- Friday the 13th? @xref{Types Answer 5, 5}. (@bullet{})
- (@bullet{}) @strong{Exercise 6.} How many leap years will there be
- between now and the year 10001 A.D.? @xref{Types Answer 6, 6}. (@bullet{})
- @cindex Slope and angle of a line
- @cindex Angle and slope of a line
- An @dfn{error form} represents a mean value with an attached standard
- deviation, or error estimate. Suppose our measurements indicate that
- a certain telephone pole is about 30 meters away, with an estimated
- error of 1 meter, and 8 meters tall, with an estimated error of 0.2
- meters. What is the slope of a line from here to the top of the
- pole, and what is the equivalent angle in degrees?
- @smallexample
- @group
- 1: 8 +/- 0.2 2: 8 +/- 0.2 1: 0.266 +/- 0.011 1: 14.93 +/- 0.594
- . 1: 30 +/- 1 . .
- .
- 8 p .2 @key{RET} 30 p 1 / I T
- @end group
- @end smallexample
- @noindent
- This means that the angle is about 15 degrees, and, assuming our
- original error estimates were valid standard deviations, there is about
- a 60% chance that the result is correct within 0.59 degrees.
- @cindex Torus, volume of
- (@bullet{}) @strong{Exercise 7.} The volume of a torus (a donut shape) is
- @c{$2 \pi^2 R r^2$}
- @w{@cite{2 pi^2 R r^2}} where @cite{R} is the radius of the circle that
- defines the center of the tube and @cite{r} is the radius of the tube
- itself. Suppose @cite{R} is 20 cm and @cite{r} is 4 cm, each known to
- within 5 percent. What is the volume and the relative uncertainty of
- the volume? @xref{Types Answer 7, 7}. (@bullet{})
- An @dfn{interval form} represents a range of values. While an
- error form is best for making statistical estimates, intervals give
- you exact bounds on an answer. Suppose we additionally know that
- our telephone pole is definitely between 28 and 31 meters away,
- and that it is between 7.7 and 8.1 meters tall.
- @smallexample
- @group
- 1: [7.7 .. 8.1] 2: [7.7 .. 8.1] 1: [0.24 .. 0.28] 1: [13.9 .. 16.1]
- . 1: [28 .. 31] . .
- .
- [ 7.7 .. 8.1 ] [ 28 .. 31 ] / I T
- @end group
- @end smallexample
- @noindent
- If our bounds were correct, then the angle to the top of the pole
- is sure to lie in the range shown.
- The square brackets around these intervals indicate that the endpoints
- themselves are allowable values. In other words, the distance to the
- telephone pole is between 28 and 31, @emph{inclusive}. You can also
- make an interval that is exclusive of its endpoints by writing
- parentheses instead of square brackets. You can even make an interval
- which is inclusive (``closed'') on one end and exclusive (``open'') on
- the other.
- @smallexample
- @group
- 1: [1 .. 10) 1: (0.1 .. 1] 2: (0.1 .. 1] 1: (0.2 .. 3)
- . . 1: [2 .. 3) .
- .
- [ 1 .. 10 ) & [ 2 .. 3 ) *
- @end group
- @end smallexample
- @noindent
- The Calculator automatically keeps track of which end values should
- be open and which should be closed. You can also make infinite or
- semi-infinite intervals by using @samp{-inf} or @samp{inf} for one
- or both endpoints.
- (@bullet{}) @strong{Exercise 8.} What answer would you expect from
- @samp{@w{1 /} @w{(0 .. 10)}}? What about @samp{@w{1 /} @w{(-10 .. 0)}}? What
- about @samp{@w{1 /} @w{[0 .. 10]}} (where the interval actually includes
- zero)? What about @samp{@w{1 /} @w{(-10 .. 10)}}?
- @xref{Types Answer 8, 8}. (@bullet{})
- (@bullet{}) @strong{Exercise 9.} Two easy ways of squaring a number
- are @kbd{@key{RET} *} and @w{@kbd{2 ^}}. Normally these produce the same
- answer. Would you expect this still to hold true for interval forms?
- If not, which of these will result in a larger interval?
- @xref{Types Answer 9, 9}. (@bullet{})
- A @dfn{modulo form} is used for performing arithmetic modulo @var{m}.
- For example, arithmetic involving time is generally done modulo 12
- or 24 hours.
- @smallexample
- @group
- 1: 17 mod 24 1: 3 mod 24 1: 21 mod 24 1: 9 mod 24
- . . . .
- 17 M 24 @key{RET} 10 + n 5 /
- @end group
- @end smallexample
- @noindent
- In this last step, Calc has found a new number which, when multiplied
- by 5 modulo 24, produces the original number, 21. If @var{m} is prime
- it is always possible to find such a number. For non-prime @var{m}
- like 24, it is only sometimes possible.
- @smallexample
- @group
- 1: 10 mod 24 1: 16 mod 24 1: 1000000... 1: 16
- . . . .
- 10 M 24 @key{RET} 100 ^ 10 @key{RET} 100 ^ 24 %
- @end group
- @end smallexample
- @noindent
- These two calculations get the same answer, but the first one is
- much more efficient because it avoids the huge intermediate value
- that arises in the second one.
- @cindex Fermat, primality test of
- (@bullet{}) @strong{Exercise 10.} A theorem of Pierre de Fermat
- says that @c{\w{$x^{n-1} \bmod n = 1$}}
- @cite{x^(n-1) mod n = 1} if @cite{n} is a prime number
- and @cite{x} is an integer less than @cite{n}. If @cite{n} is
- @emph{not} a prime number, this will @emph{not} be true for most
- values of @cite{x}. Thus we can test informally if a number is
- prime by trying this formula for several values of @cite{x}.
- Use this test to tell whether the following numbers are prime:
- 811749613, 15485863. @xref{Types Answer 10, 10}. (@bullet{})
- It is possible to use HMS forms as parts of error forms, intervals,
- modulo forms, or as the phase part of a polar complex number.
- For example, the @code{calc-time} command pushes the current time
- of day on the stack as an HMS/modulo form.
- @smallexample
- @group
- 1: 17@@ 34' 45" mod 24@@ 0' 0" 1: 6@@ 22' 15" mod 24@@ 0' 0"
- . .
- x time @key{RET} n
- @end group
- @end smallexample
- @noindent
- This calculation tells me it is six hours and 22 minutes until midnight.
- (@bullet{}) @strong{Exercise 11.} A rule of thumb is that one year
- is about @c{$\pi \times 10^7$}
- @w{@cite{pi * 10^7}} seconds. What time will it be that
- many seconds from right now? @xref{Types Answer 11, 11}. (@bullet{})
- (@bullet{}) @strong{Exercise 12.} You are preparing to order packaging
- for the CD release of the Extended Disco Version of @emph{Abbey Road}.
- You are told that the songs will actually be anywhere from 20 to 60
- seconds longer than the originals. One CD can hold about 75 minutes
- of music. Should you order single or double packages?
- @xref{Types Answer 12, 12}. (@bullet{})
- Another kind of data the Calculator can manipulate is numbers with
- @dfn{units}. This isn't strictly a new data type; it's simply an
- application of algebraic expressions, where we use variables with
- suggestive names like @samp{cm} and @samp{in} to represent units
- like centimeters and inches.
- @smallexample
- @group
- 1: 2 in 1: 5.08 cm 1: 0.027778 fath 1: 0.0508 m
- . . . .
- ' 2in @key{RET} u c cm @key{RET} u c fath @key{RET} u b
- @end group
- @end smallexample
- @noindent
- We enter the quantity ``2 inches'' (actually an algebraic expression
- which means two times the variable @samp{in}), then we convert it
- first to centimeters, then to fathoms, then finally to ``base'' units,
- which in this case means meters.
- @smallexample
- @group
- 1: 9 acre 1: 3 sqrt(acre) 1: 190.84 m 1: 190.84 m + 30 cm
- . . . .
- ' 9 acre @key{RET} Q u s ' $+30 cm @key{RET}
- @end group
- @end smallexample
- @noindent
- @smallexample
- @group
- 1: 191.14 m 1: 36536.3046 m^2 1: 365363046 cm^2
- . . .
- u s 2 ^ u c cgs
- @end group
- @end smallexample
- @noindent
- Since units expressions are really just formulas, taking the square
- root of @samp{acre} is undefined. After all, @code{acre} might be an
- algebraic variable that you will someday assign a value. We use the
- ``units-simplify'' command to simplify the expression with variables
- being interpreted as unit names.
- In the final step, we have converted not to a particular unit, but to a
- units system. The ``cgs'' system uses centimeters instead of meters
- as its standard unit of length.
- There is a wide variety of units defined in the Calculator.
- @smallexample
- @group
- 1: 55 mph 1: 88.5139 kph 1: 88.5139 km / hr 1: 8.201407e-8 c
- . . . .
- ' 55 mph @key{RET} u c kph @key{RET} u c km/hr @key{RET} u c c @key{RET}
- @end group
- @end smallexample
- @noindent
- We express a speed first in miles per hour, then in kilometers per
- hour, then again using a slightly more explicit notation, then
- finally in terms of fractions of the speed of light.
- Temperature conversions are a bit more tricky. There are two ways to
- interpret ``20 degrees Fahrenheit''---it could mean an actual
- temperature, or it could mean a change in temperature. For normal
- units there is no difference, but temperature units have an offset
- as well as a scale factor and so there must be two explicit commands
- for them.
- @smallexample
- @group
- 1: 20 degF 1: 11.1111 degC 1: -20:3 degC 1: -6.666 degC
- . . . .
- ' 20 degF @key{RET} u c degC @key{RET} U u t degC @key{RET} c f
- @end group
- @end smallexample
- @noindent
- First we convert a change of 20 degrees Fahrenheit into an equivalent
- change in degrees Celsius (or Centigrade). Then, we convert the
- absolute temperature 20 degrees Fahrenheit into Celsius. Since
- this comes out as an exact fraction, we then convert to floating-point
- for easier comparison with the other result.
- For simple unit conversions, you can put a plain number on the stack.
- Then @kbd{u c} and @kbd{u t} will prompt for both old and new units.
- When you use this method, you're responsible for remembering which
- numbers are in which units:
- @smallexample
- @group
- 1: 55 1: 88.5139 1: 8.201407e-8
- . . .
- 55 u c mph @key{RET} kph @key{RET} u c km/hr @key{RET} c @key{RET}
- @end group
- @end smallexample
- To see a complete list of built-in units, type @kbd{u v}. Press
- @w{@kbd{M-# c}} again to re-enter the Calculator when you're done looking
- at the units table.
- (@bullet{}) @strong{Exercise 13.} How many seconds are there really
- in a year? @xref{Types Answer 13, 13}. (@bullet{})
- @cindex Speed of light
- (@bullet{}) @strong{Exercise 14.} Supercomputer designs are limited by
- the speed of light (and of electricity, which is nearly as fast).
- Suppose a computer has a 4.1 ns (nanosecond) clock cycle, and its
- cabinet is one meter across. Is speed of light going to be a
- significant factor in its design? @xref{Types Answer 14, 14}. (@bullet{})
- (@bullet{}) @strong{Exercise 15.} Sam the Slug normally travels about
- five yards in an hour. He has obtained a supply of Power Pills; each
- Power Pill he eats doubles his speed. How many Power Pills can he
- swallow and still travel legally on most US highways?
- @xref{Types Answer 15, 15}. (@bullet{})
- @node Algebra Tutorial, Programming Tutorial, Types Tutorial, Tutorial
- @section Algebra and Calculus Tutorial
- @noindent
- This section shows how to use Calc's algebra facilities to solve
- equations, do simple calculus problems, and manipulate algebraic
- formulas.
- @menu
- * Basic Algebra Tutorial::
- * Rewrites Tutorial::
- @end menu
- @node Basic Algebra Tutorial, Rewrites Tutorial, Algebra Tutorial, Algebra Tutorial
- @subsection Basic Algebra
- @noindent
- If you enter a formula in algebraic mode that refers to variables,
- the formula itself is pushed onto the stack. You can manipulate
- formulas as regular data objects.
- @smallexample
- @group
- 1: 2 x^2 - 6 1: 6 - 2 x^2 1: (6 - 2 x^2) (3 x^2 + y)
- . . .
- ' 2x^2-6 @key{RET} n ' 3x^2+y @key{RET} *
- @end group
- @end smallexample
- (@bullet{}) @strong{Exercise 1.} Do @kbd{' x @key{RET} Q 2 ^} and
- @kbd{' x @key{RET} 2 ^ Q} both wind up with the same result (@samp{x})?
- Why or why not? @xref{Algebra Answer 1, 1}. (@bullet{})
- There are also commands for doing common algebraic operations on
- formulas. Continuing with the formula from the last example,
- @smallexample
- @group
- 1: 18 x^2 + 6 y - 6 x^4 - 2 x^2 y 1: (18 - 2 y) x^2 - 6 x^4 + 6 y
- . .
- a x a c x @key{RET}
- @end group
- @end smallexample
- @noindent
- First we ``expand'' using the distributive law, then we ``collect''
- terms involving like powers of @cite{x}.
- Let's find the value of this expression when @cite{x} is 2 and @cite{y}
- is one-half.
- @smallexample
- @group
- 1: 17 x^2 - 6 x^4 + 3 1: -25
- . .
- 1:2 s l y @key{RET} 2 s l x @key{RET}
- @end group
- @end smallexample
- @noindent
- The @kbd{s l} command means ``let''; it takes a number from the top of
- the stack and temporarily assigns it as the value of the variable
- you specify. It then evaluates (as if by the @kbd{=} key) the
- next expression on the stack. After this command, the variable goes
- back to its original value, if any.
- (An earlier exercise in this tutorial involved storing a value in the
- variable @code{x}; if this value is still there, you will have to
- unstore it with @kbd{s u x @key{RET}} before the above example will work
- properly.)
- @cindex Maximum of a function using Calculus
- Let's find the maximum value of our original expression when @cite{y}
- is one-half and @cite{x} ranges over all possible values. We can
- do this by taking the derivative with respect to @cite{x} and examining
- values of @cite{x} for which the derivative is zero. If the second
- derivative of the function at that value of @cite{x} is negative,
- the function has a local maximum there.
- @smallexample
- @group
- 1: 17 x^2 - 6 x^4 + 3 1: 34 x - 24 x^3
- . .
- U @key{DEL} s 1 a d x @key{RET} s 2
- @end group
- @end smallexample
- @noindent
- Well, the derivative is clearly zero when @cite{x} is zero. To find
- the other root(s), let's divide through by @cite{x} and then solve:
- @smallexample
- @group
- 1: (34 x - 24 x^3) / x 1: 34 x / x - 24 x^3 / x 1: 34 - 24 x^2
- . . .
- ' x @key{RET} / a x a s
- @end group
- @end smallexample
- @noindent
- @smallexample
- @group
- 1: 34 - 24 x^2 = 0 1: x = 1.19023
- . .
- 0 a = s 3 a S x @key{RET}
- @end group
- @end smallexample
- @noindent
- Notice the use of @kbd{a s} to ``simplify'' the formula. When the
- default algebraic simplifications don't do enough, you can use
- @kbd{a s} to tell Calc to spend more time on the job.
- Now we compute the second derivative and plug in our values of @cite{x}:
- @smallexample
- @group
- 1: 1.19023 2: 1.19023 2: 1.19023
- . 1: 34 x - 24 x^3 1: 34 - 72 x^2
- . .
- a . r 2 a d x @key{RET} s 4
- @end group
- @end smallexample
- @noindent
- (The @kbd{a .} command extracts just the righthand side of an equation.
- Another method would have been to use @kbd{v u} to unpack the equation
- @w{@samp{x = 1.19}} to @samp{x} and @samp{1.19}, then use @kbd{M-- M-2 @key{DEL}}
- to delete the @samp{x}.)
- @smallexample
- @group
- 2: 34 - 72 x^2 1: -68. 2: 34 - 72 x^2 1: 34
- 1: 1.19023 . 1: 0 .
- . .
- @key{TAB} s l x @key{RET} U @key{DEL} 0 s l x @key{RET}
- @end group
- @end smallexample
- @noindent
- The first of these second derivatives is negative, so we know the function
- has a maximum value at @cite{x = 1.19023}. (The function also has a
- local @emph{minimum} at @cite{x = 0}.)
- When we solved for @cite{x}, we got only one value even though
- @cite{34 - 24 x^2 = 0} is a quadratic equation that ought to have
- two solutions. The reason is that @w{@kbd{a S}} normally returns a
- single ``principal'' solution. If it needs to come up with an
- arbitrary sign (as occurs in the quadratic formula) it picks @cite{+}.
- If it needs an arbitrary integer, it picks zero. We can get a full
- solution by pressing @kbd{H} (the Hyperbolic flag) before @kbd{a S}.
- @smallexample
- @group
- 1: 34 - 24 x^2 = 0 1: x = 1.19023 s1 1: x = -1.19023
- . . .
- r 3 H a S x @key{RET} s 5 1 n s l s1 @key{RET}
- @end group
- @end smallexample
- @noindent
- Calc has invented the variable @samp{s1} to represent an unknown sign;
- it is supposed to be either @i{+1} or @i{-1}. Here we have used
- the ``let'' command to evaluate the expression when the sign is negative.
- If we plugged this into our second derivative we would get the same,
- negative, answer, so @cite{x = -1.19023} is also a maximum.
- To find the actual maximum value, we must plug our two values of @cite{x}
- into the original formula.
- @smallexample
- @group
- 2: 17 x^2 - 6 x^4 + 3 1: 24.08333 s1^2 - 12.04166 s1^4 + 3
- 1: x = 1.19023 s1 .
- .
- r 1 r 5 s l @key{RET}
- @end group
- @end smallexample
- @noindent
- (Here we see another way to use @kbd{s l}; if its input is an equation
- with a variable on the lefthand side, then @kbd{s l} treats the equation
- like an assignment to that variable if you don't give a variable name.)
- It's clear that this will have the same value for either sign of
- @code{s1}, but let's work it out anyway, just for the exercise:
- @smallexample
- @group
- 2: [-1, 1] 1: [15.04166, 15.04166]
- 1: 24.08333 s1^2 ... .
- .
- [ 1 n , 1 ] @key{TAB} V M $ @key{RET}
- @end group
- @end smallexample
- @noindent
- Here we have used a vector mapping operation to evaluate the function
- at several values of @samp{s1} at once. @kbd{V M $} is like @kbd{V M '}
- except that it takes the formula from the top of the stack. The
- formula is interpreted as a function to apply across the vector at the
- next-to-top stack level. Since a formula on the stack can't contain
- @samp{$} signs, Calc assumes the variables in the formula stand for
- different arguments. It prompts you for an @dfn{argument list}, giving
- the list of all variables in the formula in alphabetical order as the
- default list. In this case the default is @samp{(s1)}, which is just
- what we want so we simply press @key{RET} at the prompt.
- If there had been several different values, we could have used
- @w{@kbd{V R X}} to find the global maximum.
- Calc has a built-in @kbd{a P} command that solves an equation using
- @w{@kbd{H a S}} and returns a vector of all the solutions. It simply
- automates the job we just did by hand. Applied to our original
- cubic polynomial, it would produce the vector of solutions
- @cite{[1.19023, -1.19023, 0]}. (There is also an @kbd{a X} command
- which finds a local maximum of a function. It uses a numerical search
- method rather than examining the derivatives, and thus requires you
- to provide some kind of initial guess to show it where to look.)
- (@bullet{}) @strong{Exercise 2.} Given a vector of the roots of a
- polynomial (such as the output of an @kbd{a P} command), what
- sequence of commands would you use to reconstruct the original
- polynomial? (The answer will be unique to within a constant
- multiple; choose the solution where the leading coefficient is one.)
- @xref{Algebra Answer 2, 2}. (@bullet{})
- The @kbd{m s} command enables ``symbolic mode,'' in which formulas
- like @samp{sqrt(5)} that can't be evaluated exactly are left in
- symbolic form rather than giving a floating-point approximate answer.
- Fraction mode (@kbd{m f}) is also useful when doing algebra.
- @smallexample
- @group
- 2: 34 x - 24 x^3 2: 34 x - 24 x^3
- 1: 34 x - 24 x^3 1: [sqrt(51) / 6, sqrt(51) / -6, 0]
- . .
- r 2 @key{RET} m s m f a P x @key{RET}
- @end group
- @end smallexample
- One more mode that makes reading formulas easier is ``Big mode.''
- @smallexample
- @group
- 3
- 2: 34 x - 24 x
- ____ ____
- V 51 V 51
- 1: [-----, -----, 0]
- 6 -6
- .
- d B
- @end group
- @end smallexample
- Here things like powers, square roots, and quotients and fractions
- are displayed in a two-dimensional pictorial form. Calc has other
- language modes as well, such as C mode, FORTRAN mode, and @TeX{} mode.
- @smallexample
- @group
- 2: 34*x - 24*pow(x, 3) 2: 34*x - 24*x**3
- 1: @{sqrt(51) / 6, sqrt(51) / -6, 0@} 1: /sqrt(51) / 6, sqrt(51) / -6, 0/
- . .
- d C d F
- @end group
- @end smallexample
- @noindent
- @smallexample
- @group
- 3: 34 x - 24 x^3
- 2: [@{\sqrt@{51@} \over 6@}, @{\sqrt@{51@} \over -6@}, 0]
- 1: @{2 \over 3@} \sqrt@{5@}
- .
- d T ' 2 \sqrt@{5@} \over 3 @key{RET}
- @end group
- @end smallexample
- @noindent
- As you can see, language modes affect both entry and display of
- formulas. They affect such things as the names used for built-in
- functions, the set of arithmetic operators and their precedences,
- and notations for vectors and matrices.
- Notice that @samp{sqrt(51)} may cause problems with older
- implementations of C and FORTRAN, which would require something more
- like @samp{sqrt(51.0)}. It is always wise to check over the formulas
- produced by the various language modes to make sure they are fully
- correct.
- Type @kbd{m s}, @kbd{m f}, and @kbd{d N} to reset these modes. (You
- may prefer to remain in Big mode, but all the examples in the tutorial
- are shown in normal mode.)
- @cindex Area under a curve
- What is the area under the portion of this curve from @cite{x = 1} to @cite{2}?
- This is simply the integral of the function:
- @smallexample
- @group
- 1: 17 x^2 - 6 x^4 + 3 1: 5.6666 x^3 - 1.2 x^5 + 3 x
- . .
- r 1 a i x
- @end group
- @end smallexample
- @noindent
- We want to evaluate this at our two values for @cite{x} and subtract.
- One way to do it is again with vector mapping and reduction:
- @smallexample
- @group
- 2: [2, 1] 1: [12.93333, 7.46666] 1: 5.46666
- 1: 5.6666 x^3 ... . .
- [ 2 , 1 ] @key{TAB} V M $ @key{RET} V R -
- @end group
- @end smallexample
- (@bullet{}) @strong{Exercise 3.} Find the integral from 1 to @cite{y}
- of @c{$x \sin \pi x$}
- @w{@cite{x sin(pi x)}} (where the sine is calculated in radians).
- Find the values of the integral for integers @cite{y} from 1 to 5.
- @xref{Algebra Answer 3, 3}. (@bullet{})
- Calc's integrator can do many simple integrals symbolically, but many
- others are beyond its capabilities. Suppose we wish to find the area
- under the curve @c{$\sin x \ln x$}
- @cite{sin(x) ln(x)} over the same range of @cite{x}. If
- you entered this formula and typed @kbd{a i x @key{RET}} (don't bother to try
- this), Calc would work for a long time but would be unable to find a
- solution. In fact, there is no closed-form solution to this integral.
- Now what do we do?
- @cindex Integration, numerical
- @cindex Numerical integration
- One approach would be to do the integral numerically. It is not hard
- to do this by hand using vector mapping and reduction. It is rather
- slow, though, since the sine and logarithm functions take a long time.
- We can save some time by reducing the working precision.
- @smallexample
- @group
- 3: 10 1: [1, 1.1, 1.2, ... , 1.8, 1.9]
- 2: 1 .
- 1: 0.1
- .
- 10 @key{RET} 1 @key{RET} .1 @key{RET} C-u v x
- @end group
- @end smallexample
- @noindent
- (Note that we have used the extended version of @kbd{v x}; we could
- also have used plain @kbd{v x} as follows: @kbd{v x 10 @key{RET} 9 + .1 *}.)
- @smallexample
- @group
- 2: [1, 1.1, ... ] 1: [0., 0.084941, 0.16993, ... ]
- 1: sin(x) ln(x) .
- .
- ' sin(x) ln(x) @key{RET} s 1 m r p 5 @key{RET} V M $ @key{RET}
- @end group
- @end smallexample
- @noindent
- @smallexample
- @group
- 1: 3.4195 0.34195
- . .
- V R + 0.1 *
- @end group
- @end smallexample
- @noindent
- (If you got wildly different results, did you remember to switch
- to radians mode?)
- Here we have divided the curve into ten segments of equal width;
- approximating these segments as rectangular boxes (i.e., assuming
- the curve is nearly flat at that resolution), we compute the areas
- of the boxes (height times width), then sum the areas. (It is
- faster to sum first, then multiply by the width, since the width
- is the same for every box.)
- The true value of this integral turns out to be about 0.374, so
- we're not doing too well. Let's try another approach.
- @smallexample
- @group
- 1: sin(x) ln(x) 1: 0.84147 x - 0.84147 + 0.11957 (x - 1)^2 - ...
- . .
- r 1 a t x=1 @key{RET} 4 @key{RET}
- @end group
- @end smallexample
- @noindent
- Here we have computed the Taylor series expansion of the function
- about the point @cite{x=1}. We can now integrate this polynomial
- approximation, since polynomials are easy to integrate.
- @smallexample
- @group
- 1: 0.42074 x^2 + ... 1: [-0.0446, -0.42073] 1: 0.3761
- . . .
- a i x @key{RET} [ 2 , 1 ] @key{TAB} V M $ @key{RET} V R -
- @end group
- @end smallexample
- @noindent
- Better! By increasing the precision and/or asking for more terms
- in the Taylor series, we can get a result as accurate as we like.
- (Taylor series converge better away from singularities in the
- function such as the one at @code{ln(0)}, so it would also help to
- expand the series about the points @cite{x=2} or @cite{x=1.5} instead
- of @cite{x=1}.)
- @cindex Simpson's rule
- @cindex Integration by Simpson's rule
- (@bullet{}) @strong{Exercise 4.} Our first method approximated the
- curve by stairsteps of width 0.1; the total area was then the sum
- of the areas of the rectangles under these stairsteps. Our second
- method approximated the function by a polynomial, which turned out
- to be a better approximation than stairsteps. A third method is
- @dfn{Simpson's rule}, which is like the stairstep method except
- that the steps are not required to be flat. Simpson's rule boils
- down to the formula,
- @ifinfo
- @example
- (h/3) * (f(a) + 4 f(a+h) + 2 f(a+2h) + 4 f(a+3h) + ...
- + 2 f(a+(n-2)*h) + 4 f(a+(n-1)*h) + f(a+n*h))
- @end example
- @end ifinfo
- @tex
- \turnoffactive
- \beforedisplay
- $$ \displaylines{
- \qquad {h \over 3} (f(a) + 4 f(a+h) + 2 f(a+2h) + 4 f(a+3h) + \cdots
- \hfill \cr \hfill {} + 2 f(a+(n-2)h) + 4 f(a+(n-1)h) + f(a+n h)) \qquad
- } $$
- \afterdisplay
- @end tex
- @noindent
- where @cite{n} (which must be even) is the number of slices and @cite{h}
- is the width of each slice. These are 10 and 0.1 in our example.
- For reference, here is the corresponding formula for the stairstep
- method:
- @ifinfo
- @example
- h * (f(a) + f(a+h) + f(a+2h) + f(a+3h) + ...
- + f(a+(n-2)*h) + f(a+(n-1)*h))
- @end example
- @end ifinfo
- @tex
- \turnoffactive
- \beforedisplay
- $$ h (f(a) + f(a+h) + f(a+2h) + f(a+3h) + \cdots
- + f(a+(n-2)h) + f(a+(n-1)h)) $$
- \afterdisplay
- @end tex
- Compute the integral from 1 to 2 of @c{$\sin x \ln x$}
- @cite{sin(x) ln(x)} using
- Simpson's rule with 10 slices. @xref{Algebra Answer 4, 4}. (@bullet{})
- Calc has a built-in @kbd{a I} command for doing numerical integration.
- It uses @dfn{Romberg's method}, which is a more sophisticated cousin
- of Simpson's rule. In particular, it knows how to keep refining the
- result until the current precision is satisfied.
- @c [fix-ref Selecting Sub-Formulas]
- Aside from the commands we've seen so far, Calc also provides a
- large set of commands for operating on parts of formulas. You
- indicate the desired sub-formula by placing the cursor on any part
- of the formula before giving a @dfn{selection} command. Selections won't
- be covered in the tutorial; @pxref{Selecting Subformulas}, for
- details and examples.
- @c hard exercise: simplify (2^(n r) - 2^(r*(n - 1))) / (2^r - 1) 2^(n - 1)
- @c to 2^((n-1)*(r-1)).
- @node Rewrites Tutorial, , Basic Algebra Tutorial, Algebra Tutorial
- @subsection Rewrite Rules
- @noindent
- No matter how many built-in commands Calc provided for doing algebra,
- there would always be something you wanted to do that Calc didn't have
- in its repertoire. So Calc also provides a @dfn{rewrite rule} system
- that you can use to define your own algebraic manipulations.
- Suppose we want to simplify this trigonometric formula:
- @smallexample
- @group
- 1: 1 / cos(x) - sin(x) tan(x)
- .
- ' 1/cos(x) - sin(x) tan(x) @key{RET} s 1
- @end group
- @end smallexample
- @noindent
- If we were simplifying this by hand, we'd probably replace the
- @samp{tan} with a @samp{sin/cos} first, then combine over a common
- denominator. There is no Calc command to do the former; the @kbd{a n}
- algebra command will do the latter but we'll do both with rewrite
- rules just for practice.
- Rewrite rules are written with the @samp{:=} symbol.
- @smallexample
- @group
- 1: 1 / cos(x) - sin(x)^2 / cos(x)
- .
- a r tan(a) := sin(a)/cos(a) @key{RET}
- @end group
- @end smallexample
- @noindent
- (The ``assignment operator'' @samp{:=} has several uses in Calc. All
- by itself the formula @samp{tan(a) := sin(a)/cos(a)} doesn't do anything,
- but when it is given to the @kbd{a r} command, that command interprets
- it as a rewrite rule.)
- The lefthand side, @samp{tan(a)}, is called the @dfn{pattern} of the
- rewrite rule. Calc searches the formula on the stack for parts that
- match the pattern. Variables in a rewrite pattern are called
- @dfn{meta-variables}, and when matching the pattern each meta-variable
- can match any sub-formula. Here, the meta-variable @samp{a} matched
- the actual variable @samp{x}.
- When the pattern part of a rewrite rule matches a part of the formula,
- that part is replaced by the righthand side with all the meta-variables
- substituted with the things they matched. So the result is
- @samp{sin(x) / cos(x)}. Calc's normal algebraic simplifications then
- mix this in with the rest of the original formula.
- To merge over a common denominator, we can use another simple rule:
- @smallexample
- @group
- 1: (1 - sin(x)^2) / cos(x)
- .
- a r a/x + b/x := (a+b)/x @key{RET}
- @end group
- @end smallexample
- This rule points out several interesting features of rewrite patterns.
- First, if a meta-variable appears several times in a pattern, it must
- match the same thing everywhere. This rule detects common denominators
- because the same meta-variable @samp{x} is used in both of the
- denominators.
- Second, meta-variable names are independent from variables in the
- target formula. Notice that the meta-variable @samp{x} here matches
- the subformula @samp{cos(x)}; Calc never confuses the two meanings of
- @samp{x}.
- And third, rewrite patterns know a little bit about the algebraic
- properties of formulas. The pattern called for a sum of two quotients;
- Calc was able to match a difference of two quotients by matching
- @samp{a = 1}, @samp{b = -sin(x)^2}, and @samp{x = cos(x)}.
- @c [fix-ref Algebraic Properties of Rewrite Rules]
- We could just as easily have written @samp{a/x - b/x := (a-b)/x} for
- the rule. It would have worked just the same in all cases. (If we
- really wanted the rule to apply only to @samp{+} or only to @samp{-},
- we could have used the @code{plain} symbol. @xref{Algebraic Properties
- of Rewrite Rules}, for some examples of this.)
- One more rewrite will complete the job. We want to use the identity
- @samp{sin(x)^2 + cos(x)^2 = 1}, but of course we must first rearrange
- the identity in a way that matches our formula. The obvious rule
- would be @samp{@w{1 - sin(x)^2} := cos(x)^2}, but a little thought shows
- that the rule @samp{sin(x)^2 := 1 - cos(x)^2} will also work. The
- latter rule has a more general pattern so it will work in many other
- situations, too.
- @smallexample
- @group
- 1: (1 + cos(x)^2 - 1) / cos(x) 1: cos(x)
- . .
- a r sin(x)^2 := 1 - cos(x)^2 @key{RET} a s
- @end group
- @end smallexample
- You may ask, what's the point of using the most general rule if you
- have to type it in every time anyway? The answer is that Calc allows
- you to store a rewrite rule in a variable, then give the variable
- name in the @kbd{a r} command. In fact, this is the preferred way to
- use rewrites. For one, if you need a rule once you'll most likely
- need it again later. Also, if the rule doesn't work quite right you
- can simply Undo, edit the variable, and run the rule again without
- having to retype it.
- @smallexample
- @group
- ' tan(x) := sin(x)/cos(x) @key{RET} s t tsc @key{RET}
- ' a/x + b/x := (a+b)/x @key{RET} s t merge @key{RET}
- ' sin(x)^2 := 1 - cos(x)^2 @key{RET} s t sinsqr @key{RET}
- 1: 1 / cos(x) - sin(x) tan(x) 1: cos(x)
- . .
- r 1 a r tsc @key{RET} a r merge @key{RET} a r sinsqr @key{RET} a s
- @end group
- @end smallexample
- To edit a variable, type @kbd{s e} and the variable name, use regular
- Emacs editing commands as necessary, then type @kbd{M-# M-#} or
- @kbd{C-c C-c} to store the edited value back into the variable.
- You can also use @w{@kbd{s e}} to create a new variable if you wish.
- Notice that the first time you use each rule, Calc puts up a ``compiling''
- message briefly. The pattern matcher converts rules into a special
- optimized pattern-matching language rather than using them directly.
- This allows @kbd{a r} to apply even rather complicated rules very
- efficiently. If the rule is stored in a variable, Calc compiles it
- only once and stores the compiled form along with the variable. That's
- another good reason to store your rules in variables rather than
- entering them on the fly.
- (@bullet{}) @strong{Exercise 1.} Type @kbd{m s} to get symbolic
- mode, then enter the formula @samp{@w{(2 + sqrt(2))} / @w{(1 + sqrt(2))}}.
- Using a rewrite rule, simplify this formula by multiplying both
- sides by the conjugate @w{@samp{1 - sqrt(2)}}. The result will have
- to be expanded by the distributive law; do this with another
- rewrite. @xref{Rewrites Answer 1, 1}. (@bullet{})
- The @kbd{a r} command can also accept a vector of rewrite rules, or
- a variable containing a vector of rules.
- @smallexample
- @group
- 1: [tsc, merge, sinsqr] 1: [tan(x) := sin(x) / cos(x), ... ]
- . .
- ' [tsc,merge,sinsqr] @key{RET} =
- @end group
- @end smallexample
- @noindent
- @smallexample
- @group
- 1: 1 / cos(x) - sin(x) tan(x) 1: cos(x)
- . .
- s t trig @key{RET} r 1 a r trig @key{RET} a s
- @end group
- @end smallexample
- @c [fix-ref Nested Formulas with Rewrite Rules]
- Calc tries all the rules you give against all parts of the formula,
- repeating until no further change is possible. (The exact order in
- which things are tried is rather complex, but for simple rules like
- the ones we've used here the order doesn't really matter.
- @xref{Nested Formulas with Rewrite Rules}.)
- Calc actually repeats only up to 100 times, just in case your rule set
- has gotten into an infinite loop. You can give a numeric prefix argument
- to @kbd{a r} to specify any limit. In particular, @kbd{M-1 a r} does
- only one rewrite at a time.
- @smallexample
- @group
- 1: 1 / cos(x) - sin(x)^2 / cos(x) 1: (1 - sin(x)^2) / cos(x)
- . .
- r 1 M-1 a r trig @key{RET} M-1 a r trig @key{RET}
- @end group
- @end smallexample
- You can type @kbd{M-0 a r} if you want no limit at all on the number
- of rewrites that occur.
- Rewrite rules can also be @dfn{conditional}. Simply follow the rule
- with a @samp{::} symbol and the desired condition. For example,
- @smallexample
- @group
- 1: exp(2 pi i) + exp(3 pi i) + exp(4 pi i)
- .
- ' exp(2 pi i) + exp(3 pi i) + exp(4 pi i) @key{RET}
- @end group
- @end smallexample
- @noindent
- @smallexample
- @group
- 1: 1 + exp(3 pi i) + 1
- .
- a r exp(k pi i) := 1 :: k % 2 = 0 @key{RET}
- @end group
- @end smallexample
- @noindent
- (Recall, @samp{k % 2} is the remainder from dividing @samp{k} by 2,
- which will be zero only when @samp{k} is an even integer.)
- An interesting point is that the variables @samp{pi} and @samp{i}
- were matched literally rather than acting as meta-variables.
- This is because they are special-constant variables. The special
- constants @samp{e}, @samp{phi}, and so on also match literally.
- A common error with rewrite
- rules is to write, say, @samp{f(a,b,c,d,e) := g(a+b+c+d+e)}, expecting
- to match any @samp{f} with five arguments but in fact matching
- only when the fifth argument is literally @samp{e}!@refill
- @cindex Fibonacci numbers
- @ignore
- @starindex
- @end ignore
- @tindex fib
- Rewrite rules provide an interesting way to define your own functions.
- Suppose we want to define @samp{fib(n)} to produce the @var{n}th
- Fibonacci number. The first two Fibonacci numbers are each 1;
- later numbers are formed by summing the two preceding numbers in
- the sequence. This is easy to express in a set of three rules:
- @smallexample
- @group
- ' [fib(1) := 1, fib(2) := 1, fib(n) := fib(n-1) + fib(n-2)] @key{RET} s t fib
- 1: fib(7) 1: 13
- . .
- ' fib(7) @key{RET} a r fib @key{RET}
- @end group
- @end smallexample
- One thing that is guaranteed about the order that rewrites are tried
- is that, for any given subformula, earlier rules in the rule set will
- be tried for that subformula before later ones. So even though the
- first and third rules both match @samp{fib(1)}, we know the first will
- be used preferentially.
- This rule set has one dangerous bug: Suppose we apply it to the
- formula @samp{fib(x)}? (Don't actually try this.) The third rule
- will match @samp{fib(x)} and replace it with @w{@samp{fib(x-1) + fib(x-2)}}.
- Each of these will then be replaced to get @samp{fib(x-2) + 2 fib(x-3) +
- fib(x-4)}, and so on, expanding forever. What we really want is to apply
- the third rule only when @samp{n} is an integer greater than two. Type
- @w{@kbd{s e fib @key{RET}}}, then edit the third rule to:
- @smallexample
- fib(n) := fib(n-1) + fib(n-2) :: integer(n) :: n > 2
- @end smallexample
- @noindent
- Now:
- @smallexample
- @group
- 1: fib(6) + fib(x) + fib(0) 1: 8 + fib(x) + fib(0)
- . .
- ' fib(6)+fib(x)+fib(0) @key{RET} a r fib @key{RET}
- @end group
- @end smallexample
- @noindent
- We've created a new function, @code{fib}, and a new command,
- @w{@kbd{a r fib @key{RET}}}, which means ``evaluate all @code{fib} calls in
- this formula.'' To make things easier still, we can tell Calc to
- apply these rules automatically by storing them in the special
- variable @code{EvalRules}.
- @smallexample
- @group
- 1: [fib(1) := ...] . 1: [8, 13]
- . .
- s r fib @key{RET} s t EvalRules @key{RET} ' [fib(6), fib(7)] @key{RET}
- @end group
- @end smallexample
- It turns out that this rule set has the problem that it does far
- more work than it needs to when @samp{n} is large. Consider the
- first few steps of the computation of @samp{fib(6)}:
- @smallexample
- @group
- fib(6) =
- fib(5) + fib(4) =
- fib(4) + fib(3) + fib(3) + fib(2) =
- fib(3) + fib(2) + fib(2) + fib(1) + fib(2) + fib(1) + 1 = ...
- @end group
- @end smallexample
- @noindent
- Note that @samp{fib(3)} appears three times here. Unless Calc's
- algebraic simplifier notices the multiple @samp{fib(3)}s and combines
- them (and, as it happens, it doesn't), this rule set does lots of
- needless recomputation. To cure the problem, type @code{s e EvalRules}
- to edit the rules (or just @kbd{s E}, a shorthand command for editing
- @code{EvalRules}) and add another condition:
- @smallexample
- fib(n) := fib(n-1) + fib(n-2) :: integer(n) :: n > 2 :: remember
- @end smallexample
- @noindent
- If a @samp{:: remember} condition appears anywhere in a rule, then if
- that rule succeeds Calc will add another rule that describes that match
- to the front of the rule set. (Remembering works in any rule set, but
- for technical reasons it is most effective in @code{EvalRules}.) For
- example, if the rule rewrites @samp{fib(7)} to something that evaluates
- to 13, then the rule @samp{fib(7) := 13} will be added to the rule set.
- Type @kbd{' fib(8) @key{RET}} to compute the eighth Fibonacci number, then
- type @kbd{s E} again to see what has happened to the rule set.
- With the @code{remember} feature, our rule set can now compute
- @samp{fib(@var{n})} in just @var{n} steps. In the process it builds
- up a table of all Fibonacci numbers up to @var{n}. After we have
- computed the result for a particular @var{n}, we can get it back
- (and the results for all smaller @var{n}) later in just one step.
- All Calc operations will run somewhat slower whenever @code{EvalRules}
- contains any rules. You should type @kbd{s u EvalRules @key{RET}} now to
- un-store the variable.
- (@bullet{}) @strong{Exercise 2.} Sometimes it is possible to reformulate
- a problem to reduce the amount of recursion necessary to solve it.
- Create a rule that, in about @var{n} simple steps and without recourse
- to the @code{remember} option, replaces @samp{fib(@var{n}, 1, 1)} with
- @samp{fib(1, @var{x}, @var{y})} where @var{x} and @var{y} are the
- @var{n}th and @var{n+1}st Fibonacci numbers, respectively. This rule is
- rather clunky to use, so add a couple more rules to make the ``user
- interface'' the same as for our first version: enter @samp{fib(@var{n})},
- get back a plain number. @xref{Rewrites Answer 2, 2}. (@bullet{})
- There are many more things that rewrites can do. For example, there
- are @samp{&&&} and @samp{|||} pattern operators that create ``and''
- and ``or'' combinations of rules. As one really simple example, we
- could combine our first two Fibonacci rules thusly:
- @example
- [fib(1 ||| 2) := 1, fib(n) := ... ]
- @end example
- @noindent
- That means ``@code{fib} of something matching either 1 or 2 rewrites
- to 1.''
- You can also make meta-variables optional by enclosing them in @code{opt}.
- For example, the pattern @samp{a + b x} matches @samp{2 + 3 x} but not
- @samp{2 + x} or @samp{3 x} or @samp{x}. The pattern @samp{opt(a) + opt(b) x}
- matches all of these forms, filling in a default of zero for @samp{a}
- and one for @samp{b}.
- (@bullet{}) @strong{Exercise 3.} Your friend Joe had @samp{2 + 3 x}
- on the stack and tried to use the rule
- @samp{opt(a) + opt(b) x := f(a, b, x)}. What happened?
- @xref{Rewrites Answer 3, 3}. (@bullet{})
- (@bullet{}) @strong{Exercise 4.} Starting with a positive integer @cite{a},
- divide @cite{a} by two if it is even, otherwise compute @cite{3 a + 1}.
- Now repeat this step over and over. A famous unproved conjecture
- is that for any starting @cite{a}, the sequence always eventually
- reaches 1. Given the formula @samp{seq(@var{a}, 0)}, write a set of
- rules that convert this into @samp{seq(1, @var{n})} where @var{n}
- is the number of steps it took the sequence to reach the value 1.
- Now enhance the rules to accept @samp{seq(@var{a})} as a starting
- configuration, and to stop with just the number @var{n} by itself.
- Now make the result be a vector of values in the sequence, from @var{a}
- to 1. (The formula @samp{@var{x}|@var{y}} appends the vectors @var{x}
- and @var{y}.) For example, rewriting @samp{seq(6)} should yield the
- vector @cite{[6, 3, 10, 5, 16, 8, 4, 2, 1]}.
- @xref{Rewrites Answer 4, 4}. (@bullet{})
- (@bullet{}) @strong{Exercise 5.} Define, using rewrite rules, a function
- @samp{nterms(@var{x})} that returns the number of terms in the sum
- @var{x}, or 1 if @var{x} is not a sum. (A @dfn{sum} for our purposes
- is one or more non-sum terms separated by @samp{+} or @samp{-} signs,
- so that @cite{2 - 3 (x + y) + x y} is a sum of three terms.)
- @xref{Rewrites Answer 5, 5}. (@bullet{})
- (@bullet{}) @strong{Exercise 6.} Calc considers the form @cite{0^0}
- to be ``indeterminate,'' and leaves it unevaluated (assuming infinite
- mode is not enabled). Some people prefer to define @cite{0^0 = 1},
- so that the identity @cite{x^0 = 1} can safely be used for all @cite{x}.
- Find a way to make Calc follow this convention. What happens if you
- now type @kbd{m i} to turn on infinite mode?
- @xref{Rewrites Answer 6, 6}. (@bullet{})
- (@bullet{}) @strong{Exercise 7.} A Taylor series for a function is an
- infinite series that exactly equals the value of that function at
- values of @cite{x} near zero.
- @ifinfo
- @example
- cos(x) = 1 - x^2 / 2! + x^4 / 4! - x^6 / 6! + ...
- @end example
- @end ifinfo
- @tex
- \turnoffactive \let\rm\goodrm
- \beforedisplay
- $$ \cos x = 1 - {x^2 \over 2!} + {x^4 \over 4!} - {x^6 \over 6!} + \cdots $$
- \afterdisplay
- @end tex
- The @kbd{a t} command produces a @dfn{truncated Taylor series} which
- is obtained by dropping all the terms higher than, say, @cite{x^2}.
- Calc represents the truncated Taylor series as a polynomial in @cite{x}.
- Mathematicians often write a truncated series using a ``big-O'' notation
- that records what was the lowest term that was truncated.
- @ifinfo
- @example
- cos(x) = 1 - x^2 / 2! + O(x^3)
- @end example
- @end ifinfo
- @tex
- \turnoffactive \let\rm\goodrm
- \beforedisplay
- $$ \cos x = 1 - {x^2 \over 2!} + O(x^3) $$
- \afterdisplay
- @end tex
- @noindent
- The meaning of @cite{O(x^3)} is ``a quantity which is negligibly small
- if @cite{x^3} is considered negligibly small as @cite{x} goes to zero.''
- The exercise is to create rewrite rules that simplify sums and products of
- power series represented as @samp{@var{polynomial} + O(@var{var}^@var{n})}.
- For example, given @samp{1 - x^2 / 2 + O(x^3)} and @samp{x - x^3 / 6 + O(x^4)}
- on the stack, we want to be able to type @kbd{*} and get the result
- @samp{x - 2:3 x^3 + O(x^4)}. Don't worry if the terms of the sum are
- rearranged or if @kbd{a s} needs to be typed after rewriting. (This one
- is rather tricky; the solution at the end of this chapter uses 6 rewrite
- rules. Hint: The @samp{constant(x)} condition tests whether @samp{x} is
- a number.) @xref{Rewrites Answer 7, 7}. (@bullet{})
- @c [fix-ref Rewrite Rules]
- @xref{Rewrite Rules}, for the whole story on rewrite rules.
- @node Programming Tutorial, Answers to Exercises, Algebra Tutorial, Tutorial
- @section Programming Tutorial
- @noindent
- The Calculator is written entirely in Emacs Lisp, a highly extensible
- language. If you know Lisp, you can program the Calculator to do
- anything you like. Rewrite rules also work as a powerful programming
- system. But Lisp and rewrite rules take a while to master, and often
- all you want to do is define a new function or repeat a command a few
- times. Calc has features that allow you to do these things easily.
- (Note that the programming commands relating to user-defined keys
- are not yet supported under Lucid Emacs 19.)
- One very limited form of programming is defining your own functions.
- Calc's @kbd{Z F} command allows you to define a function name and
- key sequence to correspond to any formula. Programming commands use
- the shift-@kbd{Z} prefix; the user commands they create use the lower
- case @kbd{z} prefix.
- @smallexample
- @group
- 1: 1 + x + x^2 / 2 + x^3 / 6 1: 1 + x + x^2 / 2 + x^3 / 6
- . .
- ' 1 + x + x^2/2! + x^3/3! @key{RET} Z F e myexp @key{RET} @key{RET} @key{RET} y
- @end group
- @end smallexample
- This polynomial is a Taylor series approximation to @samp{exp(x)}.
- The @kbd{Z F} command asks a number of questions. The above answers
- say that the key sequence for our function should be @kbd{z e}; the
- @kbd{M-x} equivalent should be @code{calc-myexp}; the name of the
- function in algebraic formulas should also be @code{myexp}; the
- default argument list @samp{(x)} is acceptable; and finally @kbd{y}
- answers the question ``leave it in symbolic form for non-constant
- arguments?''
- @smallexample
- @group
- 1: 1.3495 2: 1.3495 3: 1.3495
- . 1: 1.34986 2: 1.34986
- . 1: myexp(a + 1)
- .
- .3 z e .3 E ' a+1 @key{RET} z e
- @end group
- @end smallexample
- @noindent
- First we call our new @code{exp} approximation with 0.3 as an
- argument, and compare it with the true @code{exp} function. Then
- we note that, as requested, if we try to give @kbd{z e} an
- argument that isn't a plain number, it leaves the @code{myexp}
- function call in symbolic form. If we had answered @kbd{n} to the
- final question, @samp{myexp(a + 1)} would have evaluated by plugging
- in @samp{a + 1} for @samp{x} in the defining formula.
- @cindex Sine integral Si(x)
- @ignore
- @starindex
- @end ignore
- @tindex Si
- (@bullet{}) @strong{Exercise 1.} The ``sine integral'' function
- @c{${\rm Si}(x)$}
- @cite{Si(x)} is defined as the integral of @samp{sin(t)/t} for
- @cite{t = 0} to @cite{x} in radians. (It was invented because this
- integral has no solution in terms of basic functions; if you give it
- to Calc's @kbd{a i} command, it will ponder it for a long time and then
- give up.) We can use the numerical integration command, however,
- which in algebraic notation is written like @samp{ninteg(f(t), t, 0, x)}
- with any integrand @samp{f(t)}. Define a @kbd{z s} command and
- @code{Si} function that implement this. You will need to edit the
- default argument list a bit. As a test, @samp{Si(1)} should return
- 0.946083. (Hint: @code{ninteg} will run a lot faster if you reduce
- the precision to, say, six digits beforehand.)
- @xref{Programming Answer 1, 1}. (@bullet{})
- The simplest way to do real ``programming'' of Emacs is to define a
- @dfn{keyboard macro}. A keyboard macro is simply a sequence of
- keystrokes which Emacs has stored away and can play back on demand.
- For example, if you find yourself typing @kbd{H a S x @key{RET}} often,
- you may wish to program a keyboard macro to type this for you.
- @smallexample
- @group
- 1: y = sqrt(x) 1: x = y^2
- . .
- ' y=sqrt(x) @key{RET} C-x ( H a S x @key{RET} C-x )
- 1: y = cos(x) 1: x = s1 arccos(y) + 2 pi n1
- . .
- ' y=cos(x) @key{RET} X
- @end group
- @end smallexample
- @noindent
- When you type @kbd{C-x (}, Emacs begins recording. But it is also
- still ready to execute your keystrokes, so you're really ``training''
- Emacs by walking it through the procedure once. When you type
- @w{@kbd{C-x )}}, the macro is recorded. You can now type @kbd{X} to
- re-execute the same keystrokes.
- You can give a name to your macro by typing @kbd{Z K}.
- @smallexample
- @group
- 1: . 1: y = x^4 1: x = s2 sqrt(s1 sqrt(y))
- . .
- Z K x @key{RET} ' y=x^4 @key{RET} z x
- @end group
- @end smallexample
- @noindent
- Notice that we use shift-@kbd{Z} to define the command, and lower-case
- @kbd{z} to call it up.
- Keyboard macros can call other macros.
- @smallexample
- @group
- 1: abs(x) 1: x = s1 y 1: 2 / x 1: x = 2 / y
- . . . .
- ' abs(x) @key{RET} C-x ( ' y @key{RET} a = z x C-x ) ' 2/x @key{RET} X
- @end group
- @end smallexample
- (@bullet{}) @strong{Exercise 2.} Define a keyboard macro to negate
- the item in level 3 of the stack, without disturbing the rest of
- the stack. @xref{Programming Answer 2, 2}. (@bullet{})
- (@bullet{}) @strong{Exercise 3.} Define keyboard macros to compute
- the following functions:
- @enumerate
- @item
- Compute @c{$\displaystyle{\sin x \over x}$}
- @cite{sin(x) / x}, where @cite{x} is the number on the
- top of the stack.
- @item
- Compute the base-@cite{b} logarithm, just like the @kbd{B} key except
- the arguments are taken in the opposite order.
- @item
- Produce a vector of integers from 1 to the integer on the top of
- the stack.
- @end enumerate
- @noindent
- @xref{Programming Answer 3, 3}. (@bullet{})
- (@bullet{}) @strong{Exercise 4.} Define a keyboard macro to compute
- the average (mean) value of a list of numbers.
- @xref{Programming Answer 4, 4}. (@bullet{})
- In many programs, some of the steps must execute several times.
- Calc has @dfn{looping} commands that allow this. Loops are useful
- inside keyboard macros, but actually work at any time.
- @smallexample
- @group
- 1: x^6 2: x^6 1: 360 x^2
- . 1: 4 .
- .
- ' x^6 @key{RET} 4 Z < a d x @key{RET} Z >
- @end group
- @end smallexample
- @noindent
- Here we have computed the fourth derivative of @cite{x^6} by
- enclosing a derivative command in a ``repeat loop'' structure.
- This structure pops a repeat count from the stack, then
- executes the body of the loop that many times.
- If you make a mistake while entering the body of the loop,
- type @w{@kbd{Z C-g}} to cancel the loop command.
- @cindex Fibonacci numbers
- Here's another example:
- @smallexample
- @group
- 3: 1 2: 10946
- 2: 1 1: 17711
- 1: 20 .
- .
- 1 @key{RET} @key{RET} 20 Z < @key{TAB} C-j + Z >
- @end group
- @end smallexample
- @noindent
- The numbers in levels 2 and 1 should be the 21st and 22nd Fibonacci
- numbers, respectively. (To see what's going on, try a few repetitions
- of the loop body by hand; @kbd{C-j}, also on the Line-Feed or @key{LFD}
- key if you have one, makes a copy of the number in level 2.)
- @cindex Golden ratio
- @cindex Phi, golden ratio
- A fascinating property of the Fibonacci numbers is that the @cite{n}th
- Fibonacci number can be found directly by computing @c{$\phi^n / \sqrt{5}$}
- @cite{phi^n / sqrt(5)}
- and then rounding to the nearest integer, where @c{$\phi$ (``phi'')}
- @cite{phi}, the
- ``golden ratio,'' is @c{$(1 + \sqrt{5}) / 2$}
- @cite{(1 + sqrt(5)) / 2}. (For convenience, this constant is available
- from the @code{phi} variable, or the @kbd{I H P} command.)
- @smallexample
- @group
- 1: 1.61803 1: 24476.0000409 1: 10945.9999817 1: 10946
- . . . .
- I H P 21 ^ 5 Q / R
- @end group
- @end smallexample
- @cindex Continued fractions
- (@bullet{}) @strong{Exercise 5.} The @dfn{continued fraction}
- representation of @c{$\phi$}
- @cite{phi} is @c{$1 + 1/(1 + 1/(1 + 1/( \ldots )))$}
- @cite{1 + 1/(1 + 1/(1 + 1/( ...@: )))}.
- We can compute an approximate value by carrying this however far
- and then replacing the innermost @c{$1/( \ldots )$}
- @cite{1/( ...@: )} by 1. Approximate
- @c{$\phi$}
- @cite{phi} using a twenty-term continued fraction.
- @xref{Programming Answer 5, 5}. (@bullet{})
- (@bullet{}) @strong{Exercise 6.} Linear recurrences like the one for
- Fibonacci numbers can be expressed in terms of matrices. Given a
- vector @w{@cite{[a, b]}} determine a matrix which, when multiplied by this
- vector, produces the vector @cite{[b, c]}, where @cite{a}, @cite{b} and
- @cite{c} are three successive Fibonacci numbers. Now write a program
- that, given an integer @cite{n}, computes the @cite{n}th Fibonacci number
- using matrix arithmetic. @xref{Programming Answer 6, 6}. (@bullet{})
- @cindex Harmonic numbers
- A more sophisticated kind of loop is the @dfn{for} loop. Suppose
- we wish to compute the 20th ``harmonic'' number, which is equal to
- the sum of the reciprocals of the integers from 1 to 20.
- @smallexample
- @group
- 3: 0 1: 3.597739
- 2: 1 .
- 1: 20
- .
- 0 @key{RET} 1 @key{RET} 20 Z ( & + 1 Z )
- @end group
- @end smallexample
- @noindent
- The ``for'' loop pops two numbers, the lower and upper limits, then
- repeats the body of the loop as an internal counter increases from
- the lower limit to the upper one. Just before executing the loop
- body, it pushes the current loop counter. When the loop body
- finishes, it pops the ``step,'' i.e., the amount by which to
- increment the loop counter. As you can see, our loop always
- uses a step of one.
- This harmonic number function uses the stack to hold the running
- total as well as for the various loop housekeeping functions. If
- you find this disorienting, you can sum in a variable instead:
- @smallexample
- @group
- 1: 0 2: 1 . 1: 3.597739
- . 1: 20 .
- .
- 0 t 7 1 @key{RET} 20 Z ( & s + 7 1 Z ) r 7
- @end group
- @end smallexample
- @noindent
- The @kbd{s +} command adds the top-of-stack into the value in a
- variable (and removes that value from the stack).
- It's worth noting that many jobs that call for a ``for'' loop can
- also be done more easily by Calc's high-level operations. Two
- other ways to compute harmonic numbers are to use vector mapping
- and reduction (@kbd{v x 20}, then @w{@kbd{V M &}}, then @kbd{V R +}),
- or to use the summation command @kbd{a +}. Both of these are
- probably easier than using loops. However, there are some
- situations where loops really are the way to go:
- (@bullet{}) @strong{Exercise 7.} Use a ``for'' loop to find the first
- harmonic number which is greater than 4.0.
- @xref{Programming Answer 7, 7}. (@bullet{})
- Of course, if we're going to be using variables in our programs,
- we have to worry about the programs clobbering values that the
- caller was keeping in those same variables. This is easy to
- fix, though:
- @smallexample
- @group
- . 1: 0.6667 1: 0.6667 3: 0.6667
- . . 2: 3.597739
- 1: 0.6667
- .
- Z ` p 4 @key{RET} 2 @key{RET} 3 / s 7 s s a @key{RET} Z ' r 7 s r a @key{RET}
- @end group
- @end smallexample
- @noindent
- When we type @kbd{Z `} (that's a back-quote character), Calc saves
- its mode settings and the contents of the ten ``quick variables''
- for later reference. When we type @kbd{Z '} (that's an apostrophe
- now), Calc restores those saved values. Thus the @kbd{p 4} and
- @kbd{s 7} commands have no effect outside this sequence. Wrapping
- this around the body of a keyboard macro ensures that it doesn't
- interfere with what the user of the macro was doing. Notice that
- the contents of the stack, and the values of named variables,
- survive past the @kbd{Z '} command.
- @cindex Bernoulli numbers, approximate
- The @dfn{Bernoulli numbers} are a sequence with the interesting
- property that all of the odd Bernoulli numbers are zero, and the
- even ones, while difficult to compute, can be roughly approximated
- by the formula @c{$\displaystyle{2 n! \over (2 \pi)^n}$}
- @cite{2 n!@: / (2 pi)^n}. Let's write a keyboard
- macro to compute (approximate) Bernoulli numbers. (Calc has a
- command, @kbd{k b}, to compute exact Bernoulli numbers, but
- this command is very slow for large @cite{n} since the higher
- Bernoulli numbers are very large fractions.)
- @smallexample
- @group
- 1: 10 1: 0.0756823
- . .
- 10 C-x ( @key{RET} 2 % Z [ @key{DEL} 0 Z : ' 2 $! / (2 pi)^$ @key{RET} = Z ] C-x )
- @end group
- @end smallexample
- @noindent
- You can read @kbd{Z [} as ``then,'' @kbd{Z :} as ``else,'' and
- @kbd{Z ]} as ``end-if.'' There is no need for an explicit ``if''
- command. For the purposes of @w{@kbd{Z [}}, the condition is ``true''
- if the value it pops from the stack is a nonzero number, or ``false''
- if it pops zero or something that is not a number (like a formula).
- Here we take our integer argument modulo 2; this will be nonzero
- if we're asking for an odd Bernoulli number.
- The actual tenth Bernoulli number is @cite{5/66}.
- @smallexample
- @group
- 3: 0.0756823 1: 0 1: 0.25305 1: 0 1: 1.16659
- 2: 5:66 . . . .
- 1: 0.0757575
- .
- 10 k b @key{RET} c f M-0 @key{DEL} 11 X @key{DEL} 12 X @key{DEL} 13 X @key{DEL} 14 X
- @end group
- @end smallexample
- Just to exercise loops a bit more, let's compute a table of even
- Bernoulli numbers.
- @smallexample
- @group
- 3: [] 1: [0.10132, 0.03079, 0.02340, 0.033197, ...]
- 2: 2 .
- 1: 30
- .
- [ ] 2 @key{RET} 30 Z ( X | 2 Z )
- @end group
- @end smallexample
- @noindent
- The vertical-bar @kbd{|} is the vector-concatenation command. When
- we execute it, the list we are building will be in stack level 2
- (initially this is an empty list), and the next Bernoulli number
- will be in level 1. The effect is to append the Bernoulli number
- onto the end of the list. (To create a table of exact fractional
- Bernoulli numbers, just replace @kbd{X} with @kbd{k b} in the above
- sequence of keystrokes.)
- With loops and conditionals, you can program essentially anything
- in Calc. One other command that makes looping easier is @kbd{Z /},
- which takes a condition from the stack and breaks out of the enclosing
- loop if the condition is true (non-zero). You can use this to make
- ``while'' and ``until'' style loops.
- If you make a mistake when entering a keyboard macro, you can edit
- it using @kbd{Z E}. First, you must attach it to a key with @kbd{Z K}.
- One technique is to enter a throwaway dummy definition for the macro,
- then enter the real one in the edit command.
- @smallexample
- @group
- 1: 3 1: 3 Keyboard Macro Editor.
- . . Original keys: 1 @key{RET} 2 +
- type "1\r"
- type "2"
- calc-plus
- C-x ( 1 @key{RET} 2 + C-x ) Z K h @key{RET} Z E h
- @end group
- @end smallexample
- @noindent
- This shows the screen display assuming you have the @file{macedit}
- keyboard macro editing package installed, which is usually the case
- since a copy of @file{macedit} comes bundled with Calc.
- A keyboard macro is stored as a pure keystroke sequence. The
- @file{macedit} package (invoked by @kbd{Z E}) scans along the
- macro and tries to decode it back into human-readable steps.
- If a key or keys are simply shorthand for some command with a
- @kbd{M-x} name, that name is shown. Anything that doesn't correspond
- to a @kbd{M-x} command is written as a @samp{type} command.
- Let's edit in a new definition, for computing harmonic numbers.
- First, erase the three lines of the old definition. Then, type
- in the new definition (or use Emacs @kbd{M-w} and @kbd{C-y} commands
- to copy it from this page of the Info file; you can skip typing
- the comments that begin with @samp{#}).
- @smallexample
- calc-kbd-push # Save local values (Z `)
- type "0" # Push a zero
- calc-store-into # Store it in variable 1
- type "1"
- type "1" # Initial value for loop
- calc-roll-down # This is the @key{TAB} key; swap initial & final
- calc-kbd-for # Begin "for" loop...
- calc-inv # Take reciprocal
- calc-store-plus # Add to accumulator
- type "1"
- type "1" # Loop step is 1
- calc-kbd-end-for # End "for" loop
- calc-recall # Now recall final accumulated value
- type "1"
- calc-kbd-pop # Restore values (Z ')
- @end smallexample
- @noindent
- Press @kbd{M-# M-#} to finish editing and return to the Calculator.
- @smallexample
- @group
- 1: 20 1: 3.597739
- . .
- 20 z h
- @end group
- @end smallexample
- If you don't know how to write a particular command in @file{macedit}
- format, you can always write it as keystrokes in a @code{type} command.
- There is also a @code{keys} command which interprets the rest of the
- line as standard Emacs keystroke names. In fact, @file{macedit} defines
- a handy @code{read-kbd-macro} command which reads the current region
- of the current buffer as a sequence of keystroke names, and defines that
- sequence on the @kbd{X} (and @kbd{C-x e}) key. Because this is so
- useful, Calc puts this command on the @kbd{M-# m} key. Try reading in
- this macro in the following form: Press @kbd{C-@@} (or @kbd{C-@key{SPC}}) at
- one end of the text below, then type @kbd{M-# m} at the other.
- @example
- @group
- Z ` 0 t 1
- 1 @key{TAB}
- Z ( & s + 1 1 Z )
- r 1
- Z '
- @end group
- @end example
- (@bullet{}) @strong{Exercise 8.} A general algorithm for solving
- equations numerically is @dfn{Newton's Method}. Given the equation
- @cite{f(x) = 0} for any function @cite{f}, and an initial guess
- @cite{x_0} which is reasonably close to the desired solution, apply
- this formula over and over:
- @ifinfo
- @example
- new_x = x - f(x)/f'(x)
- @end example
- @end ifinfo
- @tex
- \beforedisplay
- $$ x_{\goodrm new} = x - {f(x) \over f'(x)} $$
- \afterdisplay
- @end tex
- @noindent
- where @cite{f'(x)} is the derivative of @cite{f}. The @cite{x}
- values will quickly converge to a solution, i.e., eventually
- @c{$x_{\rm new}$}
- @cite{new_x} and @cite{x} will be equal to within the limits
- of the current precision. Write a program which takes a formula
- involving the variable @cite{x}, and an initial guess @cite{x_0},
- on the stack, and produces a value of @cite{x} for which the formula
- is zero. Use it to find a solution of @c{$\sin(\cos x) = 0.5$}
- @cite{sin(cos(x)) = 0.5}
- near @cite{x = 4.5}. (Use angles measured in radians.) Note that
- the built-in @w{@kbd{a R}} (@code{calc-find-root}) command uses Newton's
- method when it is able. @xref{Programming Answer 8, 8}. (@bullet{})
- @cindex Digamma function
- @cindex Gamma constant, Euler's
- @cindex Euler's gamma constant
- (@bullet{}) @strong{Exercise 9.} The @dfn{digamma} function @c{$\psi(z)$ (``psi'')}
- @cite{psi(z)}
- is defined as the derivative of @c{$\ln \Gamma(z)$}
- @cite{ln(gamma(z))}. For large
- values of @cite{z}, it can be approximated by the infinite sum
- @ifinfo
- @example
- psi(z) ~= ln(z) - 1/2z - sum(bern(2 n) / 2 n z^(2 n), n, 1, inf)
- @end example
- @end ifinfo
- @tex
- \let\rm\goodrm
- \beforedisplay
- $$ \psi(z) \approx \ln z - {1\over2z} -
- \sum_{n=1}^\infty {\code{bern}(2 n) \over 2 n z^{2n}}
- $$
- \afterdisplay
- @end tex
- @noindent
- where @c{$\sum$}
- @cite{sum} represents the sum over @cite{n} from 1 to infinity
- (or to some limit high enough to give the desired accuracy), and
- the @code{bern} function produces (exact) Bernoulli numbers.
- While this sum is not guaranteed to converge, in practice it is safe.
- An interesting mathematical constant is Euler's gamma, which is equal
- to about 0.5772. One way to compute it is by the formula,
- @c{$\gamma = -\psi(1)$}
- @cite{gamma = -psi(1)}. Unfortunately, 1 isn't a large enough argument
- for the above formula to work (5 is a much safer value for @cite{z}).
- Fortunately, we can compute @c{$\psi(1)$}
- @cite{psi(1)} from @c{$\psi(5)$}
- @cite{psi(5)} using
- the recurrence @c{$\psi(z+1) = \psi(z) + {1 \over z}$}
- @cite{psi(z+1) = psi(z) + 1/z}. Your task: Develop
- a program to compute @c{$\psi(z)$}
- @cite{psi(z)}; it should ``pump up'' @cite{z}
- if necessary to be greater than 5, then use the above summation
- formula. Use looping commands to compute the sum. Use your function
- to compute @c{$\gamma$}
- @cite{gamma} to twelve decimal places. (Calc has a built-in command
- for Euler's constant, @kbd{I P}, which you can use to check your answer.)
- @xref{Programming Answer 9, 9}. (@bullet{})
- @cindex Polynomial, list of coefficients
- (@bullet{}) @strong{Exercise 10.} Given a polynomial in @cite{x} and
- a number @cite{m} on the stack, where the polynomial is of degree
- @cite{m} or less (i.e., does not have any terms higher than @cite{x^m}),
- write a program to convert the polynomial into a list-of-coefficients
- notation. For example, @cite{5 x^4 + (x + 1)^2} with @cite{m = 6}
- should produce the list @cite{[1, 2, 1, 0, 5, 0, 0]}. Also develop
- a way to convert from this form back to the standard algebraic form.
- @xref{Programming Answer 10, 10}. (@bullet{})
- @cindex Recursion
- (@bullet{}) @strong{Exercise 11.} The @dfn{Stirling numbers of the
- first kind} are defined by the recurrences,
- @ifinfo
- @example
- s(n,n) = 1 for n >= 0,
- s(n,0) = 0 for n > 0,
- s(n+1,m) = s(n,m-1) - n s(n,m) for n >= m >= 1.
- @end example
- @end ifinfo
- @tex
- \turnoffactive
- \beforedisplay
- $$ \eqalign{ s(n,n) &= 1 \qquad \hbox{for } n \ge 0, \cr
- s(n,0) &= 0 \qquad \hbox{for } n > 0, \cr
- s(n+1,m) &= s(n,m-1) - n \, s(n,m) \qquad
- \hbox{for } n \ge m \ge 1.}
- $$
- \afterdisplay
- \vskip5pt
- (These numbers are also sometimes written $\displaystyle{n \brack m}$.)
- @end tex
- This can be implemented using a @dfn{recursive} program in Calc; the
- program must invoke itself in order to calculate the two righthand
- terms in the general formula. Since it always invokes itself with
- ``simpler'' arguments, it's easy to see that it must eventually finish
- the computation. Recursion is a little difficult with Emacs keyboard
- macros since the macro is executed before its definition is complete.
- So here's the recommended strategy: Create a ``dummy macro'' and assign
- it to a key with, e.g., @kbd{Z K s}. Now enter the true definition,
- using the @kbd{z s} command to call itself recursively, then assign it
- to the same key with @kbd{Z K s}. Now the @kbd{z s} command will run
- the complete recursive program. (Another way is to use @w{@kbd{Z E}}
- or @kbd{M-# m} (@code{read-kbd-macro}) to read the whole macro at once,
- thus avoiding the ``training'' phase.) The task: Write a program
- that computes Stirling numbers of the first kind, given @cite{n} and
- @cite{m} on the stack. Test it with @emph{small} inputs like
- @cite{s(4,2)}. (There is a built-in command for Stirling numbers,
- @kbd{k s}, which you can use to check your answers.)
- @xref{Programming Answer 11, 11}. (@bullet{})
- The programming commands we've seen in this part of the tutorial
- are low-level, general-purpose operations. Often you will find
- that a higher-level function, such as vector mapping or rewrite
- rules, will do the job much more easily than a detailed, step-by-step
- program can:
- (@bullet{}) @strong{Exercise 12.} Write another program for
- computing Stirling numbers of the first kind, this time using
- rewrite rules. Once again, @cite{n} and @cite{m} should be taken
- from the stack. @xref{Programming Answer 12, 12}. (@bullet{})
- @example
- @end example
- This ends the tutorial section of the Calc manual. Now you know enough
- about Calc to use it effectively for many kinds of calculations. But
- Calc has many features that were not even touched upon in this tutorial.
- @c [not-split]
- The rest of this manual tells the whole story.
- @c [when-split]
- @c Volume II of this manual, the @dfn{Calc Reference}, tells the whole story.
- @page
- @node Answers to Exercises, , Programming Tutorial, Tutorial
- @section Answers to Exercises
- @noindent
- This section includes answers to all the exercises in the Calc tutorial.
- @menu
- * RPN Answer 1:: 1 @key{RET} 2 @key{RET} 3 @key{RET} 4 + * -
- * RPN Answer 2:: 2*4 + 7*9.5 + 5/4
- * RPN Answer 3:: Operating on levels 2 and 3
- * RPN Answer 4:: Joe's complex problems
- * Algebraic Answer 1:: Simulating Q command
- * Algebraic Answer 2:: Joe's algebraic woes
- * Algebraic Answer 3:: 1 / 0
- * Modes Answer 1:: 3#0.1 = 3#0.0222222?
- * Modes Answer 2:: 16#f.e8fe15
- * Modes Answer 3:: Joe's rounding bug
- * Modes Answer 4:: Why floating point?
- * Arithmetic Answer 1:: Why the \ command?
- * Arithmetic Answer 2:: Tripping up the B command
- * Vector Answer 1:: Normalizing a vector
- * Vector Answer 2:: Average position
- * Matrix Answer 1:: Row and column sums
- * Matrix Answer 2:: Symbolic system of equations
- * Matrix Answer 3:: Over-determined system
- * List Answer 1:: Powers of two
- * List Answer 2:: Least-squares fit with matrices
- * List Answer 3:: Geometric mean
- * List Answer 4:: Divisor function
- * List Answer 5:: Duplicate factors
- * List Answer 6:: Triangular list
- * List Answer 7:: Another triangular list
- * List Answer 8:: Maximum of Bessel function
- * List Answer 9:: Integers the hard way
- * List Answer 10:: All elements equal
- * List Answer 11:: Estimating pi with darts
- * List Answer 12:: Estimating pi with matchsticks
- * List Answer 13:: Hash codes
- * List Answer 14:: Random walk
- * Types Answer 1:: Square root of pi times rational
- * Types Answer 2:: Infinities
- * Types Answer 3:: What can "nan" be?
- * Types Answer 4:: Abbey Road
- * Types Answer 5:: Friday the 13th
- * Types Answer 6:: Leap years
- * Types Answer 7:: Erroneous donut
- * Types Answer 8:: Dividing intervals
- * Types Answer 9:: Squaring intervals
- * Types Answer 10:: Fermat's primality test
- * Types Answer 11:: pi * 10^7 seconds
- * Types Answer 12:: Abbey Road on CD
- * Types Answer 13:: Not quite pi * 10^7 seconds
- * Types Answer 14:: Supercomputers and c
- * Types Answer 15:: Sam the Slug
- * Algebra Answer 1:: Squares and square roots
- * Algebra Answer 2:: Building polynomial from roots
- * Algebra Answer 3:: Integral of x sin(pi x)
- * Algebra Answer 4:: Simpson's rule
- * Rewrites Answer 1:: Multiplying by conjugate
- * Rewrites Answer 2:: Alternative fib rule
- * Rewrites Answer 3:: Rewriting opt(a) + opt(b) x
- * Rewrites Answer 4:: Sequence of integers
- * Rewrites Answer 5:: Number of terms in sum
- * Rewrites Answer 6:: Defining 0^0 = 1
- * Rewrites Answer 7:: Truncated Taylor series
- * Programming Answer 1:: Fresnel's C(x)
- * Programming Answer 2:: Negate third stack element
- * Programming Answer 3:: Compute sin(x) / x, etc.
- * Programming Answer 4:: Average value of a list
- * Programming Answer 5:: Continued fraction phi
- * Programming Answer 6:: Matrix Fibonacci numbers
- * Programming Answer 7:: Harmonic number greater than 4
- * Programming Answer 8:: Newton's method
- * Programming Answer 9:: Digamma function
- * Programming Answer 10:: Unpacking a polynomial
- * Programming Answer 11:: Recursive Stirling numbers
- * Programming Answer 12:: Stirling numbers with rewrites
- @end menu
- @c The following kludgery prevents the individual answers from
- @c being entered on the table of contents.
- @tex
- \global\let\oldwrite=\write
- \gdef\skipwrite#1#2{\let\write=\oldwrite}
- \global\let\oldchapternofonts=\chapternofonts
- \gdef\chapternofonts{\let\write=\skipwrite\oldchapternofonts}
- @end tex
- @node RPN Answer 1, RPN Answer 2, Answers to Exercises, Answers to Exercises
- @subsection RPN Tutorial Exercise 1
- @noindent
- @kbd{1 @key{RET} 2 @key{RET} 3 @key{RET} 4 + * -}
- The result is @c{$1 - (2 \times (3 + 4)) = -13$}
- @cite{1 - (2 * (3 + 4)) = -13}.
- @node RPN Answer 2, RPN Answer 3, RPN Answer 1, Answers to Exercises
- @subsection RPN Tutorial Exercise 2
- @noindent
- @c{$2\times4 + 7\times9.5 + {5\over4} = 75.75$}
- @cite{2*4 + 7*9.5 + 5/4 = 75.75}
- After computing the intermediate term @c{$2\times4 = 8$}
- @cite{2*4 = 8}, you can leave
- that result on the stack while you compute the second term. With
- both of these results waiting on the stack you can then compute the
- final term, then press @kbd{+ +} to add everything up.
- @smallexample
- @group
- 2: 2 1: 8 3: 8 2: 8
- 1: 4 . 2: 7 1: 66.5
- . 1: 9.5 .
- .
- 2 @key{RET} 4 * 7 @key{RET} 9.5 *
- @end group
- @end smallexample
- @noindent
- @smallexample
- @group
- 4: 8 3: 8 2: 8 1: 75.75
- 3: 66.5 2: 66.5 1: 67.75 .
- 2: 5 1: 1.25 .
- 1: 4 .
- .
- 5 @key{RET} 4 / + +
- @end group
- @end smallexample
- Alternatively, you could add the first two terms before going on
- with the third term.
- @smallexample
- @group
- 2: 8 1: 74.5 3: 74.5 2: 74.5 1: 75.75
- 1: 66.5 . 2: 5 1: 1.25 .
- . 1: 4 .
- .
- ... + 5 @key{RET} 4 / +
- @end group
- @end smallexample
- On an old-style RPN calculator this second method would have the
- advantage of using only three stack levels. But since Calc's stack
- can grow arbitrarily large this isn't really an issue. Which method
- you choose is purely a matter of taste.
- @node RPN Answer 3, RPN Answer 4, RPN Answer 2, Answers to Exercises
- @subsection RPN Tutorial Exercise 3
- @noindent
- The @key{TAB} key provides a way to operate on the number in level 2.
- @smallexample
- @group
- 3: 10 3: 10 4: 10 3: 10 3: 10
- 2: 20 2: 30 3: 30 2: 30 2: 21
- 1: 30 1: 20 2: 20 1: 21 1: 30
- . . 1: 1 . .
- .
- @key{TAB} 1 + @key{TAB}
- @end group
- @end smallexample
- Similarly, @kbd{M-@key{TAB}} gives you access to the number in level 3.
- @smallexample
- @group
- 3: 10 3: 21 3: 21 3: 30 3: 11
- 2: 21 2: 30 2: 30 2: 11 2: 21
- 1: 30 1: 10 1: 11 1: 21 1: 30
- . . . . .
- M-@key{TAB} 1 + M-@key{TAB} M-@key{TAB}
- @end group
- @end smallexample
- @node RPN Answer 4, Algebraic Answer 1, RPN Answer 3, Answers to Exercises
- @subsection RPN Tutorial Exercise 4
- @noindent
- Either @kbd{( 2 , 3 )} or @kbd{( 2 @key{SPC} 3 )} would have worked,
- but using both the comma and the space at once yields:
- @smallexample
- @group
- 1: ( ... 2: ( ... 1: (2, ... 2: (2, ... 2: (2, ...
- . 1: 2 . 1: (2, ... 1: (2, 3)
- . . .
- ( 2 , @key{SPC} 3 )
- @end group
- @end smallexample
- Joe probably tried to type @kbd{@key{TAB} @key{DEL}} to swap the
- extra incomplete object to the top of the stack and delete it.
- But a feature of Calc is that @key{DEL} on an incomplete object
- deletes just one component out of that object, so he had to press
- @key{DEL} twice to finish the job.
- @smallexample
- @group
- 2: (2, ... 2: (2, 3) 2: (2, 3) 1: (2, 3)
- 1: (2, 3) 1: (2, ... 1: ( ... .
- . . .
- @key{TAB} @key{DEL} @key{DEL}
- @end group
- @end smallexample
- (As it turns out, deleting the second-to-top stack entry happens often
- enough that Calc provides a special key, @kbd{M-@key{DEL}}, to do just that.
- @kbd{M-@key{DEL}} is just like @kbd{@key{TAB} @key{DEL}}, except that it doesn't exhibit
- the ``feature'' that tripped poor Joe.)
- @node Algebraic Answer 1, Algebraic Answer 2, RPN Answer 4, Answers to Exercises
- @subsection Algebraic Entry Tutorial Exercise 1
- @noindent
- Type @kbd{' sqrt($) @key{RET}}.
- If the @kbd{Q} key is broken, you could use @kbd{' $^0.5 @key{RET}}.
- Or, RPN style, @kbd{0.5 ^}.
- (Actually, @samp{$^1:2}, using the fraction one-half as the power, is
- a closer equivalent, since @samp{9^0.5} yields @cite{3.0} whereas
- @samp{sqrt(9)} and @samp{9^1:2} yield the exact integer @cite{3}.)
- @node Algebraic Answer 2, Algebraic Answer 3, Algebraic Answer 1, Answers to Exercises
- @subsection Algebraic Entry Tutorial Exercise 2
- @noindent
- In the formula @samp{2 x (1+y)}, @samp{x} was interpreted as a function
- name with @samp{1+y} as its argument. Assigning a value to a variable
- has no relation to a function by the same name. Joe needed to use an
- explicit @samp{*} symbol here: @samp{2 x*(1+y)}.
- @node Algebraic Answer 3, Modes Answer 1, Algebraic Answer 2, Answers to Exercises
- @subsection Algebraic Entry Tutorial Exercise 3
- @noindent
- The result from @kbd{1 @key{RET} 0 /} will be the formula @cite{1 / 0}.
- The ``function'' @samp{/} cannot be evaluated when its second argument
- is zero, so it is left in symbolic form. When you now type @kbd{0 *},
- the result will be zero because Calc uses the general rule that ``zero
- times anything is zero.''
- @c [fix-ref Infinities]
- The @kbd{m i} command enables an @dfn{infinite mode} in which @cite{1 / 0}
- results in a special symbol that represents ``infinity.'' If you
- multiply infinity by zero, Calc uses another special new symbol to
- show that the answer is ``indeterminate.'' @xref{Infinities}, for
- further discussion of infinite and indeterminate values.
- @node Modes Answer 1, Modes Answer 2, Algebraic Answer 3, Answers to Exercises
- @subsection Modes Tutorial Exercise 1
- @noindent
- Calc always stores its numbers in decimal, so even though one-third has
- an exact base-3 representation (@samp{3#0.1}), it is still stored as
- 0.3333333 (chopped off after 12 or however many decimal digits) inside
- the calculator's memory. When this inexact number is converted back
- to base 3 for display, it may still be slightly inexact. When we
- multiply this number by 3, we get 0.999999, also an inexact value.
- When Calc displays a number in base 3, it has to decide how many digits
- to show. If the current precision is 12 (decimal) digits, that corresponds
- to @samp{12 / log10(3) = 25.15} base-3 digits. Because 25.15 is not an
- exact integer, Calc shows only 25 digits, with the result that stored
- numbers carry a little bit of extra information that may not show up on
- the screen. When Joe entered @samp{3#0.2}, the stored number 0.666666
- happened to round to a pleasing value when it lost that last 0.15 of a
- digit, but it was still inexact in Calc's memory. When he divided by 2,
- he still got the dreaded inexact value 0.333333. (Actually, he divided
- 0.666667 by 2 to get 0.333334, which is why he got something a little
- higher than @code{3#0.1} instead of a little lower.)
- If Joe didn't want to be bothered with all this, he could have typed
- @kbd{M-24 d n} to display with one less digit than the default. (If
- you give @kbd{d n} a negative argument, it uses default-minus-that,
- so @kbd{M-- d n} would be an easier way to get the same effect.) Those
- inexact results would still be lurking there, but they would now be
- rounded to nice, natural-looking values for display purposes. (Remember,
- @samp{0.022222} in base 3 is like @samp{0.099999} in base 10; rounding
- off one digit will round the number up to @samp{0.1}.) Depending on the
- nature of your work, this hiding of the inexactness may be a benefit or
- a danger. With the @kbd{d n} command, Calc gives you the choice.
- Incidentally, another consequence of all this is that if you type
- @kbd{M-30 d n} to display more digits than are ``really there,''
- you'll see garbage digits at the end of the number. (In decimal
- display mode, with decimally-stored numbers, these garbage digits are
- always zero so they vanish and you don't notice them.) Because Calc
- rounds off that 0.15 digit, there is the danger that two numbers could
- be slightly different internally but still look the same. If you feel
- uneasy about this, set the @kbd{d n} precision to be a little higher
- than normal; you'll get ugly garbage digits, but you'll always be able
- to tell two distinct numbers apart.
- An interesting side note is that most computers store their
- floating-point numbers in binary, and convert to decimal for display.
- Thus everyday programs have the same problem: Decimal 0.1 cannot be
- represented exactly in binary (try it: @kbd{0.1 d 2}), so @samp{0.1 * 10}
- comes out as an inexact approximation to 1 on some machines (though
- they generally arrange to hide it from you by rounding off one digit as
- we did above). Because Calc works in decimal instead of binary, you can
- be sure that numbers that look exact @emph{are} exact as long as you stay
- in decimal display mode.
- It's not hard to show that any number that can be represented exactly
- in binary, octal, or hexadecimal is also exact in decimal, so the kinds
- of problems we saw in this exercise are likely to be severe only when
- you use a relatively unusual radix like 3.
- @node Modes Answer 2, Modes Answer 3, Modes Answer 1, Answers to Exercises
- @subsection Modes Tutorial Exercise 2
- If the radix is 15 or higher, we can't use the letter @samp{e} to mark
- the exponent because @samp{e} is interpreted as a digit. When Calc
- needs to display scientific notation in a high radix, it writes
- @samp{16#F.E8F*16.^15}. You can enter a number like this as an
- algebraic entry. Also, pressing @kbd{e} without any digits before it
- normally types @kbd{1e}, but in a high radix it types @kbd{16.^} and
- puts you in algebraic entry: @kbd{16#f.e8f @key{RET} e 15 @key{RET} *} is another
- way to enter this number.
- The reason Calc puts a decimal point in the @samp{16.^} is to prevent
- huge integers from being generated if the exponent is large (consider
- @samp{16#1.23*16^1000}, where we compute @samp{16^1000} as a giant
- exact integer and then throw away most of the digits when we multiply
- it by the floating-point @samp{16#1.23}). While this wouldn't normally
- matter for display purposes, it could give you a nasty surprise if you
- copied that number into a file and later moved it back into Calc.
- @node Modes Answer 3, Modes Answer 4, Modes Answer 2, Answers to Exercises
- @subsection Modes Tutorial Exercise 3
- @noindent
- The answer he got was @cite{0.5000000000006399}.
- The problem is not that the square operation is inexact, but that the
- sine of 45 that was already on the stack was accurate to only 12 places.
- Arbitrary-precision calculations still only give answers as good as
- their inputs.
- The real problem is that there is no 12-digit number which, when
- squared, comes out to 0.5 exactly. The @kbd{f [} and @kbd{f ]}
- commands decrease or increase a number by one unit in the last
- place (according to the current precision). They are useful for
- determining facts like this.
- @smallexample
- @group
- 1: 0.707106781187 1: 0.500000000001
- . .
- 45 S 2 ^
- @end group
- @end smallexample
- @noindent
- @smallexample
- @group
- 1: 0.707106781187 1: 0.707106781186 1: 0.499999999999
- . . .
- U @key{DEL} f [ 2 ^
- @end group
- @end smallexample
- A high-precision calculation must be carried out in high precision
- all the way. The only number in the original problem which was known
- exactly was the quantity 45 degrees, so the precision must be raised
- before anything is done after the number 45 has been entered in order
- for the higher precision to be meaningful.
- @node Modes Answer 4, Arithmetic Answer 1, Modes Answer 3, Answers to Exercises
- @subsection Modes Tutorial Exercise 4
- @noindent
- Many calculations involve real-world quantities, like the width and
- height of a piece of wood or the volume of a jar. Such quantities
- can't be measured exactly anyway, and if the data that is input to
- a calculation is inexact, doing exact arithmetic on it is a waste
- of time.
- Fractions become unwieldy after too many calculations have been
- done with them. For example, the sum of the reciprocals of the
- integers from 1 to 10 is 7381:2520. The sum from 1 to 30 is
- 9304682830147:2329089562800. After a point it will take a long
- time to add even one more term to this sum, but a floating-point
- calculation of the sum will not have this problem.
- Also, rational numbers cannot express the results of all calculations.
- There is no fractional form for the square root of two, so if you type
- @w{@kbd{2 Q}}, Calc has no choice but to give you a floating-point answer.
- @node Arithmetic Answer 1, Arithmetic Answer 2, Modes Answer 4, Answers to Exercises
- @subsection Arithmetic Tutorial Exercise 1
- @noindent
- Dividing two integers that are larger than the current precision may
- give a floating-point result that is inaccurate even when rounded
- down to an integer. Consider @cite{123456789 / 2} when the current
- precision is 6 digits. The true answer is @cite{61728394.5}, but
- with a precision of 6 this will be rounded to @c{$12345700.0/2.0 = 61728500.0$}
- @cite{12345700.@: / 2.@: = 61728500.}.
- The result, when converted to an integer, will be off by 106.
- Here are two solutions: Raise the precision enough that the
- floating-point round-off error is strictly to the right of the
- decimal point. Or, convert to fraction mode so that @cite{123456789 / 2}
- produces the exact fraction @cite{123456789:2}, which can be rounded
- down by the @kbd{F} command without ever switching to floating-point
- format.
- @node Arithmetic Answer 2, Vector Answer 1, Arithmetic Answer 1, Answers to Exercises
- @subsection Arithmetic Tutorial Exercise 2
- @noindent
- @kbd{27 @key{RET} 9 B} could give the exact result @cite{3:2}, but it
- does a floating-point calculation instead and produces @cite{1.5}.
- Calc will find an exact result for a logarithm if the result is an integer
- or the reciprocal of an integer. But there is no efficient way to search
- the space of all possible rational numbers for an exact answer, so Calc
- doesn't try.
- @node Vector Answer 1, Vector Answer 2, Arithmetic Answer 2, Answers to Exercises
- @subsection Vector Tutorial Exercise 1
- @noindent
- Duplicate the vector, compute its length, then divide the vector
- by its length: @kbd{@key{RET} A /}.
- @smallexample
- @group
- 1: [1, 2, 3] 2: [1, 2, 3] 1: [0.27, 0.53, 0.80] 1: 1.
- . 1: 3.74165738677 . .
- .
- r 1 @key{RET} A / A
- @end group
- @end smallexample
- The final @kbd{A} command shows that the normalized vector does
- indeed have unit length.
- @node Vector Answer 2, Matrix Answer 1, Vector Answer 1, Answers to Exercises
- @subsection Vector Tutorial Exercise 2
- @noindent
- The average position is equal to the sum of the products of the
- positions times their corresponding probabilities. This is the
- definition of the dot product operation. So all you need to do
- is to put the two vectors on the stack and press @kbd{*}.
- @node Matrix Answer 1, Matrix Answer 2, Vector Answer 2, Answers to Exercises
- @subsection Matrix Tutorial Exercise 1
- @noindent
- The trick is to multiply by a vector of ones. Use @kbd{r 4 [1 1 1] *} to
- get the row sum. Similarly, use @kbd{[1 1] r 4 *} to get the column sum.
- @node Matrix Answer 2, Matrix Answer 3, Matrix Answer 1, Answers to Exercises
- @subsection Matrix Tutorial Exercise 2
- @ifinfo
- @example
- @group
- x + a y = 6
- x + b y = 10
- @end group
- @end example
- @end ifinfo
- @tex
- \turnoffactive
- \beforedisplay
- $$ \eqalign{ x &+ a y = 6 \cr
- x &+ b y = 10}
- $$
- \afterdisplay
- @end tex
- Just enter the righthand side vector, then divide by the lefthand side
- matrix as usual.
- @smallexample
- @group
- 1: [6, 10] 2: [6, 10] 1: [6 - 4 a / (b - a), 4 / (b - a) ]
- . 1: [ [ 1, a ] .
- [ 1, b ] ]
- .
- ' [6 10] @key{RET} ' [1 a; 1 b] @key{RET} /
- @end group
- @end smallexample
- This can be made more readable using @kbd{d B} to enable ``big'' display
- mode:
- @smallexample
- @group
- 4 a 4
- 1: [6 - -----, -----]
- b - a b - a
- @end group
- @end smallexample
- Type @kbd{d N} to return to ``normal'' display mode afterwards.
- @node Matrix Answer 3, List Answer 1, Matrix Answer 2, Answers to Exercises
- @subsection Matrix Tutorial Exercise 3
- @noindent
- To solve @c{$A^T A \, X = A^T B$}
- @cite{trn(A) * A * X = trn(A) * B}, first we compute
- @c{$A' = A^T A$}
- @cite{A2 = trn(A) * A} and @c{$B' = A^T B$}
- @cite{B2 = trn(A) * B}; now, we have a
- system @c{$A' X = B'$}
- @cite{A2 * X = B2} which we can solve using Calc's @samp{/}
- command.
- @ifinfo
- @example
- @group
- a + 2b + 3c = 6
- 4a + 5b + 6c = 2
- 7a + 6b = 3
- 2a + 4b + 6c = 11
- @end group
- @end example
- @end ifinfo
- @tex
- \turnoffactive
- \beforedisplayh
- $$ \openup1\jot \tabskip=0pt plus1fil
- \halign to\displaywidth{\tabskip=0pt
- $\hfil#$&$\hfil{}#{}$&
- $\hfil#$&$\hfil{}#{}$&
- $\hfil#$&${}#\hfil$\tabskip=0pt plus1fil\cr
- a&+&2b&+&3c&=6 \cr
- 4a&+&5b&+&6c&=2 \cr
- 7a&+&6b& & &=3 \cr
- 2a&+&4b&+&6c&=11 \cr}
- $$
- \afterdisplayh
- @end tex
- The first step is to enter the coefficient matrix. We'll store it in
- quick variable number 7 for later reference. Next, we compute the
- @c{$B'$}
- @cite{B2} vector.
- @smallexample
- @group
- 1: [ [ 1, 2, 3 ] 2: [ [ 1, 4, 7, 2 ] 1: [57, 84, 96]
- [ 4, 5, 6 ] [ 2, 5, 6, 4 ] .
- [ 7, 6, 0 ] [ 3, 6, 0, 6 ] ]
- [ 2, 4, 6 ] ] 1: [6, 2, 3, 11]
- . .
- ' [1 2 3; 4 5 6; 7 6 0; 2 4 6] @key{RET} s 7 v t [6 2 3 11] *
- @end group
- @end smallexample
- @noindent
- Now we compute the matrix @c{$A'$}
- @cite{A2} and divide.
- @smallexample
- @group
- 2: [57, 84, 96] 1: [-11.64, 14.08, -3.64]
- 1: [ [ 70, 72, 39 ] .
- [ 72, 81, 60 ]
- [ 39, 60, 81 ] ]
- .
- r 7 v t r 7 * /
- @end group
- @end smallexample
- @noindent
- (The actual computed answer will be slightly inexact due to
- round-off error.)
- Notice that the answers are similar to those for the @c{$3\times3$}
- @asis{3x3} system
- solved in the text. That's because the fourth equation that was
- added to the system is almost identical to the first one multiplied
- by two. (If it were identical, we would have gotten the exact same
- answer since the @c{$4\times3$}
- @asis{4x3} system would be equivalent to the original @c{$3\times3$}
- @asis{3x3}
- system.)
- Since the first and fourth equations aren't quite equivalent, they
- can't both be satisfied at once. Let's plug our answers back into
- the original system of equations to see how well they match.
- @smallexample
- @group
- 2: [-11.64, 14.08, -3.64] 1: [5.6, 2., 3., 11.2]
- 1: [ [ 1, 2, 3 ] .
- [ 4, 5, 6 ]
- [ 7, 6, 0 ]
- [ 2, 4, 6 ] ]
- .
- r 7 @key{TAB} *
- @end group
- @end smallexample
- @noindent
- This is reasonably close to our original @cite{B} vector,
- @cite{[6, 2, 3, 11]}.
- @node List Answer 1, List Answer 2, Matrix Answer 3, Answers to Exercises
- @subsection List Tutorial Exercise 1
- @noindent
- We can use @kbd{v x} to build a vector of integers. This needs to be
- adjusted to get the range of integers we desire. Mapping @samp{-}
- across the vector will accomplish this, although it turns out the
- plain @samp{-} key will work just as well.
- @smallexample
- @group
- 2: 2 2: 2
- 1: [1, 2, 3, 4, 5, 6, 7, 8, 9] 1: [-4, -3, -2, -1, 0, 1, 2, 3, 4]
- . .
- 2 v x 9 @key{RET} 5 V M - or 5 -
- @end group
- @end smallexample
- @noindent
- Now we use @kbd{V M ^} to map the exponentiation operator across the
- vector.
- @smallexample
- @group
- 1: [0.0625, 0.125, 0.25, 0.5, 1, 2, 4, 8, 16]
- .
- V M ^
- @end group
- @end smallexample
- @node List Answer 2, List Answer 3, List Answer 1, Answers to Exercises
- @subsection List Tutorial Exercise 2
- @noindent
- Given @cite{x} and @cite{y} vectors in quick variables 1 and 2 as before,
- the first job is to form the matrix that describes the problem.
- @ifinfo
- @example
- m*x + b*1 = y
- @end example
- @end ifinfo
- @tex
- \turnoffactive
- \beforedisplay
- $$ m \times x + b \times 1 = y $$
- \afterdisplay
- @end tex
- Thus we want a @c{$19\times2$}
- @asis{19x2} matrix with our @cite{x} vector as one column and
- ones as the other column. So, first we build the column of ones, then
- we combine the two columns to form our @cite{A} matrix.
- @smallexample
- @group
- 2: [1.34, 1.41, 1.49, ... ] 1: [ [ 1.34, 1 ]
- 1: [1, 1, 1, ...] [ 1.41, 1 ]
- . [ 1.49, 1 ]
- @dots{}
- r 1 1 v b 19 @key{RET} M-2 v p v t s 3
- @end group
- @end smallexample
- @noindent
- Now we compute @c{$A^T y$}
- @cite{trn(A) * y} and @c{$A^T A$}
- @cite{trn(A) * A} and divide.
- @smallexample
- @group
- 1: [33.36554, 13.613] 2: [33.36554, 13.613]
- . 1: [ [ 98.0003, 41.63 ]
- [ 41.63, 19 ] ]
- .
- v t r 2 * r 3 v t r 3 *
- @end group
- @end smallexample
- @noindent
- (Hey, those numbers look familiar!)
- @smallexample
- @group
- 1: [0.52141679, -0.425978]
- .
- /
- @end group
- @end smallexample
- Since we were solving equations of the form @c{$m \times x + b \times 1 = y$}
- @cite{m*x + b*1 = y}, these
- numbers should be @cite{m} and @cite{b}, respectively. Sure enough, they
- agree exactly with the result computed using @kbd{V M} and @kbd{V R}!
- The moral of this story: @kbd{V M} and @kbd{V R} will probably solve
- your problem, but there is often an easier way using the higher-level
- arithmetic functions!
- @c [fix-ref Curve Fitting]
- In fact, there is a built-in @kbd{a F} command that does least-squares
- fits. @xref{Curve Fitting}.
- @node List Answer 3, List Answer 4, List Answer 2, Answers to Exercises
- @subsection List Tutorial Exercise 3
- @noindent
- Move to one end of the list and press @kbd{C-@@} (or @kbd{C-@key{SPC}} or
- whatever) to set the mark, then move to the other end of the list
- and type @w{@kbd{M-# g}}.
- @smallexample
- @group
- 1: [2.3, 6, 22, 15.1, 7, 15, 14, 7.5, 2.5]
- .
- @end group
- @end smallexample
- To make things interesting, let's assume we don't know at a glance
- how many numbers are in this list. Then we could type:
- @smallexample
- @group
- 2: [2.3, 6, 22, ... ] 2: [2.3, 6, 22, ... ]
- 1: [2.3, 6, 22, ... ] 1: 126356422.5
- . .
- @key{RET} V R *
- @end group
- @end smallexample
- @noindent
- @smallexample
- @group
- 2: 126356422.5 2: 126356422.5 1: 7.94652913734
- 1: [2.3, 6, 22, ... ] 1: 9 .
- . .
- @key{TAB} v l I ^
- @end group
- @end smallexample
- @noindent
- (The @kbd{I ^} command computes the @var{n}th root of a number.
- You could also type @kbd{& ^} to take the reciprocal of 9 and
- then raise the number to that power.)
- @node List Answer 4, List Answer 5, List Answer 3, Answers to Exercises
- @subsection List Tutorial Exercise 4
- @noindent
- A number @cite{j} is a divisor of @cite{n} if @c{$n \mathbin{\hbox{\code{\%}}} j = 0$}
- @samp{n % j = 0}. The first
- step is to get a vector that identifies the divisors.
- @smallexample
- @group
- 2: 30 2: [0, 0, 0, 2, ...] 1: [1, 1, 1, 0, ...]
- 1: [1, 2, 3, 4, ...] 1: 0 .
- . .
- 30 @key{RET} v x 30 @key{RET} s 1 V M % 0 V M a = s 2
- @end group
- @end smallexample
- @noindent
- This vector has 1's marking divisors of 30 and 0's marking non-divisors.
- The zeroth divisor function is just the total number of divisors.
- The first divisor function is the sum of the divisors.
- @smallexample
- @group
- 1: 8 3: 8 2: 8 2: 8
- 2: [1, 2, 3, 4, ...] 1: [1, 2, 3, 0, ...] 1: 72
- 1: [1, 1, 1, 0, ...] . .
- .
- V R + r 1 r 2 V M * V R +
- @end group
- @end smallexample
- @noindent
- Once again, the last two steps just compute a dot product for which
- a simple @kbd{*} would have worked equally well.
- @node List Answer 5, List Answer 6, List Answer 4, Answers to Exercises
- @subsection List Tutorial Exercise 5
- @noindent
- The obvious first step is to obtain the list of factors with @kbd{k f}.
- This list will always be in sorted order, so if there are duplicates
- they will be right next to each other. A suitable method is to compare
- the list with a copy of itself shifted over by one.
- @smallexample
- @group
- 1: [3, 7, 7, 7, 19] 2: [3, 7, 7, 7, 19] 2: [3, 7, 7, 7, 19, 0]
- . 1: [3, 7, 7, 7, 19, 0] 1: [0, 3, 7, 7, 7, 19]
- . .
- 19551 k f @key{RET} 0 | @key{TAB} 0 @key{TAB} |
- @end group
- @end smallexample
- @noindent
- @smallexample
- @group
- 1: [0, 0, 1, 1, 0, 0] 1: 2 1: 0
- . . .
- V M a = V R + 0 a =
- @end group
- @end smallexample
- @noindent
- Note that we have to arrange for both vectors to have the same length
- so that the mapping operation works; no prime factor will ever be
- zero, so adding zeros on the left and right is safe. From then on
- the job is pretty straightforward.
- Incidentally, Calc provides the @c{\dfn{M\"obius} $\mu$}
- @dfn{Moebius mu} function which is
- zero if and only if its argument is square-free. It would be a much
- more convenient way to do the above test in practice.
- @node List Answer 6, List Answer 7, List Answer 5, Answers to Exercises
- @subsection List Tutorial Exercise 6
- @noindent
- First use @kbd{v x 6 @key{RET}} to get a list of integers, then @kbd{V M v x}
- to get a list of lists of integers!
- @node List Answer 7, List Answer 8, List Answer 6, Answers to Exercises
- @subsection List Tutorial Exercise 7
- @noindent
- Here's one solution. First, compute the triangular list from the previous
- exercise and type @kbd{1 -} to subtract one from all the elements.
- @smallexample
- @group
- 1: [ [0],
- [0, 1],
- [0, 1, 2],
- @dots{}
- 1 -
- @end group
- @end smallexample
- The numbers down the lefthand edge of the list we desire are called
- the ``triangular numbers'' (now you know why!). The @cite{n}th
- triangular number is the sum of the integers from 1 to @cite{n}, and
- can be computed directly by the formula @c{$n (n+1) \over 2$}
- @cite{n * (n+1) / 2}.
- @smallexample
- @group
- 2: [ [0], [0, 1], ... ] 2: [ [0], [0, 1], ... ]
- 1: [0, 1, 2, 3, 4, 5] 1: [0, 1, 3, 6, 10, 15]
- . .
- v x 6 @key{RET} 1 - V M ' $ ($+1)/2 @key{RET}
- @end group
- @end smallexample
- @noindent
- Adding this list to the above list of lists produces the desired
- result:
- @smallexample
- @group
- 1: [ [0],
- [1, 2],
- [3, 4, 5],
- [6, 7, 8, 9],
- [10, 11, 12, 13, 14],
- [15, 16, 17, 18, 19, 20] ]
- .
- V M +
- @end group
- @end smallexample
- If we did not know the formula for triangular numbers, we could have
- computed them using a @kbd{V U +} command. We could also have
- gotten them the hard way by mapping a reduction across the original
- triangular list.
- @smallexample
- @group
- 2: [ [0], [0, 1], ... ] 2: [ [0], [0, 1], ... ]
- 1: [ [0], [0, 1], ... ] 1: [0, 1, 3, 6, 10, 15]
- . .
- @key{RET} V M V R +
- @end group
- @end smallexample
- @noindent
- (This means ``map a @kbd{V R +} command across the vector,'' and
- since each element of the main vector is itself a small vector,
- @kbd{V R +} computes the sum of its elements.)
- @node List Answer 8, List Answer 9, List Answer 7, Answers to Exercises
- @subsection List Tutorial Exercise 8
- @noindent
- The first step is to build a list of values of @cite{x}.
- @smallexample
- @group
- 1: [1, 2, 3, ..., 21] 1: [0, 1, 2, ..., 20] 1: [0, 0.25, 0.5, ..., 5]
- . . .
- v x 21 @key{RET} 1 - 4 / s 1
- @end group
- @end smallexample
- Next, we compute the Bessel function values.
- @smallexample
- @group
- 1: [0., 0.124, 0.242, ..., -0.328]
- .
- V M ' besJ(1,$) @key{RET}
- @end group
- @end smallexample
- @noindent
- (Another way to do this would be @kbd{1 @key{TAB} V M f j}.)
- A way to isolate the maximum value is to compute the maximum using
- @kbd{V R X}, then compare all the Bessel values with that maximum.
- @smallexample
- @group
- 2: [0., 0.124, 0.242, ... ] 1: [0, 0, 0, ... ] 2: [0, 0, 0, ... ]
- 1: 0.5801562 . 1: 1
- . .
- @key{RET} V R X V M a = @key{RET} V R + @key{DEL}
- @end group
- @end smallexample
- @noindent
- It's a good idea to verify, as in the last step above, that only
- one value is equal to the maximum. (After all, a plot of @c{$\sin x$}
- @cite{sin(x)}
- might have many points all equal to the maximum value, 1.)
- The vector we have now has a single 1 in the position that indicates
- the maximum value of @cite{x}. Now it is a simple matter to convert
- this back into the corresponding value itself.
- @smallexample
- @group
- 2: [0, 0, 0, ... ] 1: [0, 0., 0., ... ] 1: 1.75
- 1: [0, 0.25, 0.5, ... ] . .
- .
- r 1 V M * V R +
- @end group
- @end smallexample
- If @kbd{a =} had produced more than one @cite{1} value, this method
- would have given the sum of all maximum @cite{x} values; not very
- useful! In this case we could have used @kbd{v m} (@code{calc-mask-vector})
- instead. This command deletes all elements of a ``data'' vector that
- correspond to zeros in a ``mask'' vector, leaving us with, in this
- example, a vector of maximum @cite{x} values.
- The built-in @kbd{a X} command maximizes a function using more
- efficient methods. Just for illustration, let's use @kbd{a X}
- to maximize @samp{besJ(1,x)} over this same interval.
- @smallexample
- @group
- 2: besJ(1, x) 1: [1.84115, 0.581865]
- 1: [0 .. 5] .
- .
- ' besJ(1,x), [0..5] @key{RET} a X x @key{RET}
- @end group
- @end smallexample
- @noindent
- The output from @kbd{a X} is a vector containing the value of @cite{x}
- that maximizes the function, and the function's value at that maximum.
- As you can see, our simple search got quite close to the right answer.
- @node List Answer 9, List Answer 10, List Answer 8, Answers to Exercises
- @subsection List Tutorial Exercise 9
- @noindent
- Step one is to convert our integer into vector notation.
- @smallexample
- @group
- 1: 25129925999 3: 25129925999
- . 2: 10
- 1: [11, 10, 9, ..., 1, 0]
- .
- 25129925999 @key{RET} 10 @key{RET} 12 @key{RET} v x 12 @key{RET} -
- @end group
- @end smallexample
- @noindent
- @smallexample
- @group
- 1: 25129925999 1: [0, 2, 25, 251, 2512, ... ]
- 2: [100000000000, ... ] .
- .
- V M ^ s 1 V M \
- @end group
- @end smallexample
- @noindent
- (Recall, the @kbd{\} command computes an integer quotient.)
- @smallexample
- @group
- 1: [0, 2, 5, 1, 2, 9, 9, 2, 5, 9, 9, 9]
- .
- 10 V M % s 2
- @end group
- @end smallexample
- Next we must increment this number. This involves adding one to
- the last digit, plus handling carries. There is a carry to the
- left out of a digit if that digit is a nine and all the digits to
- the right of it are nines.
- @smallexample
- @group
- 1: [0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1] 1: [1, 1, 1, 0, 0, 1, ... ]
- . .
- 9 V M a = v v
- @end group
- @end smallexample
- @noindent
- @smallexample
- @group
- 1: [1, 1, 1, 0, 0, 0, ... ] 1: [0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1]
- . .
- V U * v v 1 |
- @end group
- @end smallexample
- @noindent
- Accumulating @kbd{*} across a vector of ones and zeros will preserve
- only the initial run of ones. These are the carries into all digits
- except the rightmost digit. Concatenating a one on the right takes
- care of aligning the carries properly, and also adding one to the
- rightmost digit.
- @smallexample
- @group
- 2: [0, 0, 0, 0, ... ] 1: [0, 0, 2, 5, 1, 2, 9, 9, 2, 6, 0, 0, 0]
- 1: [0, 0, 2, 5, ... ] .
- .
- 0 r 2 | V M + 10 V M %
- @end group
- @end smallexample
- @noindent
- Here we have concatenated 0 to the @emph{left} of the original number;
- this takes care of shifting the carries by one with respect to the
- digits that generated them.
- Finally, we must convert this list back into an integer.
- @smallexample
- @group
- 3: [0, 0, 2, 5, ... ] 2: [0, 0, 2, 5, ... ]
- 2: 1000000000000 1: [1000000000000, 100000000000, ... ]
- 1: [100000000000, ... ] .
- .
- 10 @key{RET} 12 ^ r 1 |
- @end group
- @end smallexample
- @noindent
- @smallexample
- @group
- 1: [0, 0, 20000000000, 5000000000, ... ] 1: 25129926000
- . .
- V M * V R +
- @end group
- @end smallexample
- @noindent
- Another way to do this final step would be to reduce the formula
- @w{@samp{10 $$ + $}} across the vector of digits.
- @smallexample
- @group
- 1: [0, 0, 2, 5, ... ] 1: 25129926000
- . .
- V R ' 10 $$ + $ @key{RET}
- @end group
- @end smallexample
- @node List Answer 10, List Answer 11, List Answer 9, Answers to Exercises
- @subsection List Tutorial Exercise 10
- @noindent
- For the list @cite{[a, b, c, d]}, the result is @cite{((a = b) = c) = d},
- which will compare @cite{a} and @cite{b} to produce a 1 or 0, which is
- then compared with @cite{c} to produce another 1 or 0, which is then
- compared with @cite{d}. This is not at all what Joe wanted.
- Here's a more correct method:
- @smallexample
- @group
- 1: [7, 7, 7, 8, 7] 2: [7, 7, 7, 8, 7]
- . 1: 7
- .
- ' [7,7,7,8,7] @key{RET} @key{RET} v r 1 @key{RET}
- @end group
- @end smallexample
- @noindent
- @smallexample
- @group
- 1: [1, 1, 1, 0, 1] 1: 0
- . .
- V M a = V R *
- @end group
- @end smallexample
- @node List Answer 11, List Answer 12, List Answer 10, Answers to Exercises
- @subsection List Tutorial Exercise 11
- @noindent
- The circle of unit radius consists of those points @cite{(x,y)} for which
- @cite{x^2 + y^2 < 1}. We start by generating a vector of @cite{x^2}
- and a vector of @cite{y^2}.
- We can make this go a bit faster by using the @kbd{v .} and @kbd{t .}
- commands.
- @smallexample
- @group
- 2: [2., 2., ..., 2.] 2: [2., 2., ..., 2.]
- 1: [2., 2., ..., 2.] 1: [1.16, 1.98, ..., 0.81]
- . .
- v . t . 2. v b 100 @key{RET} @key{RET} V M k r
- @end group
- @end smallexample
- @noindent
- @smallexample
- @group
- 2: [2., 2., ..., 2.] 1: [0.026, 0.96, ..., 0.036]
- 1: [0.026, 0.96, ..., 0.036] 2: [0.53, 0.81, ..., 0.094]
- . .
- 1 - 2 V M ^ @key{TAB} V M k r 1 - 2 V M ^
- @end group
- @end smallexample
- Now we sum the @cite{x^2} and @cite{y^2} values, compare with 1 to
- get a vector of 1/0 truth values, then sum the truth values.
- @smallexample
- @group
- 1: [0.56, 1.78, ..., 0.13] 1: [1, 0, ..., 1] 1: 84
- . . .
- + 1 V M a < V R +
- @end group
- @end smallexample
- @noindent
- The ratio @cite{84/100} should approximate the ratio @c{$\pi/4$}
- @cite{pi/4}.
- @smallexample
- @group
- 1: 0.84 1: 3.36 2: 3.36 1: 1.0695
- . . 1: 3.14159 .
- 100 / 4 * P /
- @end group
- @end smallexample
- @noindent
- Our estimate, 3.36, is off by about 7%. We could get a better estimate
- by taking more points (say, 1000), but it's clear that this method is
- not very efficient!
- (Naturally, since this example uses random numbers your own answer
- will be slightly different from the one shown here!)
- If you typed @kbd{v .} and @kbd{t .} before, type them again to
- return to full-sized display of vectors.
- @node List Answer 12, List Answer 13, List Answer 11, Answers to Exercises
- @subsection List Tutorial Exercise 12
- @noindent
- This problem can be made a lot easier by taking advantage of some
- symmetries. First of all, after some thought it's clear that the
- @cite{y} axis can be ignored altogether. Just pick a random @cite{x}
- component for one end of the match, pick a random direction @c{$\theta$}
- @cite{theta},
- and see if @cite{x} and @c{$x + \cos \theta$}
- @cite{x + cos(theta)} (which is the @cite{x}
- coordinate of the other endpoint) cross a line. The lines are at
- integer coordinates, so this happens when the two numbers surround
- an integer.
- Since the two endpoints are equivalent, we may as well choose the leftmost
- of the two endpoints as @cite{x}. Then @cite{theta} is an angle pointing
- to the right, in the range -90 to 90 degrees. (We could use radians, but
- it would feel like cheating to refer to @c{$\pi/2$}
- @cite{pi/2} radians while trying
- to estimate @c{$\pi$}
- @cite{pi}!)
- In fact, since the field of lines is infinite we can choose the
- coordinates 0 and 1 for the lines on either side of the leftmost
- endpoint. The rightmost endpoint will be between 0 and 1 if the
- match does not cross a line, or between 1 and 2 if it does. So:
- Pick random @cite{x} and @c{$\theta$}
- @cite{theta}, compute @c{$x + \cos \theta$}
- @cite{x + cos(theta)},
- and count how many of the results are greater than one. Simple!
- We can make this go a bit faster by using the @kbd{v .} and @kbd{t .}
- commands.
- @smallexample
- @group
- 1: [0.52, 0.71, ..., 0.72] 2: [0.52, 0.71, ..., 0.72]
- . 1: [78.4, 64.5, ..., -42.9]
- .
- v . t . 1. v b 100 @key{RET} V M k r 180. v b 100 @key{RET} V M k r 90 -
- @end group
- @end smallexample
- @noindent
- (The next step may be slow, depending on the speed of your computer.)
- @smallexample
- @group
- 2: [0.52, 0.71, ..., 0.72] 1: [0.72, 1.14, ..., 1.45]
- 1: [0.20, 0.43, ..., 0.73] .
- .
- m d V M C +
- @end group
- @end smallexample
- @noindent
- @smallexample
- @group
- 1: [0, 1, ..., 1] 1: 0.64 1: 3.125
- . . .
- 1 V M a > V R + 100 / 2 @key{TAB} /
- @end group
- @end smallexample
- Let's try the third method, too. We'll use random integers up to
- one million. The @kbd{k r} command with an integer argument picks
- a random integer.
- @smallexample
- @group
- 2: [1000000, 1000000, ..., 1000000] 2: [78489, 527587, ..., 814975]
- 1: [1000000, 1000000, ..., 1000000] 1: [324014, 358783, ..., 955450]
- . .
- 1000000 v b 100 @key{RET} @key{RET} V M k r @key{TAB} V M k r
- @end group
- @end smallexample
- @noindent
- @smallexample
- @group
- 1: [1, 1, ..., 25] 1: [1, 1, ..., 0] 1: 0.56
- . . .
- V M k g 1 V M a = V R + 100 /
- @end group
- @end smallexample
- @noindent
- @smallexample
- @group
- 1: 10.714 1: 3.273
- . .
- 6 @key{TAB} / Q
- @end group
- @end smallexample
- For a proof of this property of the GCD function, see section 4.5.2,
- exercise 10, of Knuth's @emph{Art of Computer Programming}, volume II.
- If you typed @kbd{v .} and @kbd{t .} before, type them again to
- return to full-sized display of vectors.
- @node List Answer 13, List Answer 14, List Answer 12, Answers to Exercises
- @subsection List Tutorial Exercise 13
- @noindent
- First, we put the string on the stack as a vector of ASCII codes.
- @smallexample
- @group
- 1: [84, 101, 115, ..., 51]
- .
- "Testing, 1, 2, 3 @key{RET}
- @end group
- @end smallexample
- @noindent
- Note that the @kbd{"} key, like @kbd{$}, initiates algebraic entry so
- there was no need to type an apostrophe. Also, Calc didn't mind that
- we omitted the closing @kbd{"}. (The same goes for all closing delimiters
- like @kbd{)} and @kbd{]} at the end of a formula.
- We'll show two different approaches here. In the first, we note that
- if the input vector is @cite{[a, b, c, d]}, then the hash code is
- @cite{3 (3 (3a + b) + c) + d = 27a + 9b + 3c + d}. In other words,
- it's a sum of descending powers of three times the ASCII codes.
- @smallexample
- @group
- 2: [84, 101, 115, ..., 51] 2: [84, 101, 115, ..., 51]
- 1: 16 1: [15, 14, 13, ..., 0]
- . .
- @key{RET} v l v x 16 @key{RET} -
- @end group
- @end smallexample
- @noindent
- @smallexample
- @group
- 2: [84, 101, 115, ..., 51] 1: 1960915098 1: 121
- 1: [14348907, ..., 1] . .
- .
- 3 @key{TAB} V M ^ * 511 %
- @end group
- @end smallexample
- @noindent
- Once again, @kbd{*} elegantly summarizes most of the computation.
- But there's an even more elegant approach: Reduce the formula
- @kbd{3 $$ + $} across the vector. Recall that this represents a
- function of two arguments that computes its first argument times three
- plus its second argument.
- @smallexample
- @group
- 1: [84, 101, 115, ..., 51] 1: 1960915098
- . .
- "Testing, 1, 2, 3 @key{RET} V R ' 3$$+$ @key{RET}
- @end group
- @end smallexample
- @noindent
- If you did the decimal arithmetic exercise, this will be familiar.
- Basically, we're turning a base-3 vector of digits into an integer,
- except that our ``digits'' are much larger than real digits.
- Instead of typing @kbd{511 %} again to reduce the result, we can be
- cleverer still and notice that rather than computing a huge integer
- and taking the modulo at the end, we can take the modulo at each step
- without affecting the result. While this means there are more
- arithmetic operations, the numbers we operate on remain small so
- the operations are faster.
- @smallexample
- @group
- 1: [84, 101, 115, ..., 51] 1: 121
- . .
- "Testing, 1, 2, 3 @key{RET} V R ' (3$$+$)%511 @key{RET}
- @end group
- @end smallexample
- Why does this work? Think about a two-step computation:
- @w{@cite{3 (3a + b) + c}}. Taking a result modulo 511 basically means
- subtracting off enough 511's to put the result in the desired range.
- So the result when we take the modulo after every step is,
- @ifinfo
- @example
- 3 (3 a + b - 511 m) + c - 511 n
- @end example
- @end ifinfo
- @tex
- \turnoffactive
- \beforedisplay
- $$ 3 (3 a + b - 511 m) + c - 511 n $$
- \afterdisplay
- @end tex
- @noindent
- for some suitable integers @cite{m} and @cite{n}. Expanding out by
- the distributive law yields
- @ifinfo
- @example
- 9 a + 3 b + c - 511*3 m - 511 n
- @end example
- @end ifinfo
- @tex
- \turnoffactive
- \beforedisplay
- $$ 9 a + 3 b + c - 511\times3 m - 511 n $$
- \afterdisplay
- @end tex
- @noindent
- The @cite{m} term in the latter formula is redundant because any
- contribution it makes could just as easily be made by the @cite{n}
- term. So we can take it out to get an equivalent formula with
- @cite{n' = 3m + n},
- @ifinfo
- @example
- 9 a + 3 b + c - 511 n'
- @end example
- @end ifinfo
- @tex
- \turnoffactive
- \beforedisplay
- $$ 9 a + 3 b + c - 511 n' $$
- \afterdisplay
- @end tex
- @noindent
- which is just the formula for taking the modulo only at the end of
- the calculation. Therefore the two methods are essentially the same.
- Later in the tutorial we will encounter @dfn{modulo forms}, which
- basically automate the idea of reducing every intermediate result
- modulo some value @var{m}.
- @node List Answer 14, Types Answer 1, List Answer 13, Answers to Exercises
- @subsection List Tutorial Exercise 14
- We want to use @kbd{H V U} to nest a function which adds a random
- step to an @cite{(x,y)} coordinate. The function is a bit long, but
- otherwise the problem is quite straightforward.
- @smallexample
- @group
- 2: [0, 0] 1: [ [ 0, 0 ]
- 1: 50 [ 0.4288, -0.1695 ]
- . [ -0.4787, -0.9027 ]
- ...
- [0,0] 50 H V U ' <# + [random(2.0)-1, random(2.0)-1]> @key{RET}
- @end group
- @end smallexample
- Just as the text recommended, we used @samp{< >} nameless function
- notation to keep the two @code{random} calls from being evaluated
- before nesting even begins.
- We now have a vector of @cite{[x, y]} sub-vectors, which by Calc's
- rules acts like a matrix. We can transpose this matrix and unpack
- to get a pair of vectors, @cite{x} and @cite{y}, suitable for graphing.
- @smallexample
- @group
- 2: [ 0, 0.4288, -0.4787, ... ]
- 1: [ 0, -0.1696, -0.9027, ... ]
- .
- v t v u g f
- @end group
- @end smallexample
- Incidentally, because the @cite{x} and @cite{y} are completely
- independent in this case, we could have done two separate commands
- to create our @cite{x} and @cite{y} vectors of numbers directly.
- To make a random walk of unit steps, we note that @code{sincos} of
- a random direction exactly gives us an @cite{[x, y]} step of unit
- length; in fact, the new nesting function is even briefer, though
- we might want to lower the precision a bit for it.
- @smallexample
- @group
- 2: [0, 0] 1: [ [ 0, 0 ]
- 1: 50 [ 0.1318, 0.9912 ]
- . [ -0.5965, 0.3061 ]
- ...
- [0,0] 50 m d p 6 @key{RET} H V U ' <# + sincos(random(360.0))> @key{RET}
- @end group
- @end smallexample
- Another @kbd{v t v u g f} sequence will graph this new random walk.
- An interesting twist on these random walk functions would be to use
- complex numbers instead of 2-vectors to represent points on the plane.
- In the first example, we'd use something like @samp{random + random*(0,1)},
- and in the second we could use polar complex numbers with random phase
- angles. (This exercise was first suggested in this form by Randal
- Schwartz.)
- @node Types Answer 1, Types Answer 2, List Answer 14, Answers to Exercises
- @subsection Types Tutorial Exercise 1
- @noindent
- If the number is the square root of @c{$\pi$}
- @cite{pi} times a rational number,
- then its square, divided by @c{$\pi$}
- @cite{pi}, should be a rational number.
- @smallexample
- @group
- 1: 1.26508260337 1: 0.509433962268 1: 2486645810:4881193627
- . . .
- 2 ^ P / c F
- @end group
- @end smallexample
- @noindent
- Technically speaking this is a rational number, but not one that is
- likely to have arisen in the original problem. More likely, it just
- happens to be the fraction which most closely represents some
- irrational number to within 12 digits.
- But perhaps our result was not quite exact. Let's reduce the
- precision slightly and try again:
- @smallexample
- @group
- 1: 0.509433962268 1: 27:53
- . .
- U p 10 @key{RET} c F
- @end group
- @end smallexample
- @noindent
- Aha! It's unlikely that an irrational number would equal a fraction
- this simple to within ten digits, so our original number was probably
- @c{$\sqrt{27 \pi / 53}$}
- @cite{sqrt(27 pi / 53)}.
- Notice that we didn't need to re-round the number when we reduced the
- precision. Remember, arithmetic operations always round their inputs
- to the current precision before they begin.
- @node Types Answer 2, Types Answer 3, Types Answer 1, Answers to Exercises
- @subsection Types Tutorial Exercise 2
- @noindent
- @samp{inf / inf = nan}. Perhaps @samp{1} is the ``obvious'' answer.
- But if @w{@samp{17 inf = inf}}, then @samp{17 inf / inf = inf / inf = 17}, too.
- @samp{exp(inf) = inf}. It's tempting to say that the exponential
- of infinity must be ``bigger'' than ``regular'' infinity, but as
- far as Calc is concerned all infinities are as just as big.
- In other words, as @cite{x} goes to infinity, @cite{e^x} also goes
- to infinity, but the fact the @cite{e^x} grows much faster than
- @cite{x} is not relevant here.
- @samp{exp(-inf) = 0}. Here we have a finite answer even though
- the input is infinite.
- @samp{sqrt(-inf) = (0, 1) inf}. Remember that @cite{(0, 1)}
- represents the imaginary number @cite{i}. Here's a derivation:
- @samp{sqrt(-inf) = @w{sqrt((-1) * inf)} = sqrt(-1) * sqrt(inf)}.
- The first part is, by definition, @cite{i}; the second is @code{inf}
- because, once again, all infinities are the same size.
- @samp{sqrt(uinf) = uinf}. In fact, we do know something about the
- direction because @code{sqrt} is defined to return a value in the
- right half of the complex plane. But Calc has no notation for this,
- so it settles for the conservative answer @code{uinf}.
- @samp{abs(uinf) = inf}. No matter which direction @cite{x} points,
- @samp{abs(x)} always points along the positive real axis.
- @samp{ln(0) = -inf}. Here we have an infinite answer to a finite
- input. As in the @cite{1 / 0} case, Calc will only use infinities
- here if you have turned on ``infinite'' mode. Otherwise, it will
- treat @samp{ln(0)} as an error.
- @node Types Answer 3, Types Answer 4, Types Answer 2, Answers to Exercises
- @subsection Types Tutorial Exercise 3
- @noindent
- We can make @samp{inf - inf} be any real number we like, say,
- @cite{a}, just by claiming that we added @cite{a} to the first
- infinity but not to the second. This is just as true for complex
- values of @cite{a}, so @code{nan} can stand for a complex number.
- (And, similarly, @code{uinf} can stand for an infinity that points
- in any direction in the complex plane, such as @samp{(0, 1) inf}).
- In fact, we can multiply the first @code{inf} by two. Surely
- @w{@samp{2 inf - inf = inf}}, but also @samp{2 inf - inf = inf - inf = nan}.
- So @code{nan} can even stand for infinity. Obviously it's just
- as easy to make it stand for minus infinity as for plus infinity.
- The moral of this story is that ``infinity'' is a slippery fish
- indeed, and Calc tries to handle it by having a very simple model
- for infinities (only the direction counts, not the ``size''); but
- Calc is careful to write @code{nan} any time this simple model is
- unable to tell what the true answer is.
- @node Types Answer 4, Types Answer 5, Types Answer 3, Answers to Exercises
- @subsection Types Tutorial Exercise 4
- @smallexample
- @group
- 2: 0@@ 47' 26" 1: 0@@ 2' 47.411765"
- 1: 17 .
- .
- 0@@ 47' 26" @key{RET} 17 /
- @end group
- @end smallexample
- @noindent
- The average song length is two minutes and 47.4 seconds.
- @smallexample
- @group
- 2: 0@@ 2' 47.411765" 1: 0@@ 3' 7.411765" 1: 0@@ 53' 6.000005"
- 1: 0@@ 0' 20" . .
- .
- 20" + 17 *
- @end group
- @end smallexample
- @noindent
- The album would be 53 minutes and 6 seconds long.
- @node Types Answer 5, Types Answer 6, Types Answer 4, Answers to Exercises
- @subsection Types Tutorial Exercise 5
- @noindent
- Let's suppose it's January 14, 1991. The easiest thing to do is
- to keep trying 13ths of months until Calc reports a Friday.
- We can do this by manually entering dates, or by using @kbd{t I}:
- @smallexample
- @group
- 1: <Wed Feb 13, 1991> 1: <Wed Mar 13, 1991> 1: <Sat Apr 13, 1991>
- . . .
- ' <2/13> @key{RET} @key{DEL} ' <3/13> @key{RET} t I
- @end group
- @end smallexample
- @noindent
- (Calc assumes the current year if you don't say otherwise.)
- This is getting tedious---we can keep advancing the date by typing
- @kbd{t I} over and over again, but let's automate the job by using
- vector mapping. The @kbd{t I} command actually takes a second
- ``how-many-months'' argument, which defaults to one. This
- argument is exactly what we want to map over:
- @smallexample
- @group
- 2: <Sat Apr 13, 1991> 1: [<Mon May 13, 1991>, <Thu Jun 13, 1991>,
- 1: [1, 2, 3, 4, 5, 6] <Sat Jul 13, 1991>, <Tue Aug 13, 1991>,
- . <Fri Sep 13, 1991>, <Sun Oct 13, 1991>]
- .
- v x 6 @key{RET} V M t I
- @end group
- @end smallexample
- @ifinfo
- @noindent
- Et voila, September 13, 1991 is a Friday.
- @end ifinfo
- @tex
- \noindent
- {\it Et voil{\accent"12 a}}, September 13, 1991 is a Friday.
- @end tex
- @smallexample
- @group
- 1: 242
- .
- ' <sep 13> - <jan 14> @key{RET}
- @end group
- @end smallexample
- @noindent
- And the answer to our original question: 242 days to go.
- @node Types Answer 6, Types Answer 7, Types Answer 5, Answers to Exercises
- @subsection Types Tutorial Exercise 6
- @noindent
- The full rule for leap years is that they occur in every year divisible
- by four, except that they don't occur in years divisible by 100, except
- that they @emph{do} in years divisible by 400. We could work out the
- answer by carefully counting the years divisible by four and the
- exceptions, but there is a much simpler way that works even if we
- don't know the leap year rule.
- Let's assume the present year is 1991. Years have 365 days, except
- that leap years (whenever they occur) have 366 days. So let's count
- the number of days between now and then, and compare that to the
- number of years times 365. The number of extra days we find must be
- equal to the number of leap years there were.
- @smallexample
- @group
- 1: <Mon Jan 1, 10001> 2: <Mon Jan 1, 10001> 1: 2925593
- . 1: <Tue Jan 1, 1991> .
- .
- ' <jan 1 10001> @key{RET} ' <jan 1 1991> @key{RET} -
- @end group
- @end smallexample
- @noindent
- @smallexample
- @group
- 3: 2925593 2: 2925593 2: 2925593 1: 1943
- 2: 10001 1: 8010 1: 2923650 .
- 1: 1991 . .
- .
- 10001 @key{RET} 1991 - 365 * -
- @end group
- @end smallexample
- @c [fix-ref Date Forms]
- @noindent
- There will be 1943 leap years before the year 10001. (Assuming,
- of course, that the algorithm for computing leap years remains
- unchanged for that long. @xref{Date Forms}, for some interesting
- background information in that regard.)
- @node Types Answer 7, Types Answer 8, Types Answer 6, Answers to Exercises
- @subsection Types Tutorial Exercise 7
- @noindent
- The relative errors must be converted to absolute errors so that
- @samp{+/-} notation may be used.
- @smallexample
- @group
- 1: 1. 2: 1.
- . 1: 0.2
- .
- 20 @key{RET} .05 * 4 @key{RET} .05 *
- @end group
- @end smallexample
- Now we simply chug through the formula.
- @smallexample
- @group
- 1: 19.7392088022 1: 394.78 +/- 19.739 1: 6316.5 +/- 706.21
- . . .
- 2 P 2 ^ * 20 p 1 * 4 p .2 @key{RET} 2 ^ *
- @end group
- @end smallexample
- It turns out the @kbd{v u} command will unpack an error form as
- well as a vector. This saves us some retyping of numbers.
- @smallexample
- @group
- 3: 6316.5 +/- 706.21 2: 6316.5 +/- 706.21
- 2: 6316.5 1: 0.1118
- 1: 706.21 .
- .
- @key{RET} v u @key{TAB} /
- @end group
- @end smallexample
- @noindent
- Thus the volume is 6316 cubic centimeters, within about 11 percent.
- @node Types Answer 8, Types Answer 9, Types Answer 7, Answers to Exercises
- @subsection Types Tutorial Exercise 8
- @noindent
- The first answer is pretty simple: @samp{1 / (0 .. 10) = (0.1 .. inf)}.
- Since a number in the interval @samp{(0 .. 10)} can get arbitrarily
- close to zero, its reciprocal can get arbitrarily large, so the answer
- is an interval that effectively means, ``any number greater than 0.1''
- but with no upper bound.
- The second answer, similarly, is @samp{1 / (-10 .. 0) = (-inf .. -0.1)}.
- Calc normally treats division by zero as an error, so that the formula
- @w{@samp{1 / 0}} is left unsimplified. Our third problem,
- @w{@samp{1 / [0 .. 10]}}, also (potentially) divides by zero because zero
- is now a member of the interval. So Calc leaves this one unevaluated, too.
- If you turn on ``infinite'' mode by pressing @kbd{m i}, you will
- instead get the answer @samp{[0.1 .. inf]}, which includes infinity
- as a possible value.
- The fourth calculation, @samp{1 / (-10 .. 10)}, has the same problem.
- Zero is buried inside the interval, but it's still a possible value.
- It's not hard to see that the actual result of @samp{1 / (-10 .. 10)}
- will be either greater than @i{0.1}, or less than @i{-0.1}. Thus
- the interval goes from minus infinity to plus infinity, with a ``hole''
- in it from @i{-0.1} to @i{0.1}. Calc doesn't have any way to
- represent this, so it just reports @samp{[-inf .. inf]} as the answer.
- It may be disappointing to hear ``the answer lies somewhere between
- minus infinity and plus infinity, inclusive,'' but that's the best
- that interval arithmetic can do in this case.
- @node Types Answer 9, Types Answer 10, Types Answer 8, Answers to Exercises
- @subsection Types Tutorial Exercise 9
- @smallexample
- @group
- 1: [-3 .. 3] 2: [-3 .. 3] 2: [0 .. 9]
- . 1: [0 .. 9] 1: [-9 .. 9]
- . .
- [ 3 n .. 3 ] @key{RET} 2 ^ @key{TAB} @key{RET} *
- @end group
- @end smallexample
- @noindent
- In the first case the result says, ``if a number is between @i{-3} and
- 3, its square is between 0 and 9.'' The second case says, ``the product
- of two numbers each between @i{-3} and 3 is between @i{-9} and 9.''
- An interval form is not a number; it is a symbol that can stand for
- many different numbers. Two identical-looking interval forms can stand
- for different numbers.
- The same issue arises when you try to square an error form.
- @node Types Answer 10, Types Answer 11, Types Answer 9, Answers to Exercises
- @subsection Types Tutorial Exercise 10
- @noindent
- Testing the first number, we might arbitrarily choose 17 for @cite{x}.
- @smallexample
- @group
- 1: 17 mod 811749613 2: 17 mod 811749613 1: 533694123 mod 811749613
- . 811749612 .
- .
- 17 M 811749613 @key{RET} 811749612 ^
- @end group
- @end smallexample
- @noindent
- Since 533694123 is (considerably) different from 1, the number 811749613
- must not be prime.
- It's awkward to type the number in twice as we did above. There are
- various ways to avoid this, and algebraic entry is one. In fact, using
- a vector mapping operation we can perform several tests at once. Let's
- use this method to test the second number.
- @smallexample
- @group
- 2: [17, 42, 100000] 1: [1 mod 15485863, 1 mod ... ]
- 1: 15485863 .
- .
- [17 42 100000] 15485863 @key{RET} V M ' ($$ mod $)^($-1) @key{RET}
- @end group
- @end smallexample
- @noindent
- The result is three ones (modulo @cite{n}), so it's very probable that
- 15485863 is prime. (In fact, this number is the millionth prime.)
- Note that the functions @samp{($$^($-1)) mod $} or @samp{$$^($-1) % $}
- would have been hopelessly inefficient, since they would have calculated
- the power using full integer arithmetic.
- Calc has a @kbd{k p} command that does primality testing. For small
- numbers it does an exact test; for large numbers it uses a variant
- of the Fermat test we used here. You can use @kbd{k p} repeatedly
- to prove that a large integer is prime with any desired probability.
- @node Types Answer 11, Types Answer 12, Types Answer 10, Answers to Exercises
- @subsection Types Tutorial Exercise 11
- @noindent
- There are several ways to insert a calculated number into an HMS form.
- One way to convert a number of seconds to an HMS form is simply to
- multiply the number by an HMS form representing one second:
- @smallexample
- @group
- 1: 31415926.5359 2: 31415926.5359 1: 8726@@ 38' 46.5359"
- . 1: 0@@ 0' 1" .
- .
- P 1e7 * 0@@ 0' 1" *
- @end group
- @end smallexample
- @noindent
- @smallexample
- @group
- 2: 8726@@ 38' 46.5359" 1: 6@@ 6' 2.5359" mod 24@@ 0' 0"
- 1: 15@@ 27' 16" mod 24@@ 0' 0" .
- .
- x time @key{RET} +
- @end group
- @end smallexample
- @noindent
- It will be just after six in the morning.
- The algebraic @code{hms} function can also be used to build an
- HMS form:
- @smallexample
- @group
- 1: hms(0, 0, 10000000. pi) 1: 8726@@ 38' 46.5359"
- . .
- ' hms(0, 0, 1e7 pi) @key{RET} =
- @end group
- @end smallexample
- @noindent
- The @kbd{=} key is necessary to evaluate the symbol @samp{pi} to
- the actual number 3.14159...
- @node Types Answer 12, Types Answer 13, Types Answer 11, Answers to Exercises
- @subsection Types Tutorial Exercise 12
- @noindent
- As we recall, there are 17 songs of about 2 minutes and 47 seconds
- each.
- @smallexample
- @group
- 2: 0@@ 2' 47" 1: [0@@ 3' 7" .. 0@@ 3' 47"]
- 1: [0@@ 0' 20" .. 0@@ 1' 0"] .
- .
- [ 0@@ 20" .. 0@@ 1' ] +
- @end group
- @end smallexample
- @noindent
- @smallexample
- @group
- 1: [0@@ 52' 59." .. 1@@ 4' 19."]
- .
- 17 *
- @end group
- @end smallexample
- @noindent
- No matter how long it is, the album will fit nicely on one CD.
- @node Types Answer 13, Types Answer 14, Types Answer 12, Answers to Exercises
- @subsection Types Tutorial Exercise 13
- @noindent
- Type @kbd{' 1 yr @key{RET} u c s @key{RET}}. The answer is 31557600 seconds.
- @node Types Answer 14, Types Answer 15, Types Answer 13, Answers to Exercises
- @subsection Types Tutorial Exercise 14
- @noindent
- How long will it take for a signal to get from one end of the computer
- to the other?
- @smallexample
- @group
- 1: m / c 1: 3.3356 ns
- . .
- ' 1 m / c @key{RET} u c ns @key{RET}
- @end group
- @end smallexample
- @noindent
- (Recall, @samp{c} is a ``unit'' corresponding to the speed of light.)
- @smallexample
- @group
- 1: 3.3356 ns 1: 0.81356 ns / ns 1: 0.81356
- 2: 4.1 ns . .
- .
- ' 4.1 ns @key{RET} / u s
- @end group
- @end smallexample
- @noindent
- Thus a signal could take up to 81 percent of a clock cycle just to
- go from one place to another inside the computer, assuming the signal
- could actually attain the full speed of light. Pretty tight!
- @node Types Answer 15, Algebra Answer 1, Types Answer 14, Answers to Exercises
- @subsection Types Tutorial Exercise 15
- @noindent
- The speed limit is 55 miles per hour on most highways. We want to
- find the ratio of Sam's speed to the US speed limit.
- @smallexample
- @group
- 1: 55 mph 2: 55 mph 3: 11 hr mph / yd
- . 1: 5 yd / hr .
- .
- ' 55 mph @key{RET} ' 5 yd/hr @key{RET} /
- @end group
- @end smallexample
- The @kbd{u s} command cancels out these units to get a plain
- number. Now we take the logarithm base two to find the final
- answer, assuming that each successive pill doubles his speed.
- @smallexample
- @group
- 1: 19360. 2: 19360. 1: 14.24
- . 1: 2 .
- .
- u s 2 B
- @end group
- @end smallexample
- @noindent
- Thus Sam can take up to 14 pills without a worry.
- @node Algebra Answer 1, Algebra Answer 2, Types Answer 15, Answers to Exercises
- @subsection Algebra Tutorial Exercise 1
- @noindent
- @c [fix-ref Declarations]
- The result @samp{sqrt(x)^2} is simplified back to @cite{x} by the
- Calculator, but @samp{sqrt(x^2)} is not. (Consider what happens
- if @w{@cite{x = -4}}.) If @cite{x} is real, this formula could be
- simplified to @samp{abs(x)}, but for general complex arguments even
- that is not safe. (@xref{Declarations}, for a way to tell Calc
- that @cite{x} is known to be real.)
- @node Algebra Answer 2, Algebra Answer 3, Algebra Answer 1, Answers to Exercises
- @subsection Algebra Tutorial Exercise 2
- @noindent
- Suppose our roots are @cite{[a, b, c]}. We want a polynomial which
- is zero when @cite{x} is any of these values. The trivial polynomial
- @cite{x-a} is zero when @cite{x=a}, so the product @cite{(x-a)(x-b)(x-c)}
- will do the job. We can use @kbd{a c x} to write this in a more
- familiar form.
- @smallexample
- @group
- 1: 34 x - 24 x^3 1: [1.19023, -1.19023, 0]
- . .
- r 2 a P x @key{RET}
- @end group
- @end smallexample
- @noindent
- @smallexample
- @group
- 1: [x - 1.19023, x + 1.19023, x] 1: (x - 1.19023) (x + 1.19023) x
- . .
- V M ' x-$ @key{RET} V R *
- @end group
- @end smallexample
- @noindent
- @smallexample
- @group
- 1: x^3 - 1.41666 x 1: 34 x - 24 x^3
- . .
- a c x @key{RET} 24 n * a x
- @end group
- @end smallexample
- @noindent
- Sure enough, our answer (multiplied by a suitable constant) is the
- same as the original polynomial.
- @node Algebra Answer 3, Algebra Answer 4, Algebra Answer 2, Answers to Exercises
- @subsection Algebra Tutorial Exercise 3
- @smallexample
- @group
- 1: x sin(pi x) 1: (sin(pi x) - pi x cos(pi x)) / pi^2
- . .
- ' x sin(pi x) @key{RET} m r a i x @key{RET}
- @end group
- @end smallexample
- @noindent
- @smallexample
- @group
- 1: [y, 1]
- 2: (sin(pi x) - pi x cos(pi x)) / pi^2
- .
- ' [y,1] @key{RET} @key{TAB}
- @end group
- @end smallexample
- @noindent
- @smallexample
- @group
- 1: [(sin(pi y) - pi y cos(pi y)) / pi^2, (sin(pi) - pi cos(pi)) / pi^2]
- .
- V M $ @key{RET}
- @end group
- @end smallexample
- @noindent
- @smallexample
- @group
- 1: (sin(pi y) - pi y cos(pi y)) / pi^2 + (pi cos(pi) - sin(pi)) / pi^2
- .
- V R -
- @end group
- @end smallexample
- @noindent
- @smallexample
- @group
- 1: (sin(3.14159 y) - 3.14159 y cos(3.14159 y)) / 9.8696 - 0.3183
- .
- =
- @end group
- @end smallexample
- @noindent
- @smallexample
- @group
- 1: [0., -0.95493, 0.63662, -1.5915, 1.2732]
- .
- v x 5 @key{RET} @key{TAB} V M $ @key{RET}
- @end group
- @end smallexample
- @node Algebra Answer 4, Rewrites Answer 1, Algebra Answer 3, Answers to Exercises
- @subsection Algebra Tutorial Exercise 4
- @noindent
- The hard part is that @kbd{V R +} is no longer sufficient to add up all
- the contributions from the slices, since the slices have varying
- coefficients. So first we must come up with a vector of these
- coefficients. Here's one way:
- @smallexample
- @group
- 2: -1 2: 3 1: [4, 2, ..., 4]
- 1: [1, 2, ..., 9] 1: [-1, 1, ..., -1] .
- . .
- 1 n v x 9 @key{RET} V M ^ 3 @key{TAB} -
- @end group
- @end smallexample
- @noindent
- @smallexample
- @group
- 1: [4, 2, ..., 4, 1] 1: [1, 4, 2, ..., 4, 1]
- . .
- 1 | 1 @key{TAB} |
- @end group
- @end smallexample
- @noindent
- Now we compute the function values. Note that for this method we need
- eleven values, including both endpoints of the desired interval.
- @smallexample
- @group
- 2: [1, 4, 2, ..., 4, 1]
- 1: [1, 1.1, 1.2, ... , 1.8, 1.9, 2.]
- .
- 11 @key{RET} 1 @key{RET} .1 @key{RET} C-u v x
- @end group
- @end smallexample
- @noindent
- @smallexample
- @group
- 2: [1, 4, 2, ..., 4, 1]
- 1: [0., 0.084941, 0.16993, ... ]
- .
- ' sin(x) ln(x) @key{RET} m r p 5 @key{RET} V M $ @key{RET}
- @end group
- @end smallexample
- @noindent
- Once again this calls for @kbd{V M * V R +}; a simple @kbd{*} does the
- same thing.
- @smallexample
- @group
- 1: 11.22 1: 1.122 1: 0.374
- . . .
- * .1 * 3 /
- @end group
- @end smallexample
- @noindent
- Wow! That's even better than the result from the Taylor series method.
- @node Rewrites Answer 1, Rewrites Answer 2, Algebra Answer 4, Answers to Exercises
- @subsection Rewrites Tutorial Exercise 1
- @noindent
- We'll use Big mode to make the formulas more readable.
- @smallexample
- @group
- ___
- 2 + V 2
- 1: (2 + sqrt(2)) / (1 + sqrt(2)) 1: --------
- . ___
- 1 + V 2
- .
- ' (2+sqrt(2)) / (1+sqrt(2)) @key{RET} d B
- @end group
- @end smallexample
- @noindent
- Multiplying by the conjugate helps because @cite{(a+b) (a-b) = a^2 - b^2}.
- @smallexample
- @group
- ___ ___
- 1: (2 + V 2 ) (V 2 - 1)
- .
- a r a/(b+c) := a*(b-c) / (b^2-c^2) @key{RET}
- @end group
- @end smallexample
- @noindent
- @smallexample
- @group
- ___ ___
- 1: 2 + V 2 - 2 1: V 2
- . .
- a r a*(b+c) := a*b + a*c a s
- @end group
- @end smallexample
- @noindent
- (We could have used @kbd{a x} instead of a rewrite rule for the
- second step.)
- The multiply-by-conjugate rule turns out to be useful in many
- different circumstances, such as when the denominator involves
- sines and cosines or the imaginary constant @code{i}.
- @node Rewrites Answer 2, Rewrites Answer 3, Rewrites Answer 1, Answers to Exercises
- @subsection Rewrites Tutorial Exercise 2
- @noindent
- Here is the rule set:
- @smallexample
- @group
- [ fib(n) := fib(n, 1, 1) :: integer(n) :: n >= 1,
- fib(1, x, y) := x,
- fib(n, x, y) := fib(n-1, y, x+y) ]
- @end group
- @end smallexample
- @noindent
- The first rule turns a one-argument @code{fib} that people like to write
- into a three-argument @code{fib} that makes computation easier. The
- second rule converts back from three-argument form once the computation
- is done. The third rule does the computation itself. It basically
- says that if @cite{x} and @cite{y} are two consecutive Fibonacci numbers,
- then @cite{y} and @cite{x+y} are the next (overlapping) pair of Fibonacci
- numbers.
- Notice that because the number @cite{n} was ``validated'' by the
- conditions on the first rule, there is no need to put conditions on
- the other rules because the rule set would never get that far unless
- the input were valid. That further speeds computation, since no
- extra conditions need to be checked at every step.
- Actually, a user with a nasty sense of humor could enter a bad
- three-argument @code{fib} call directly, say, @samp{fib(0, 1, 1)},
- which would get the rules into an infinite loop. One thing that would
- help keep this from happening by accident would be to use something like
- @samp{ZzFib} instead of @code{fib} as the name of the three-argument
- function.
- @node Rewrites Answer 3, Rewrites Answer 4, Rewrites Answer 2, Answers to Exercises
- @subsection Rewrites Tutorial Exercise 3
- @noindent
- He got an infinite loop. First, Calc did as expected and rewrote
- @w{@samp{2 + 3 x}} to @samp{f(2, 3, x)}. Then it looked for ways to
- apply the rule again, and found that @samp{f(2, 3, x)} looks like
- @samp{a + b x} with @w{@samp{a = 0}} and @samp{b = 1}, so it rewrote to
- @samp{f(0, 1, f(2, 3, x))}. It then wrapped another @samp{f(0, 1, ...)}
- around that, and so on, ad infinitum. Joe should have used @kbd{M-1 a r}
- to make sure the rule applied only once.
- (Actually, even the first step didn't work as he expected. What Calc
- really gives for @kbd{M-1 a r} in this situation is @samp{f(3 x, 1, 2)},
- treating 2 as the ``variable,'' and @samp{3 x} as a constant being added
- to it. While this may seem odd, it's just as valid a solution as the
- ``obvious'' one. One way to fix this would be to add the condition
- @samp{:: variable(x)} to the rule, to make sure the thing that matches
- @samp{x} is indeed a variable, or to change @samp{x} to @samp{quote(x)}
- on the lefthand side, so that the rule matches the actual variable
- @samp{x} rather than letting @samp{x} stand for something else.)
- @node Rewrites Answer 4, Rewrites Answer 5, Rewrites Answer 3, Answers to Exercises
- @subsection Rewrites Tutorial Exercise 4
- @noindent
- @ignore
- @starindex
- @end ignore
- @tindex seq
- Here is a suitable set of rules to solve the first part of the problem:
- @smallexample
- @group
- [ seq(n, c) := seq(n/2, c+1) :: n%2 = 0,
- seq(n, c) := seq(3n+1, c+1) :: n%2 = 1 :: n > 1 ]
- @end group
- @end smallexample
- Given the initial formula @samp{seq(6, 0)}, application of these
- rules produces the following sequence of formulas:
- @example
- seq( 3, 1)
- seq(10, 2)
- seq( 5, 3)
- seq(16, 4)
- seq( 8, 5)
- seq( 4, 6)
- seq( 2, 7)
- seq( 1, 8)
- @end example
- @noindent
- whereupon neither of the rules match, and rewriting stops.
- We can pretty this up a bit with a couple more rules:
- @smallexample
- @group
- [ seq(n) := seq(n, 0),
- seq(1, c) := c,
- ... ]
- @end group
- @end smallexample
- @noindent
- Now, given @samp{seq(6)} as the starting configuration, we get 8
- as the result.
- The change to return a vector is quite simple:
- @smallexample
- @group
- [ seq(n) := seq(n, []) :: integer(n) :: n > 0,
- seq(1, v) := v | 1,
- seq(n, v) := seq(n/2, v | n) :: n%2 = 0,
- seq(n, v) := seq(3n+1, v | n) :: n%2 = 1 ]
- @end group
- @end smallexample
- @noindent
- Given @samp{seq(6)}, the result is @samp{[6, 3, 10, 5, 16, 8, 4, 2, 1]}.
- Notice that the @cite{n > 1} guard is no longer necessary on the last
- rule since the @cite{n = 1} case is now detected by another rule.
- But a guard has been added to the initial rule to make sure the
- initial value is suitable before the computation begins.
- While still a good idea, this guard is not as vitally important as it
- was for the @code{fib} function, since calling, say, @samp{seq(x, [])}
- will not get into an infinite loop. Calc will not be able to prove
- the symbol @samp{x} is either even or odd, so none of the rules will
- apply and the rewrites will stop right away.
- @node Rewrites Answer 5, Rewrites Answer 6, Rewrites Answer 4, Answers to Exercises
- @subsection Rewrites Tutorial Exercise 5
- @noindent
- @ignore
- @starindex
- @end ignore
- @tindex nterms
- If @cite{x} is the sum @cite{a + b}, then `@t{nterms(}@var{x}@t{)}' must
- be `@t{nterms(}@var{a}@t{)}' plus `@t{nterms(}@var{b}@t{)}'. If @cite{x}
- is not a sum, then `@t{nterms(}@var{x}@t{)}' = 1.
- @smallexample
- @group
- [ nterms(a + b) := nterms(a) + nterms(b),
- nterms(x) := 1 ]
- @end group
- @end smallexample
- @noindent
- Here we have taken advantage of the fact that earlier rules always
- match before later rules; @samp{nterms(x)} will only be tried if we
- already know that @samp{x} is not a sum.
- @node Rewrites Answer 6, Rewrites Answer 7, Rewrites Answer 5, Answers to Exercises
- @subsection Rewrites Tutorial Exercise 6
- Just put the rule @samp{0^0 := 1} into @code{EvalRules}. For example,
- before making this definition we have:
- @smallexample
- @group
- 2: [-2, -1, 0, 1, 2] 1: [1, 1, 0^0, 1, 1]
- 1: 0 .
- .
- v x 5 @key{RET} 3 - 0 V M ^
- @end group
- @end smallexample
- @noindent
- But then:
- @smallexample
- @group
- 2: [-2, -1, 0, 1, 2] 1: [1, 1, 1, 1, 1]
- 1: 0 .
- .
- U ' 0^0:=1 @key{RET} s t EvalRules @key{RET} V M ^
- @end group
- @end smallexample
- Perhaps more surprisingly, this rule still works with infinite mode
- turned on. Calc tries @code{EvalRules} before any built-in rules for
- a function. This allows you to override the default behavior of any
- Calc feature: Even though Calc now wants to evaluate @cite{0^0} to
- @code{nan}, your rule gets there first and evaluates it to 1 instead.
- Just for kicks, try adding the rule @code{2+3 := 6} to @code{EvalRules}.
- What happens? (Be sure to remove this rule afterward, or you might get
- a nasty surprise when you use Calc to balance your checkbook!)
- @node Rewrites Answer 7, Programming Answer 1, Rewrites Answer 6, Answers to Exercises
- @subsection Rewrites Tutorial Exercise 7
- @noindent
- Here is a rule set that will do the job:
- @smallexample
- @group
- [ a*(b + c) := a*b + a*c,
- opt(a) O(x^n) + opt(b) O(x^m) := O(x^n) :: n <= m
- :: constant(a) :: constant(b),
- opt(a) O(x^n) + opt(b) x^m := O(x^n) :: n <= m
- :: constant(a) :: constant(b),
- a O(x^n) := O(x^n) :: constant(a),
- x^opt(m) O(x^n) := O(x^(n+m)),
- O(x^n) O(x^m) := O(x^(n+m)) ]
- @end group
- @end smallexample
- If we really want the @kbd{+} and @kbd{*} keys to operate naturally
- on power series, we should put these rules in @code{EvalRules}. For
- testing purposes, it is better to put them in a different variable,
- say, @code{O}, first.
- The first rule just expands products of sums so that the rest of the
- rules can assume they have an expanded-out polynomial to work with.
- Note that this rule does not mention @samp{O} at all, so it will
- apply to any product-of-sum it encounters---this rule may surprise
- you if you put it into @code{EvalRules}!
- In the second rule, the sum of two O's is changed to the smaller O.
- The optional constant coefficients are there mostly so that
- @samp{O(x^2) - O(x^3)} and @samp{O(x^3) - O(x^2)} are handled
- as well as @samp{O(x^2) + O(x^3)}.
- The third rule absorbs higher powers of @samp{x} into O's.
- The fourth rule says that a constant times a negligible quantity
- is still negligible. (This rule will also match @samp{O(x^3) / 4},
- with @samp{a = 1/4}.)
- The fifth rule rewrites, for example, @samp{x^2 O(x^3)} to @samp{O(x^5)}.
- (It is easy to see that if one of these forms is negligible, the other
- is, too.) Notice the @samp{x^opt(m)} to pick up terms like
- @w{@samp{x O(x^3)}}. Optional powers will match @samp{x} as @samp{x^1}
- but not 1 as @samp{x^0}. This turns out to be exactly what we want here.
- The sixth rule is the corresponding rule for products of two O's.
- Another way to solve this problem would be to create a new ``data type''
- that represents truncated power series. We might represent these as
- function calls @samp{series(@var{coefs}, @var{x})} where @var{coefs} is
- a vector of coefficients for @cite{x^0}, @cite{x^1}, @cite{x^2}, and so
- on. Rules would exist for sums and products of such @code{series}
- objects, and as an optional convenience could also know how to combine a
- @code{series} object with a normal polynomial. (With this, and with a
- rule that rewrites @samp{O(x^n)} to the equivalent @code{series} form,
- you could still enter power series in exactly the same notation as
- before.) Operations on such objects would probably be more efficient,
- although the objects would be a bit harder to read.
- @c [fix-ref Compositions]
- Some other symbolic math programs provide a power series data type
- similar to this. Mathematica, for example, has an object that looks
- like @samp{PowerSeries[@var{x}, @var{x0}, @var{coefs}, @var{nmin},
- @var{nmax}, @var{den}]}, where @var{x0} is the point about which the
- power series is taken (we've been assuming this was always zero),
- and @var{nmin}, @var{nmax}, and @var{den} allow pseudo-power-series
- with fractional or negative powers. Also, the @code{PowerSeries}
- objects have a special display format that makes them look like
- @samp{2 x^2 + O(x^4)} when they are printed out. (@xref{Compositions},
- for a way to do this in Calc, although for something as involved as
- this it would probably be better to write the formatting routine
- in Lisp.)
- @node Programming Answer 1, Programming Answer 2, Rewrites Answer 7, Answers to Exercises
- @subsection Programming Tutorial Exercise 1
- @noindent
- Just enter the formula @samp{ninteg(sin(t)/t, t, 0, x)}, type
- @kbd{Z F}, and answer the questions. Since this formula contains two
- variables, the default argument list will be @samp{(t x)}. We want to
- change this to @samp{(x)} since @cite{t} is really a dummy variable
- to be used within @code{ninteg}.
- The exact keystrokes are @kbd{Z F s Si @key{RET} @key{RET} C-b C-b @key{DEL} @key{DEL} @key{RET} y}.
- (The @kbd{C-b C-b @key{DEL} @key{DEL}} are what fix the argument list.)
- @node Programming Answer 2, Programming Answer 3, Programming Answer 1, Answers to Exercises
- @subsection Programming Tutorial Exercise 2
- @noindent
- One way is to move the number to the top of the stack, operate on
- it, then move it back: @kbd{C-x ( M-@key{TAB} n M-@key{TAB} M-@key{TAB} C-x )}.
- Another way is to negate the top three stack entries, then negate
- again the top two stack entries: @kbd{C-x ( M-3 n M-2 n C-x )}.
- Finally, it turns out that a negative prefix argument causes a
- command like @kbd{n} to operate on the specified stack entry only,
- which is just what we want: @kbd{C-x ( M-- 3 n C-x )}.
- Just for kicks, let's also do it algebraically:
- @w{@kbd{C-x ( ' -$$$, $$, $ @key{RET} C-x )}}.
- @node Programming Answer 3, Programming Answer 4, Programming Answer 2, Answers to Exercises
- @subsection Programming Tutorial Exercise 3
- @noindent
- Each of these functions can be computed using the stack, or using
- algebraic entry, whichever way you prefer:
- @noindent
- Computing @c{$\displaystyle{\sin x \over x}$}
- @cite{sin(x) / x}:
- Using the stack: @kbd{C-x ( @key{RET} S @key{TAB} / C-x )}.
- Using algebraic entry: @kbd{C-x ( ' sin($)/$ @key{RET} C-x )}.
- @noindent
- Computing the logarithm:
- Using the stack: @kbd{C-x ( @key{TAB} B C-x )}
- Using algebraic entry: @kbd{C-x ( ' log($,$$) @key{RET} C-x )}.
- @noindent
- Computing the vector of integers:
- Using the stack: @kbd{C-x ( 1 @key{RET} 1 C-u v x C-x )}. (Recall that
- @kbd{C-u v x} takes the vector size, starting value, and increment
- from the stack.)
- Alternatively: @kbd{C-x ( ~ v x C-x )}. (The @kbd{~} key pops a
- number from the stack and uses it as the prefix argument for the
- next command.)
- Using algebraic entry: @kbd{C-x ( ' index($) @key{RET} C-x )}.
- @node Programming Answer 4, Programming Answer 5, Programming Answer 3, Answers to Exercises
- @subsection Programming Tutorial Exercise 4
- @noindent
- Here's one way: @kbd{C-x ( @key{RET} V R + @key{TAB} v l / C-x )}.
- @node Programming Answer 5, Programming Answer 6, Programming Answer 4, Answers to Exercises
- @subsection Programming Tutorial Exercise 5
- @smallexample
- @group
- 2: 1 1: 1.61803398502 2: 1.61803398502
- 1: 20 . 1: 1.61803398875
- . .
- 1 @key{RET} 20 Z < & 1 + Z > I H P
- @end group
- @end smallexample
- @noindent
- This answer is quite accurate.
- @node Programming Answer 6, Programming Answer 7, Programming Answer 5, Answers to Exercises
- @subsection Programming Tutorial Exercise 6
- @noindent
- Here is the matrix:
- @example
- [ [ 0, 1 ] * [a, b] = [b, a + b]
- [ 1, 1 ] ]
- @end example
- @noindent
- Thus @samp{[0, 1; 1, 1]^n * [1, 1]} computes Fibonacci numbers @cite{n+1}
- and @cite{n+2}. Here's one program that does the job:
- @example
- C-x ( ' [0, 1; 1, 1] ^ ($-1) * [1, 1] @key{RET} v u @key{DEL} C-x )
- @end example
- @noindent
- This program is quite efficient because Calc knows how to raise a
- matrix (or other value) to the power @cite{n} in only @c{$\log_2 n$}
- @cite{log(n,2)}
- steps. For example, this program can compute the 1000th Fibonacci
- number (a 209-digit integer!) in about 10 steps; even though the
- @kbd{Z < ... Z >} solution had much simpler steps, it would have
- required so many steps that it would not have been practical.
- @node Programming Answer 7, Programming Answer 8, Programming Answer 6, Answers to Exercises
- @subsection Programming Tutorial Exercise 7
- @noindent
- The trick here is to compute the harmonic numbers differently, so that
- the loop counter itself accumulates the sum of reciprocals. We use
- a separate variable to hold the integer counter.
- @smallexample
- @group
- 1: 1 2: 1 1: .
- . 1: 4
- .
- 1 t 1 1 @key{RET} 4 Z ( t 2 r 1 1 + s 1 & Z )
- @end group
- @end smallexample
- @noindent
- The body of the loop goes as follows: First save the harmonic sum
- so far in variable 2. Then delete it from the stack; the for loop
- itself will take care of remembering it for us. Next, recall the
- count from variable 1, add one to it, and feed its reciprocal to
- the for loop to use as the step value. The for loop will increase
- the ``loop counter'' by that amount and keep going until the
- loop counter exceeds 4.
- @smallexample
- @group
- 2: 31 3: 31
- 1: 3.99498713092 2: 3.99498713092
- . 1: 4.02724519544
- .
- r 1 r 2 @key{RET} 31 & +
- @end group
- @end smallexample
- Thus we find that the 30th harmonic number is 3.99, and the 31st
- harmonic number is 4.02.
- @node Programming Answer 8, Programming Answer 9, Programming Answer 7, Answers to Exercises
- @subsection Programming Tutorial Exercise 8
- @noindent
- The first step is to compute the derivative @cite{f'(x)} and thus
- the formula @c{$\displaystyle{x - {f(x) \over f'(x)}}$}
- @cite{x - f(x)/f'(x)}.
- (Because this definition is long, it will be repeated in concise form
- below. You can use @w{@kbd{M-# m}} to load it from there. While you are
- entering a @kbd{Z ` Z '} body in a macro, Calc simply collects
- keystrokes without executing them. In the following diagrams we'll
- pretend Calc actually executed the keystrokes as you typed them,
- just for purposes of illustration.)
- @smallexample
- @group
- 2: sin(cos(x)) - 0.5 3: 4.5
- 1: 4.5 2: sin(cos(x)) - 0.5
- . 1: -(sin(x) cos(cos(x)))
- .
- ' sin(cos(x))-0.5 @key{RET} 4.5 m r C-x ( Z ` @key{TAB} @key{RET} a d x @key{RET}
- @end group
- @end smallexample
- @noindent
- @smallexample
- @group
- 2: 4.5
- 1: x + (sin(cos(x)) - 0.5) / sin(x) cos(cos(x))
- .
- / ' x @key{RET} @key{TAB} - t 1
- @end group
- @end smallexample
- Now, we enter the loop. We'll use a repeat loop with a 20-repetition
- limit just in case the method fails to converge for some reason.
- (Normally, the @w{@kbd{Z /}} command will stop the loop before all 20
- repetitions are done.)
- @smallexample
- @group
- 1: 4.5 3: 4.5 2: 4.5
- . 2: x + (sin(cos(x)) ... 1: 5.24196456928
- 1: 4.5 .
- .
- 20 Z < @key{RET} r 1 @key{TAB} s l x @key{RET}
- @end group
- @end smallexample
- This is the new guess for @cite{x}. Now we compare it with the
- old one to see if we've converged.
- @smallexample
- @group
- 3: 5.24196 2: 5.24196 1: 5.24196 1: 5.26345856348
- 2: 5.24196 1: 0 . .
- 1: 4.5 .
- .
- @key{RET} M-@key{TAB} a = Z / Z > Z ' C-x )
- @end group
- @end smallexample
- The loop converges in just a few steps to this value. To check
- the result, we can simply substitute it back into the equation.
- @smallexample
- @group
- 2: 5.26345856348
- 1: 0.499999999997
- .
- @key{RET} ' sin(cos($)) @key{RET}
- @end group
- @end smallexample
- Let's test the new definition again:
- @smallexample
- @group
- 2: x^2 - 9 1: 3.
- 1: 1 .
- .
- ' x^2-9 @key{RET} 1 X
- @end group
- @end smallexample
- Once again, here's the full Newton's Method definition:
- @example
- @group
- C-x ( Z ` @key{TAB} @key{RET} a d x @key{RET} / ' x @key{RET} @key{TAB} - t 1
- 20 Z < @key{RET} r 1 @key{TAB} s l x @key{RET}
- @key{RET} M-@key{TAB} a = Z /
- Z >
- Z '
- C-x )
- @end group
- @end example
- @c [fix-ref Nesting and Fixed Points]
- It turns out that Calc has a built-in command for applying a formula
- repeatedly until it converges to a number. @xref{Nesting and Fixed Points},
- to see how to use it.
- @c [fix-ref Root Finding]
- Also, of course, @kbd{a R} is a built-in command that uses Newton's
- method (among others) to look for numerical solutions to any equation.
- @xref{Root Finding}.
- @node Programming Answer 9, Programming Answer 10, Programming Answer 8, Answers to Exercises
- @subsection Programming Tutorial Exercise 9
- @noindent
- The first step is to adjust @cite{z} to be greater than 5. A simple
- ``for'' loop will do the job here. If @cite{z} is less than 5, we
- reduce the problem using @c{$\psi(z) = \psi(z+1) - 1/z$}
- @cite{psi(z) = psi(z+1) - 1/z}. We go
- on to compute @c{$\psi(z+1)$}
- @cite{psi(z+1)}, and remember to add back a factor of
- @cite{-1/z} when we're done. This step is repeated until @cite{z > 5}.
- (Because this definition is long, it will be repeated in concise form
- below. You can use @w{@kbd{M-# m}} to load it from there. While you are
- entering a @kbd{Z ` Z '} body in a macro, Calc simply collects
- keystrokes without executing them. In the following diagrams we'll
- pretend Calc actually executed the keystrokes as you typed them,
- just for purposes of illustration.)
- @smallexample
- @group
- 1: 1. 1: 1.
- . .
- 1.0 @key{RET} C-x ( Z ` s 1 0 t 2
- @end group
- @end smallexample
- Here, variable 1 holds @cite{z} and variable 2 holds the adjustment
- factor. If @cite{z < 5}, we use a loop to increase it.
- (By the way, we started with @samp{1.0} instead of the integer 1 because
- otherwise the calculation below will try to do exact fractional arithmetic,
- and will never converge because fractions compare equal only if they
- are exactly equal, not just equal to within the current precision.)
- @smallexample
- @group
- 3: 1. 2: 1. 1: 6.
- 2: 1. 1: 1 .
- 1: 5 .
- .
- @key{RET} 5 a < Z [ 5 Z ( & s + 2 1 s + 1 1 Z ) r 1 Z ]
- @end group
- @end smallexample
- Now we compute the initial part of the sum: @c{$\ln z - {1 \over 2z}$}
- @cite{ln(z) - 1/2z}
- minus the adjustment factor.
- @smallexample
- @group
- 2: 1.79175946923 2: 1.7084261359 1: -0.57490719743
- 1: 0.0833333333333 1: 2.28333333333 .
- . .
- L r 1 2 * & - r 2 -
- @end group
- @end smallexample
- Now we evaluate the series. We'll use another ``for'' loop counting
- up the value of @cite{2 n}. (Calc does have a summation command,
- @kbd{a +}, but we'll use loops just to get more practice with them.)
- @smallexample
- @group
- 3: -0.5749 3: -0.5749 4: -0.5749 2: -0.5749
- 2: 2 2: 1:6 3: 1:6 1: 2.3148e-3
- 1: 40 1: 2 2: 2 .
- . . 1: 36.
- .
- 2 @key{RET} 40 Z ( @key{RET} k b @key{TAB} @key{RET} r 1 @key{TAB} ^ * /
- @end group
- @end smallexample
- @noindent
- @smallexample
- @group
- 3: -0.5749 3: -0.5772 2: -0.5772 1: -0.577215664892
- 2: -0.5749 2: -0.5772 1: 0 .
- 1: 2.3148e-3 1: -0.5749 .
- . .
- @key{TAB} @key{RET} M-@key{TAB} - @key{RET} M-@key{TAB} a = Z / 2 Z ) Z ' C-x )
- @end group
- @end smallexample
- This is the value of @c{$-\gamma$}
- @cite{- gamma}, with a slight bit of roundoff error.
- To get a full 12 digits, let's use a higher precision:
- @smallexample
- @group
- 2: -0.577215664892 2: -0.577215664892
- 1: 1. 1: -0.577215664901532
- 1. @key{RET} p 16 @key{RET} X
- @end group
- @end smallexample
- Here's the complete sequence of keystrokes:
- @example
- @group
- C-x ( Z ` s 1 0 t 2
- @key{RET} 5 a < Z [ 5 Z ( & s + 2 1 s + 1 1 Z ) r 1 Z ]
- L r 1 2 * & - r 2 -
- 2 @key{RET} 40 Z ( @key{RET} k b @key{TAB} @key{RET} r 1 @key{TAB} ^ * /
- @key{TAB} @key{RET} M-@key{TAB} - @key{RET} M-@key{TAB} a = Z /
- 2 Z )
- Z '
- C-x )
- @end group
- @end example
- @node Programming Answer 10, Programming Answer 11, Programming Answer 9, Answers to Exercises
- @subsection Programming Tutorial Exercise 10
- @noindent
- Taking the derivative of a term of the form @cite{x^n} will produce
- a term like @c{$n x^{n-1}$}
- @cite{n x^(n-1)}. Taking the derivative of a constant
- produces zero. From this it is easy to see that the @cite{n}th
- derivative of a polynomial, evaluated at @cite{x = 0}, will equal the
- coefficient on the @cite{x^n} term times @cite{n!}.
- (Because this definition is long, it will be repeated in concise form
- below. You can use @w{@kbd{M-# m}} to load it from there. While you are
- entering a @kbd{Z ` Z '} body in a macro, Calc simply collects
- keystrokes without executing them. In the following diagrams we'll
- pretend Calc actually executed the keystrokes as you typed them,
- just for purposes of illustration.)
- @smallexample
- @group
- 2: 5 x^4 + (x + 1)^2 3: 5 x^4 + (x + 1)^2
- 1: 6 2: 0
- . 1: 6
- .
- ' 5 x^4 + (x+1)^2 @key{RET} 6 C-x ( Z ` [ ] t 1 0 @key{TAB}
- @end group
- @end smallexample
- @noindent
- Variable 1 will accumulate the vector of coefficients.
- @smallexample
- @group
- 2: 0 3: 0 2: 5 x^4 + ...
- 1: 5 x^4 + ... 2: 5 x^4 + ... 1: 1
- . 1: 1 .
- .
- Z ( @key{TAB} @key{RET} 0 s l x @key{RET} M-@key{TAB} ! / s | 1
- @end group
- @end smallexample
- @noindent
- Note that @kbd{s | 1} appends the top-of-stack value to the vector
- in a variable; it is completely analogous to @kbd{s + 1}. We could
- have written instead, @kbd{r 1 @key{TAB} | t 1}.
- @smallexample
- @group
- 1: 20 x^3 + 2 x + 2 1: 0 1: [1, 2, 1, 0, 5, 0, 0]
- . . .
- a d x @key{RET} 1 Z ) @key{DEL} r 1 Z ' C-x )
- @end group
- @end smallexample
- To convert back, a simple method is just to map the coefficients
- against a table of powers of @cite{x}.
- @smallexample
- @group
- 2: [1, 2, 1, 0, 5, 0, 0] 2: [1, 2, 1, 0, 5, 0, 0]
- 1: 6 1: [0, 1, 2, 3, 4, 5, 6]
- . .
- 6 @key{RET} 1 + 0 @key{RET} 1 C-u v x
- @end group
- @end smallexample
- @noindent
- @smallexample
- @group
- 2: [1, 2, 1, 0, 5, 0, 0] 2: 1 + 2 x + x^2 + 5 x^4
- 1: [1, x, x^2, x^3, ... ] .
- .
- ' x @key{RET} @key{TAB} V M ^ *
- @end group
- @end smallexample
- Once again, here are the whole polynomial to/from vector programs:
- @example
- @group
- C-x ( Z ` [ ] t 1 0 @key{TAB}
- Z ( @key{TAB} @key{RET} 0 s l x @key{RET} M-@key{TAB} ! / s | 1
- a d x @key{RET}
- 1 Z ) r 1
- Z '
- C-x )
- C-x ( 1 + 0 @key{RET} 1 C-u v x ' x @key{RET} @key{TAB} V M ^ * C-x )
- @end group
- @end example
- @node Programming Answer 11, Programming Answer 12, Programming Answer 10, Answers to Exercises
- @subsection Programming Tutorial Exercise 11
- @noindent
- First we define a dummy program to go on the @kbd{z s} key. The true
- @w{@kbd{z s}} key is supposed to take two numbers from the stack and
- return one number, so @key{DEL} as a dummy definition will make
- sure the stack comes out right.
- @smallexample
- @group
- 2: 4 1: 4 2: 4
- 1: 2 . 1: 2
- . .
- 4 @key{RET} 2 C-x ( @key{DEL} C-x ) Z K s @key{RET} 2
- @end group
- @end smallexample
- The last step replaces the 2 that was eaten during the creation
- of the dummy @kbd{z s} command. Now we move on to the real
- definition. The recurrence needs to be rewritten slightly,
- to the form @cite{s(n,m) = s(n-1,m-1) - (n-1) s(n-1,m)}.
- (Because this definition is long, it will be repeated in concise form
- below. You can use @kbd{M-# m} to load it from there.)
- @smallexample
- @group
- 2: 4 4: 4 3: 4 2: 4
- 1: 2 3: 2 2: 2 1: 2
- . 2: 4 1: 0 .
- 1: 2 .
- .
- C-x ( M-2 @key{RET} a = Z [ @key{DEL} @key{DEL} 1 Z :
- @end group
- @end smallexample
- @noindent
- @smallexample
- @group
- 4: 4 2: 4 2: 3 4: 3 4: 3 3: 3
- 3: 2 1: 2 1: 2 3: 2 3: 2 2: 2
- 2: 2 . . 2: 3 2: 3 1: 3
- 1: 0 1: 2 1: 1 .
- . . .
- @key{RET} 0 a = Z [ @key{DEL} @key{DEL} 0 Z : @key{TAB} 1 - @key{TAB} M-2 @key{RET} 1 - z s
- @end group
- @end smallexample
- @noindent
- (Note that the value 3 that our dummy @kbd{z s} produces is not correct;
- it is merely a placeholder that will do just as well for now.)
- @smallexample
- @group
- 3: 3 4: 3 3: 3 2: 3 1: -6
- 2: 3 3: 3 2: 3 1: 9 .
- 1: 2 2: 3 1: 3 .
- . 1: 2 .
- .
- M-@key{TAB} M-@key{TAB} @key{TAB} @key{RET} M-@key{TAB} z s * -
- @end group
- @end smallexample
- @noindent
- @smallexample
- @group
- 1: -6 2: 4 1: 11 2: 11
- . 1: 2 . 1: 11
- . .
- Z ] Z ] C-x ) Z K s @key{RET} @key{DEL} 4 @key{RET} 2 z s M-@key{RET} k s
- @end group
- @end smallexample
- Even though the result that we got during the definition was highly
- bogus, once the definition is complete the @kbd{z s} command gets
- the right answers.
- Here's the full program once again:
- @example
- @group
- C-x ( M-2 @key{RET} a =
- Z [ @key{DEL} @key{DEL} 1
- Z : @key{RET} 0 a =
- Z [ @key{DEL} @key{DEL} 0
- Z : @key{TAB} 1 - @key{TAB} M-2 @key{RET} 1 - z s
- M-@key{TAB} M-@key{TAB} @key{TAB} @key{RET} M-@key{TAB} z s * -
- Z ]
- Z ]
- C-x )
- @end group
- @end example
- You can read this definition using @kbd{M-# m} (@code{read-kbd-macro})
- followed by @kbd{Z K s}, without having to make a dummy definition
- first, because @code{read-kbd-macro} doesn't need to execute the
- definition as it reads it in. For this reason, @code{M-# m} is often
- the easiest way to create recursive programs in Calc.
- @node Programming Answer 12, , Programming Answer 11, Answers to Exercises
- @subsection Programming Tutorial Exercise 12
- @noindent
- This turns out to be a much easier way to solve the problem. Let's
- denote Stirling numbers as calls of the function @samp{s}.
- First, we store the rewrite rules corresponding to the definition of
- Stirling numbers in a convenient variable:
- @smallexample
- s e StirlingRules @key{RET}
- [ s(n,n) := 1 :: n >= 0,
- s(n,0) := 0 :: n > 0,
- s(n,m) := s(n-1,m-1) - (n-1) s(n-1,m) :: n >= m :: m >= 1 ]
- C-c C-c
- @end smallexample
- Now, it's just a matter of applying the rules:
- @smallexample
- @group
- 2: 4 1: s(4, 2) 1: 11
- 1: 2 . .
- .
- 4 @key{RET} 2 C-x ( ' s($$,$) @key{RET} a r StirlingRules @key{RET} C-x )
- @end group
- @end smallexample
- As in the case of the @code{fib} rules, it would be useful to put these
- rules in @code{EvalRules} and to add a @samp{:: remember} condition to
- the last rule.
- @c This ends the table-of-contents kludge from above:
- @tex
- \global\let\chapternofonts=\oldchapternofonts
- @end tex
- @c [reference]
- @node Introduction, Data Types, Tutorial, Top
- @chapter Introduction
- @noindent
- This chapter is the beginning of the Calc reference manual.
- It covers basic concepts such as the stack, algebraic and
- numeric entry, undo, numeric prefix arguments, etc.
- @c [when-split]
- @c (Chapter 2, the Tutorial, has been printed in a separate volume.)
- @menu
- * Basic Commands::
- * Help Commands::
- * Stack Basics::
- * Numeric Entry::
- * Algebraic Entry::
- * Quick Calculator::
- * Keypad Mode::
- * Prefix Arguments::
- * Undo::
- * Error Messages::
- * Multiple Calculators::
- * Troubleshooting Commands::
- @end menu
- @node Basic Commands, Help Commands, Introduction, Introduction
- @section Basic Commands
- @noindent
- @pindex calc
- @pindex calc-mode
- @cindex Starting the Calculator
- @cindex Running the Calculator
- To start the Calculator in its standard interface, type @kbd{M-x calc}.
- By default this creates a pair of small windows, @samp{*Calculator*}
- and @samp{*Calc Trail*}. The former displays the contents of the
- Calculator stack and is manipulated exclusively through Calc commands.
- It is possible (though not usually necessary) to create several Calc
- Mode buffers each of which has an independent stack, undo list, and
- mode settings. There is exactly one Calc Trail buffer; it records a
- list of the results of all calculations that have been done. The
- Calc Trail buffer uses a variant of Calc Mode, so Calculator commands
- still work when the trail buffer's window is selected. It is possible
- to turn the trail window off, but the @samp{*Calc Trail*} buffer itself
- still exists and is updated silently. @xref{Trail Commands}.@refill
- @kindex M-# c
- @kindex M-# M-#
- @ignore
- @mindex @null
- @end ignore
- @kindex M-# #
- In most installations, the @kbd{M-# c} key sequence is a more
- convenient way to start the Calculator. Also, @kbd{M-# M-#} and
- @kbd{M-# #} are synonyms for @kbd{M-# c} unless you last used Calc
- in its ``keypad'' mode.
- @kindex x
- @kindex M-x
- @pindex calc-execute-extended-command
- Most Calc commands use one or two keystrokes. Lower- and upper-case
- letters are distinct. Commands may also be entered in full @kbd{M-x} form;
- for some commands this is the only form. As a convenience, the @kbd{x}
- key (@code{calc-execute-extended-command})
- is like @kbd{M-x} except that it enters the initial string @samp{calc-}
- for you. For example, the following key sequences are equivalent:
- @kbd{S}, @kbd{M-x calc-sin @key{RET}}, @kbd{x sin @key{RET}}.@refill
- @cindex Extensions module
- @cindex @file{calc-ext} module
- The Calculator exists in many parts. When you type @kbd{M-# c}, the
- Emacs ``auto-load'' mechanism will bring in only the first part, which
- contains the basic arithmetic functions. The other parts will be
- auto-loaded the first time you use the more advanced commands like trig
- functions or matrix operations. This is done to improve the response time
- of the Calculator in the common case when all you need to do is a
- little arithmetic. If for some reason the Calculator fails to load an
- extension module automatically, you can force it to load all the
- extensions by using the @kbd{M-# L} (@code{calc-load-everything})
- command. @xref{Mode Settings}.@refill
- If you type @kbd{M-x calc} or @kbd{M-# c} with any numeric prefix argument,
- the Calculator is loaded if necessary, but it is not actually started.
- If the argument is positive, the @file{calc-ext} extensions are also
- loaded if necessary. User-written Lisp code that wishes to make use
- of Calc's arithmetic routines can use @samp{(calc 0)} or @samp{(calc 1)}
- to auto-load the Calculator.@refill
- @kindex M-# b
- @pindex full-calc
- If you type @kbd{M-# b}, then next time you use @kbd{M-# c} you
- will get a Calculator that uses the full height of the Emacs screen.
- When full-screen mode is on, @kbd{M-# c} runs the @code{full-calc}
- command instead of @code{calc}. From the Unix shell you can type
- @samp{emacs -f full-calc} to start a new Emacs specifically for use
- as a calculator. When Calc is started from the Emacs command line
- like this, Calc's normal ``quit'' commands actually quit Emacs itself.
- @kindex M-# o
- @pindex calc-other-window
- The @kbd{M-# o} command is like @kbd{M-# c} except that the Calc
- window is not actually selected. If you are already in the Calc
- window, @kbd{M-# o} switches you out of it. (The regular Emacs
- @kbd{C-x o} command would also work for this, but it has a
- tendency to drop you into the Calc Trail window instead, which
- @kbd{M-# o} takes care not to do.)
- @ignore
- @mindex M-# q
- @end ignore
- For one quick calculation, you can type @kbd{M-# q} (@code{quick-calc})
- which prompts you for a formula (like @samp{2+3/4}). The result is
- displayed at the bottom of the Emacs screen without ever creating
- any special Calculator windows. @xref{Quick Calculator}.
- @ignore
- @mindex M-# k
- @end ignore
- Finally, if you are using the X window system you may want to try
- @kbd{M-# k} (@code{calc-keypad}) which runs Calc with a
- ``calculator keypad'' picture as well as a stack display. Click on
- the keys with the mouse to operate the calculator. @xref{Keypad Mode}.
- @kindex q
- @pindex calc-quit
- @cindex Quitting the Calculator
- @cindex Exiting the Calculator
- The @kbd{q} key (@code{calc-quit}) exits Calc Mode and closes the
- Calculator's window(s). It does not delete the Calculator buffers.
- If you type @kbd{M-x calc} again, the Calculator will reappear with the
- contents of the stack intact. Typing @kbd{M-# c} or @kbd{M-# M-#}
- again from inside the Calculator buffer is equivalent to executing
- @code{calc-quit}; you can think of @kbd{M-# M-#} as toggling the
- Calculator on and off.@refill
- @kindex M-# x
- The @kbd{M-# x} command also turns the Calculator off, no matter which
- user interface (standard, Keypad, or Embedded) is currently active.
- It also cancels @code{calc-edit} mode if used from there.
- @kindex d @key{SPC}
- @pindex calc-refresh
- @cindex Refreshing a garbled display
- @cindex Garbled displays, refreshing
- The @kbd{d @key{SPC}} key sequence (@code{calc-refresh}) redraws the contents
- of the Calculator buffer from memory. Use this if the contents of the
- buffer have been damaged somehow.
- @ignore
- @mindex o
- @end ignore
- The @kbd{o} key (@code{calc-realign}) moves the cursor back to its
- ``home'' position at the bottom of the Calculator buffer.
- @kindex <
- @kindex >
- @pindex calc-scroll-left
- @pindex calc-scroll-right
- @cindex Horizontal scrolling
- @cindex Scrolling
- @cindex Wide text, scrolling
- The @kbd{<} and @kbd{>} keys are bound to @code{calc-scroll-left} and
- @code{calc-scroll-right}. These are just like the normal horizontal
- scrolling commands except that they scroll one half-screen at a time by
- default. (Calc formats its output to fit within the bounds of the
- window whenever it can.)@refill
- @kindex @{
- @kindex @}
- @pindex calc-scroll-down
- @pindex calc-scroll-up
- @cindex Vertical scrolling
- The @kbd{@{} and @kbd{@}} keys are bound to @code{calc-scroll-down}
- and @code{calc-scroll-up}. They scroll up or down by one-half the
- height of the Calc window.@refill
- @kindex M-# 0
- @pindex calc-reset
- The @kbd{M-# 0} command (@code{calc-reset}; that's @kbd{M-#} followed
- by a zero) resets the Calculator to its default state. This clears
- the stack, resets all the modes, clears the caches (@pxref{Caches}),
- and so on. (It does @emph{not} erase the values of any variables.)
- With a numeric prefix argument, @kbd{M-# 0} preserves the contents
- of the stack but resets everything else.
- @pindex calc-version
- The @kbd{M-x calc-version} command displays the current version number
- of Calc and the name of the person who installed it on your system.
- (This information is also present in the @samp{*Calc Trail*} buffer,
- and in the output of the @kbd{h h} command.)
- @node Help Commands, Stack Basics, Basic Commands, Introduction
- @section Help Commands
- @noindent
- @cindex Help commands
- @kindex ?
- @pindex calc-help
- The @kbd{?} key (@code{calc-help}) displays a series of brief help messages.
- Some keys (such as @kbd{b} and @kbd{d}) are prefix keys, like Emacs'
- @key{ESC} and @kbd{C-x} prefixes. You can type
- @kbd{?} after a prefix to see a list of commands beginning with that
- prefix. (If the message includes @samp{[MORE]}, press @kbd{?} again
- to see additional commands for that prefix.)
- @kindex h h
- @pindex calc-full-help
- The @kbd{h h} (@code{calc-full-help}) command displays all the @kbd{?}
- responses at once. When printed, this makes a nice, compact (three pages)
- summary of Calc keystrokes.
- In general, the @kbd{h} key prefix introduces various commands that
- provide help within Calc. Many of the @kbd{h} key functions are
- Calc-specific analogues to the @kbd{C-h} functions for Emacs help.
- @kindex h i
- @kindex M-# i
- @kindex i
- @pindex calc-info
- The @kbd{h i} (@code{calc-info}) command runs the Emacs Info system
- to read this manual on-line. This is basically the same as typing
- @kbd{C-h i} (the regular way to run the Info system), then, if Info
- is not already in the Calc manual, selecting the beginning of the
- manual. The @kbd{M-# i} command is another way to read the Calc
- manual; it is different from @kbd{h i} in that it works any time,
- not just inside Calc. The plain @kbd{i} key is also equivalent to
- @kbd{h i}, though this key is obsolete and may be replaced with a
- different command in a future version of Calc.
- @kindex h t
- @kindex M-# t
- @pindex calc-tutorial
- The @kbd{h t} (@code{calc-tutorial}) command runs the Info system on
- the Tutorial section of the Calc manual. It is like @kbd{h i},
- except that it selects the starting node of the tutorial rather
- than the beginning of the whole manual. (It actually selects the
- node ``Interactive Tutorial'' which tells a few things about
- using the Info system before going on to the actual tutorial.)
- The @kbd{M-# t} key is equivalent to @kbd{h t} (but it works at
- all times).
- @kindex h s
- @kindex M-# s
- @pindex calc-info-summary
- The @kbd{h s} (@code{calc-info-summary}) command runs the Info system
- on the Summary node of the Calc manual. @xref{Summary}. The @kbd{M-# s}
- key is equivalent to @kbd{h s}.
- @kindex h k
- @pindex calc-describe-key
- The @kbd{h k} (@code{calc-describe-key}) command looks up a key
- sequence in the Calc manual. For example, @kbd{h k H a S} looks
- up the documentation on the @kbd{H a S} (@code{calc-solve-for})
- command. This works by looking up the textual description of
- the key(s) in the Key Index of the manual, then jumping to the
- node indicated by the index.
- Most Calc commands do not have traditional Emacs documentation
- strings, since the @kbd{h k} command is both more convenient and
- more instructive. This means the regular Emacs @kbd{C-h k}
- (@code{describe-key}) command will not be useful for Calc keystrokes.
- @kindex h c
- @pindex calc-describe-key-briefly
- The @kbd{h c} (@code{calc-describe-key-briefly}) command reads a
- key sequence and displays a brief one-line description of it at
- the bottom of the screen. It looks for the key sequence in the
- Summary node of the Calc manual; if it doesn't find the sequence
- there, it acts just like its regular Emacs counterpart @kbd{C-h c}
- (@code{describe-key-briefly}). For example, @kbd{h c H a S}
- gives the description:
- @smallexample
- H a S runs calc-solve-for: a `H a S' v => fsolve(a,v) (?=notes)
- @end smallexample
- @noindent
- which means the command @kbd{H a S} or @kbd{H M-x calc-solve-for}
- takes a value @cite{a} from the stack, prompts for a value @cite{v},
- then applies the algebraic function @code{fsolve} to these values.
- The @samp{?=notes} message means you can now type @kbd{?} to see
- additional notes from the summary that apply to this command.
- @kindex h f
- @pindex calc-describe-function
- The @kbd{h f} (@code{calc-describe-function}) command looks up an
- algebraic function or a command name in the Calc manual. The
- prompt initially contains @samp{calcFunc-}; follow this with an
- algebraic function name to look up that function in the Function
- Index. Or, backspace and enter a command name beginning with
- @samp{calc-} to look it up in the Command Index. This command
- will also look up operator symbols that can appear in algebraic
- formulas, like @samp{%} and @samp{=>}.
- @kindex h v
- @pindex calc-describe-variable
- The @kbd{h v} (@code{calc-describe-variable}) command looks up a
- variable in the Calc manual. The prompt initially contains the
- @samp{var-} prefix; just add a variable name like @code{pi} or
- @code{PlotRejects}.
- @kindex h b
- @pindex describe-bindings
- The @kbd{h b} (@code{calc-describe-bindings}) command is just like
- @kbd{C-h b}, except that only local (Calc-related) key bindings are
- listed.
- @kindex h n
- The @kbd{h n} or @kbd{h C-n} (@code{calc-view-news}) command displays
- the ``news'' or change history of Calc. This is kept in the file
- @file{README}, which Calc looks for in the same directory as the Calc
- source files.
- @kindex h C-c
- @kindex h C-d
- @kindex h C-w
- The @kbd{h C-c}, @kbd{h C-d}, and @kbd{h C-w} keys display copying,
- distribution, and warranty information about Calc. These work by
- pulling up the appropriate parts of the ``Copying'' or ``Reporting
- Bugs'' sections of the manual.
- @node Stack Basics, Numeric Entry, Help Commands, Introduction
- @section Stack Basics
- @noindent
- @cindex Stack basics
- @c [fix-tut RPN Calculations and the Stack]
- Calc uses RPN notation. If you are not familar with RPN, @pxref{RPN
- Tutorial}.
- To add the numbers 1 and 2 in Calc you would type the keys:
- @kbd{1 @key{RET} 2 +}.
- (@key{RET} corresponds to the @key{ENTER} key on most calculators.)
- The first three keystrokes ``push'' the numbers 1 and 2 onto the stack. The
- @kbd{+} key always ``pops'' the top two numbers from the stack, adds them,
- and pushes the result (3) back onto the stack. This number is ready for
- further calculations: @kbd{5 -} pushes 5 onto the stack, then pops the
- 3 and 5, subtracts them, and pushes the result (@i{-2}).@refill
- Note that the ``top'' of the stack actually appears at the @emph{bottom}
- of the buffer. A line containing a single @samp{.} character signifies
- the end of the buffer; Calculator commands operate on the number(s)
- directly above this line. The @kbd{d t} (@code{calc-truncate-stack})
- command allows you to move the @samp{.} marker up and down in the stack;
- @pxref{Truncating the Stack}.
- @kindex d l
- @pindex calc-line-numbering
- Stack elements are numbered consecutively, with number 1 being the top of
- the stack. These line numbers are ordinarily displayed on the lefthand side
- of the window. The @kbd{d l} (@code{calc-line-numbering}) command controls
- whether these numbers appear. (Line numbers may be turned off since they
- slow the Calculator down a bit and also clutter the display.)
- @kindex o
- @pindex calc-realign
- The unshifted letter @kbd{o} (@code{calc-realign}) command repositions
- the cursor to its top-of-stack ``home'' position. It also undoes any
- horizontal scrolling in the window. If you give it a numeric prefix
- argument, it instead moves the cursor to the specified stack element.
- The @key{RET} (or equivalent @key{SPC}) key is only required to separate
- two consecutive numbers.
- (After all, if you typed @kbd{1 2} by themselves the Calculator
- would enter the number 12.) If you press @key{RET} or @key{SPC} @emph{not}
- right after typing a number, the key duplicates the number on the top of
- the stack. @kbd{@key{RET} *} is thus a handy way to square a number.@refill
- The @key{DEL} key pops and throws away the top number on the stack.
- The @key{TAB} key swaps the top two objects on the stack.
- @xref{Stack and Trail}, for descriptions of these and other stack-related
- commands.@refill
- @node Numeric Entry, Algebraic Entry, Stack Basics, Introduction
- @section Numeric Entry
- @noindent
- @kindex 0-9
- @kindex .
- @kindex e
- @cindex Numeric entry
- @cindex Entering numbers
- Pressing a digit or other numeric key begins numeric entry using the
- minibuffer. The number is pushed on the stack when you press the @key{RET}
- or @key{SPC} keys. If you press any other non-numeric key, the number is
- pushed onto the stack and the appropriate operation is performed. If
- you press a numeric key which is not valid, the key is ignored.
- @cindex Minus signs
- @cindex Negative numbers, entering
- @kindex _
- There are three different concepts corresponding to the word ``minus,''
- typified by @cite{a-b} (subtraction), @cite{-x}
- (change-sign), and @cite{-5} (negative number). Calc uses three
- different keys for these operations, respectively:
- @kbd{-}, @kbd{n}, and @kbd{_} (the underscore). The @kbd{-} key subtracts
- the two numbers on the top of the stack. The @kbd{n} key changes the sign
- of the number on the top of the stack or the number currently being entered.
- The @kbd{_} key begins entry of a negative number or changes the sign of
- the number currently being entered. The following sequences all enter the
- number @i{-5} onto the stack: @kbd{0 @key{RET} 5 -}, @kbd{5 n @key{RET}},
- @kbd{5 @key{RET} n}, @kbd{_ 5 @key{RET}}, @kbd{5 _ @key{RET}}.@refill
- Some other keys are active during numeric entry, such as @kbd{#} for
- non-decimal numbers, @kbd{:} for fractions, and @kbd{@@} for HMS forms.
- These notations are described later in this manual with the corresponding
- data types. @xref{Data Types}.
- During numeric entry, the only editing key available is @key{DEL}.
- @node Algebraic Entry, Quick Calculator, Numeric Entry, Introduction
- @section Algebraic Entry
- @noindent
- @kindex '
- @pindex calc-algebraic-entry
- @cindex Algebraic notation
- @cindex Formulas, entering
- Calculations can also be entered in algebraic form. This is accomplished
- by typing the apostrophe key, @kbd{'}, followed by the expression in
- standard format: @kbd{@key{'} 2+3*4 @key{RET}} computes
- @c{$2+(3\times4) = 14$}
- @cite{2+(3*4) = 14} and pushes that on the stack. If you wish you can
- ignore the RPN aspect of Calc altogether and simply enter algebraic
- expressions in this way. You may want to use @key{DEL} every so often to
- clear previous results off the stack.@refill
- You can press the apostrophe key during normal numeric entry to switch
- the half-entered number into algebraic entry mode. One reason to do this
- would be to use the full Emacs cursor motion and editing keys, which are
- available during algebraic entry but not during numeric entry.
- In the same vein, during either numeric or algebraic entry you can
- press @kbd{`} (backquote) to switch to @code{calc-edit} mode, where
- you complete your half-finished entry in a separate buffer.
- @xref{Editing Stack Entries}.
- @kindex m a
- @pindex calc-algebraic-mode
- @cindex Algebraic mode
- If you prefer algebraic entry, you can use the command @kbd{m a}
- (@code{calc-algebraic-mode}) to set Algebraic mode. In this mode,
- digits and other keys that would normally start numeric entry instead
- start full algebraic entry; as long as your formula begins with a digit
- you can omit the apostrophe. Open parentheses and square brackets also
- begin algebraic entry. You can still do RPN calculations in this mode,
- but you will have to press @key{RET} to terminate every number:
- @kbd{2 @key{RET} 3 @key{RET} * 4 @key{RET} +} would accomplish the same
- thing as @kbd{2*3+4 @key{RET}}.@refill
- @cindex Incomplete algebraic mode
- If you give a numeric prefix argument like @kbd{C-u} to the @kbd{m a}
- command, it enables Incomplete Algebraic mode; this is like regular
- Algebraic mode except that it applies to the @kbd{(} and @kbd{[} keys
- only. Numeric keys still begin a numeric entry in this mode.
- @kindex m t
- @pindex calc-total-algebraic-mode
- @cindex Total algebraic mode
- The @kbd{m t} (@code{calc-total-algebraic-mode}) gives you an even
- stronger algebraic-entry mode, in which @emph{all} regular letter and
- punctuation keys begin algebraic entry. Use this if you prefer typing
- @w{@kbd{sqrt( )}} instead of @kbd{Q}, @w{@kbd{factor( )}} instead of
- @kbd{a f}, and so on. To type regular Calc commands when you are in
- ``total'' algebraic mode, hold down the @key{META} key. Thus @kbd{M-q}
- is the command to quit Calc, @kbd{M-p} sets the precision, and
- @kbd{M-m t} (or @kbd{M-m M-t}, if you prefer) turns total algebraic
- mode back off again. Meta keys also terminate algebraic entry, so
- that @kbd{2+3 M-S} is equivalent to @kbd{2+3 @key{RET} M-S}. The symbol
- @samp{Alg*} will appear in the mode line whenever you are in this mode.
- Pressing @kbd{'} (the apostrophe) a second time re-enters the previous
- algebraic formula. You can then use the normal Emacs editing keys to
- modify this formula to your liking before pressing @key{RET}.
- @kindex $
- @cindex Formulas, referring to stack
- Within a formula entered from the keyboard, the symbol @kbd{$}
- represents the number on the top of the stack. If an entered formula
- contains any @kbd{$} characters, the Calculator replaces the top of
- stack with that formula rather than simply pushing the formula onto the
- stack. Thus, @kbd{' 1+2 @key{RET}} pushes 3 on the stack, and @kbd{$*2
- @key{RET}} replaces it with 6. Note that the @kbd{$} key always
- initiates algebraic entry; the @kbd{'} is unnecessary if @kbd{$} is the
- first character in the new formula.@refill
- Higher stack elements can be accessed from an entered formula with the
- symbols @kbd{$$}, @kbd{$$$}, and so on. The number of stack elements
- removed (to be replaced by the entered values) equals the number of dollar
- signs in the longest such symbol in the formula. For example, @samp{$$+$$$}
- adds the second and third stack elements, replacing the top three elements
- with the answer. (All information about the top stack element is thus lost
- since no single @samp{$} appears in this formula.)@refill
- A slightly different way to refer to stack elements is with a dollar
- sign followed by a number: @samp{$1}, @samp{$2}, and so on are much
- like @samp{$}, @samp{$$}, etc., except that stack entries referred
- to numerically are not replaced by the algebraic entry. That is, while
- @samp{$+1} replaces 5 on the stack with 6, @samp{$1+1} leaves the 5
- on the stack and pushes an additional 6.
- If a sequence of formulas are entered separated by commas, each formula
- is pushed onto the stack in turn. For example, @samp{1,2,3} pushes
- those three numbers onto the stack (leaving the 3 at the top), and
- @samp{$+1,$-1} replaces a 5 on the stack with 4 followed by 6. Also,
- @samp{$,$$} exchanges the top two elements of the stack, just like the
- @key{TAB} key.
- You can finish an algebraic entry with @kbd{M-=} or @kbd{M-@key{RET}} instead
- of @key{RET}. This uses @kbd{=} to evaluate the variables in each
- formula that goes onto the stack. (Thus @kbd{' pi @key{RET}} pushes
- the variable @samp{pi}, but @kbd{' pi M-@key{RET}} pushes 3.1415.)
- If you finish your algebraic entry by pressing @key{LFD} (or @kbd{C-j})
- instead of @key{RET}, Calc disables the default simplifications
- (as if by @kbd{m O}; @pxref{Simplification Modes}) while the entry
- is being pushed on the stack. Thus @kbd{' 1+2 @key{RET}} pushes 3
- on the stack, but @kbd{' 1+2 @key{LFD}} pushes the formula @cite{1+2};
- you might then press @kbd{=} when it is time to evaluate this formula.
- @node Quick Calculator, Prefix Arguments, Algebraic Entry, Introduction
- @section ``Quick Calculator'' Mode
- @noindent
- @kindex M-# q
- @pindex quick-calc
- @cindex Quick Calculator
- There is another way to invoke the Calculator if all you need to do
- is make one or two quick calculations. Type @kbd{M-# q} (or
- @kbd{M-x quick-calc}), then type any formula as an algebraic entry.
- The Calculator will compute the result and display it in the echo
- area, without ever actually putting up a Calc window.
- You can use the @kbd{$} character in a Quick Calculator formula to
- refer to the previous Quick Calculator result. Older results are
- not retained; the Quick Calculator has no effect on the full
- Calculator's stack or trail. If you compute a result and then
- forget what it was, just run @code{M-# q} again and enter
- @samp{$} as the formula.
- If this is the first time you have used the Calculator in this Emacs
- session, the @kbd{M-# q} command will create the @code{*Calculator*}
- buffer and perform all the usual initializations; it simply will
- refrain from putting that buffer up in a new window. The Quick
- Calculator refers to the @code{*Calculator*} buffer for all mode
- settings. Thus, for example, to set the precision that the Quick
- Calculator uses, simply run the full Calculator momentarily and use
- the regular @kbd{p} command.
- If you use @code{M-# q} from inside the Calculator buffer, the
- effect is the same as pressing the apostrophe key (algebraic entry).
- The result of a Quick calculation is placed in the Emacs ``kill ring''
- as well as being displayed. A subsequent @kbd{C-y} command will
- yank the result into the editing buffer. You can also use this
- to yank the result into the next @kbd{M-# q} input line as a more
- explicit alternative to @kbd{$} notation, or to yank the result
- into the Calculator stack after typing @kbd{M-# c}.
- If you finish your formula by typing @key{LFD} (or @kbd{C-j}) instead
- of @key{RET}, the result is inserted immediately into the current
- buffer rather than going into the kill ring.
- Quick Calculator results are actually evaluated as if by the @kbd{=}
- key (which replaces variable names by their stored values, if any).
- If the formula you enter is an assignment to a variable using the
- @samp{:=} operator, say, @samp{foo := 2 + 3} or @samp{foo := foo + 1},
- then the result of the evaluation is stored in that Calc variable.
- @xref{Store and Recall}.
- If the result is an integer and the current display radix is decimal,
- the number will also be displayed in hex and octal formats. If the
- integer is in the range from 1 to 126, it will also be displayed as
- an ASCII character.
- For example, the quoted character @samp{"x"} produces the vector
- result @samp{[120]} (because 120 is the ASCII code of the lower-case
- `x'; @pxref{Strings}). Since this is a vector, not an integer, it
- is displayed only according to the current mode settings. But
- running Quick Calc again and entering @samp{120} will produce the
- result @samp{120 (16#78, 8#170, x)} which shows the number in its
- decimal, hexadecimal, octal, and ASCII forms.
- Please note that the Quick Calculator is not any faster at loading
- or computing the answer than the full Calculator; the name ``quick''
- merely refers to the fact that it's much less hassle to use for
- small calculations.
- @node Prefix Arguments, Undo, Quick Calculator, Introduction
- @section Numeric Prefix Arguments
- @noindent
- Many Calculator commands use numeric prefix arguments. Some, such as
- @kbd{d s} (@code{calc-sci-notation}), set a parameter to the value of
- the prefix argument or use a default if you don't use a prefix.
- Others (like @kbd{d f} (@code{calc-fix-notation})) require an argument
- and prompt for a number if you don't give one as a prefix.@refill
- As a rule, stack-manipulation commands accept a numeric prefix argument
- which is interpreted as an index into the stack. A positive argument
- operates on the top @var{n} stack entries; a negative argument operates
- on the @var{n}th stack entry in isolation; and a zero argument operates
- on the entire stack.
- Most commands that perform computations (such as the arithmetic and
- scientific functions) accept a numeric prefix argument that allows the
- operation to be applied across many stack elements. For unary operations
- (that is, functions of one argument like absolute value or complex
- conjugate), a positive prefix argument applies that function to the top
- @var{n} stack entries simultaneously, and a negative argument applies it
- to the @var{n}th stack entry only. For binary operations (functions of
- two arguments like addition, GCD, and vector concatenation), a positive
- prefix argument ``reduces'' the function across the top @var{n}
- stack elements (for example, @kbd{C-u 5 +} sums the top 5 stack entries;
- @pxref{Reducing and Mapping}), and a negative argument maps the next-to-top
- @var{n} stack elements with the top stack element as a second argument
- (for example, @kbd{7 c-u -5 +} adds 7 to the top 5 stack elements).
- This feature is not available for operations which use the numeric prefix
- argument for some other purpose.
- Numeric prefixes are specified the same way as always in Emacs: Press
- a sequence of @key{META}-digits, or press @key{ESC} followed by digits,
- or press @kbd{C-u} followed by digits. Some commands treat plain
- @kbd{C-u} (without any actual digits) specially.@refill
- @kindex ~
- @pindex calc-num-prefix
- You can type @kbd{~} (@code{calc-num-prefix}) to pop an integer from the
- top of the stack and enter it as the numeric prefix for the next command.
- For example, @kbd{C-u 16 p} sets the precision to 16 digits; an alternate
- (silly) way to do this would be @kbd{2 @key{RET} 4 ^ ~ p}, i.e., compute 2
- to the fourth power and set the precision to that value.@refill
- Conversely, if you have typed a numeric prefix argument the @kbd{~} key
- pushes it onto the stack in the form of an integer.
- @node Undo, Error Messages, Prefix Arguments, Introduction
- @section Undoing Mistakes
- @noindent
- @kindex U
- @kindex C-_
- @pindex calc-undo
- @cindex Mistakes, undoing
- @cindex Undoing mistakes
- @cindex Errors, undoing
- The shift-@kbd{U} key (@code{calc-undo}) undoes the most recent operation.
- If that operation added or dropped objects from the stack, those objects
- are removed or restored. If it was a ``store'' operation, you are
- queried whether or not to restore the variable to its original value.
- The @kbd{U} key may be pressed any number of times to undo successively
- farther back in time; with a numeric prefix argument it undoes a
- specified number of operations. The undo history is cleared only by the
- @kbd{q} (@code{calc-quit}) command. (Recall that @kbd{M-# c} is
- synonymous with @code{calc-quit} while inside the Calculator; this
- also clears the undo history.)
- Currently the mode-setting commands (like @code{calc-precision}) are not
- undoable. You can undo past a point where you changed a mode, but you
- will need to reset the mode yourself.
- @kindex D
- @pindex calc-redo
- @cindex Redoing after an Undo
- The shift-@kbd{D} key (@code{calc-redo}) redoes an operation that was
- mistakenly undone. Pressing @kbd{U} with a negative prefix argument is
- equivalent to executing @code{calc-redo}. You can redo any number of
- times, up to the number of recent consecutive undo commands. Redo
- information is cleared whenever you give any command that adds new undo
- information, i.e., if you undo, then enter a number on the stack or make
- any other change, then it will be too late to redo.
- @kindex M-@key{RET}
- @pindex calc-last-args
- @cindex Last-arguments feature
- @cindex Arguments, restoring
- The @kbd{M-@key{RET}} key (@code{calc-last-args}) is like undo in that
- it restores the arguments of the most recent command onto the stack;
- however, it does not remove the result of that command. Given a numeric
- prefix argument, this command applies to the @cite{n}th most recent
- command which removed items from the stack; it pushes those items back
- onto the stack.
- The @kbd{K} (@code{calc-keep-args}) command provides a related function
- to @kbd{M-@key{RET}}. @xref{Stack and Trail}.
- It is also possible to recall previous results or inputs using the trail.
- @xref{Trail Commands}.
- The standard Emacs @kbd{C-_} undo key is recognized as a synonym for @kbd{U}.
- @node Error Messages, Multiple Calculators, Undo, Introduction
- @section Error Messages
- @noindent
- @kindex w
- @pindex calc-why
- @cindex Errors, messages
- @cindex Why did an error occur?
- Many situations that would produce an error message in other calculators
- simply create unsimplified formulas in the Emacs Calculator. For example,
- @kbd{1 @key{RET} 0 /} pushes the formula @cite{1 / 0}; @w{@kbd{0 L}} pushes
- the formula @samp{ln(0)}. Floating-point overflow and underflow are also
- reasons for this to happen.
- When a function call must be left in symbolic form, Calc usually
- produces a message explaining why. Messages that are probably
- surprising or indicative of user errors are displayed automatically.
- Other messages are simply kept in Calc's memory and are displayed only
- if you type @kbd{w} (@code{calc-why}). You can also press @kbd{w} if
- the same computation results in several messages. (The first message
- will end with @samp{[w=more]} in this case.)
- @kindex d w
- @pindex calc-auto-why
- The @kbd{d w} (@code{calc-auto-why}) command controls when error messages
- are displayed automatically. (Calc effectively presses @kbd{w} for you
- after your computation finishes.) By default, this occurs only for
- ``important'' messages. The other possible modes are to report
- @emph{all} messages automatically, or to report none automatically (so
- that you must always press @kbd{w} yourself to see the messages).
- @node Multiple Calculators, Troubleshooting Commands, Error Messages, Introduction
- @section Multiple Calculators
- @noindent
- @pindex another-calc
- It is possible to have any number of Calc Mode buffers at once.
- Usually this is done by executing @kbd{M-x another-calc}, which
- is similar to @kbd{M-# c} except that if a @samp{*Calculator*}
- buffer already exists, a new, independent one with a name of the
- form @samp{*Calculator*<@var{n}>} is created. You can also use the
- command @code{calc-mode} to put any buffer into Calculator mode, but
- this would ordinarily never be done.
- The @kbd{q} (@code{calc-quit}) command does not destroy a Calculator buffer;
- it only closes its window. Use @kbd{M-x kill-buffer} to destroy a
- Calculator buffer.
- Each Calculator buffer keeps its own stack, undo list, and mode settings
- such as precision, angular mode, and display formats. In Emacs terms,
- variables such as @code{calc-stack} are buffer-local variables. The
- global default values of these variables are used only when a new
- Calculator buffer is created. The @code{calc-quit} command saves
- the stack and mode settings of the buffer being quit as the new defaults.
- There is only one trail buffer, @samp{*Calc Trail*}, used by all
- Calculator buffers.
- @node Troubleshooting Commands, , Multiple Calculators, Introduction
- @section Troubleshooting Commands
- @noindent
- This section describes commands you can use in case a computation
- incorrectly fails or gives the wrong answer.
- @xref{Reporting Bugs}, if you find a problem that appears to be due
- to a bug or deficiency in Calc.
- @menu
- * Autoloading Problems::
- * Recursion Depth::
- * Caches::
- * Debugging Calc::
- @end menu
- @node Autoloading Problems, Recursion Depth, Troubleshooting Commands, Troubleshooting Commands
- @subsection Autoloading Problems
- @noindent
- The Calc program is split into many component files; components are
- loaded automatically as you use various commands that require them.
- Occasionally Calc may lose track of when a certain component is
- necessary; typically this means you will type a command and it won't
- work because some function you've never heard of was undefined.
- @kindex M-# L
- @pindex calc-load-everything
- If this happens, the easiest workaround is to type @kbd{M-# L}
- (@code{calc-load-everything}) to force all the parts of Calc to be
- loaded right away. This will cause Emacs to take up a lot more
- memory than it would otherwise, but it's guaranteed to fix the problem.
- If you seem to run into this problem no matter what you do, or if
- even the @kbd{M-# L} command crashes, Calc may have been improperly
- installed. @xref{Installation}, for details of the installation
- process.
- @node Recursion Depth, Caches, Autoloading Problems, Troubleshooting Commands
- @subsection Recursion Depth
- @noindent
- @kindex M
- @kindex I M
- @pindex calc-more-recursion-depth
- @pindex calc-less-recursion-depth
- @cindex Recursion depth
- @cindex ``Computation got stuck'' message
- @cindex @code{max-lisp-eval-depth}
- @cindex @code{max-specpdl-size}
- Calc uses recursion in many of its calculations. Emacs Lisp keeps a
- variable @code{max-lisp-eval-depth} which limits the amount of recursion
- possible in an attempt to recover from program bugs. If a calculation
- ever halts incorrectly with the message ``Computation got stuck or
- ran too long,'' use the @kbd{M} command (@code{calc-more-recursion-depth})
- to increase this limit. (Of course, this will not help if the
- calculation really did get stuck due to some problem inside Calc.)@refill
- The limit is always increased (multiplied) by a factor of two. There
- is also an @kbd{I M} (@code{calc-less-recursion-depth}) command which
- decreases this limit by a factor of two, down to a minimum value of 200.
- The default value is 1000.
- These commands also double or halve @code{max-specpdl-size}, another
- internal Lisp recursion limit. The minimum value for this limit is 600.
- @node Caches, Debugging Calc, Recursion Depth, Troubleshooting Commands
- @subsection Caches
- @noindent
- @cindex Caches
- @cindex Flushing caches
- Calc saves certain values after they have been computed once. For
- example, the @kbd{P} (@code{calc-pi}) command initially ``knows'' the
- constant @c{$\pi$}
- @cite{pi} to about 20 decimal places; if the current precision
- is greater than this, it will recompute @c{$\pi$}
- @cite{pi} using a series
- approximation. This value will not need to be recomputed ever again
- unless you raise the precision still further. Many operations such as
- logarithms and sines make use of similarly cached values such as
- @c{$\pi \over 4$}
- @cite{pi/4} and @c{$\ln 2$}
- @cite{ln(2)}. The visible effect of caching is that
- high-precision computations may seem to do extra work the first time.
- Other things cached include powers of two (for the binary arithmetic
- functions), matrix inverses and determinants, symbolic integrals, and
- data points computed by the graphing commands.
- @pindex calc-flush-caches
- If you suspect a Calculator cache has become corrupt, you can use the
- @code{calc-flush-caches} command to reset all caches to the empty state.
- (This should only be necessary in the event of bugs in the Calculator.)
- The @kbd{M-# 0} (with the zero key) command also resets caches along
- with all other aspects of the Calculator's state.
- @node Debugging Calc, , Caches, Troubleshooting Commands
- @subsection Debugging Calc
- @noindent
- A few commands exist to help in the debugging of Calc commands.
- @xref{Programming}, to see the various ways that you can write
- your own Calc commands.
- @kindex Z T
- @pindex calc-timing
- The @kbd{Z T} (@code{calc-timing}) command turns on and off a mode
- in which the timing of slow commands is reported in the Trail.
- Any Calc command that takes two seconds or longer writes a line
- to the Trail showing how many seconds it took. This value is
- accurate only to within one second.
- All steps of executing a command are included; in particular, time
- taken to format the result for display in the stack and trail is
- counted. Some prompts also count time taken waiting for them to
- be answered, while others do not; this depends on the exact
- implementation of the command. For best results, if you are timing
- a sequence that includes prompts or multiple commands, define a
- keyboard macro to run the whole sequence at once. Calc's @kbd{X}
- command (@pxref{Keyboard Macros}) will then report the time taken
- to execute the whole macro.
- Another advantage of the @kbd{X} command is that while it is
- executing, the stack and trail are not updated from step to step.
- So if you expect the output of your test sequence to leave a result
- that may take a long time to format and you don't wish to count
- this formatting time, end your sequence with a @key{DEL} keystroke
- to clear the result from the stack. When you run the sequence with
- @kbd{X}, Calc will never bother to format the large result.
- Another thing @kbd{Z T} does is to increase the Emacs variable
- @code{gc-cons-threshold} to a much higher value (two million; the
- usual default in Calc is 250,000) for the duration of each command.
- This generally prevents garbage collection during the timing of
- the command, though it may cause your Emacs process to grow
- abnormally large. (Garbage collection time is a major unpredictable
- factor in the timing of Emacs operations.)
- Another command that is useful when debugging your own Lisp
- extensions to Calc is @kbd{M-x calc-pass-errors}, which disables
- the error handler that changes the ``@code{max-lisp-eval-depth}
- exceeded'' message to the much more friendly ``Computation got
- stuck or ran too long.'' This handler interferes with the Emacs
- Lisp debugger's @code{debug-on-error} mode. Errors are reported
- in the handler itself rather than at the true location of the
- error. After you have executed @code{calc-pass-errors}, Lisp
- errors will be reported correctly but the user-friendly message
- will be lost.
- @node Data Types, Stack and Trail, Introduction, Top
- @chapter Data Types
- @noindent
- This chapter discusses the various types of objects that can be placed
- on the Calculator stack, how they are displayed, and how they are
- entered. (@xref{Data Type Formats}, for information on how these data
- types are represented as underlying Lisp objects.)@refill
- Integers, fractions, and floats are various ways of describing real
- numbers. HMS forms also for many purposes act as real numbers. These
- types can be combined to form complex numbers, modulo forms, error forms,
- or interval forms. (But these last four types cannot be combined
- arbitrarily:@: error forms may not contain modulo forms, for example.)
- Finally, all these types of numbers may be combined into vectors,
- matrices, or algebraic formulas.
- @menu
- * Integers:: The most basic data type.
- * Fractions:: This and above are called @dfn{rationals}.
- * Floats:: This and above are called @dfn{reals}.
- * Complex Numbers:: This and above are called @dfn{numbers}.
- * Infinities::
- * Vectors and Matrices::
- * Strings::
- * HMS Forms::
- * Date Forms::
- * Modulo Forms::
- * Error Forms::
- * Interval Forms::
- * Incomplete Objects::
- * Variables::
- * Formulas::
- @end menu
- @node Integers, Fractions, Data Types, Data Types
- @section Integers
- @noindent
- @cindex Integers
- The Calculator stores integers to arbitrary precision. Addition,
- subtraction, and multiplication of integers always yields an exact
- integer result. (If the result of a division or exponentiation of
- integers is not an integer, it is expressed in fractional or
- floating-point form according to the current Fraction Mode.
- @xref{Fraction Mode}.)
- A decimal integer is represented as an optional sign followed by a
- sequence of digits. Grouping (@pxref{Grouping Digits}) can be used to
- insert a comma at every third digit for display purposes, but you
- must not type commas during the entry of numbers.@refill
- @kindex #
- A non-decimal integer is represented as an optional sign, a radix
- between 2 and 36, a @samp{#} symbol, and one or more digits. For radix 11
- and above, the letters A through Z (upper- or lower-case) count as
- digits and do not terminate numeric entry mode. @xref{Radix Modes}, for how
- to set the default radix for display of integers. Numbers of any radix
- may be entered at any time. If you press @kbd{#} at the beginning of a
- number, the current display radix is used.@refill
- @node Fractions, Floats, Integers, Data Types
- @section Fractions
- @noindent
- @cindex Fractions
- A @dfn{fraction} is a ratio of two integers. Fractions are traditionally
- written ``2/3'' but Calc uses the notation @samp{2:3}. (The @kbd{/} key
- performs RPN division; the following two sequences push the number
- @samp{2:3} on the stack: @kbd{2 :@: 3 @key{RET}}, or @kbd{2 @key{RET} 3 /}
- assuming Fraction Mode has been enabled.)
- When the Calculator produces a fractional result it always reduces it to
- simplest form, which may in fact be an integer.@refill
- Fractions may also be entered in a three-part form, where @samp{2:3:4}
- represents two-and-three-quarters. @xref{Fraction Formats}, for fraction
- display formats.@refill
- Non-decimal fractions are entered and displayed as
- @samp{@var{radix}#@var{num}:@var{denom}} (or in the analogous three-part
- form). The numerator and denominator always use the same radix.@refill
- @node Floats, Complex Numbers, Fractions, Data Types
- @section Floats
- @noindent
- @cindex Floating-point numbers
- A floating-point number or @dfn{float} is a number stored in scientific
- notation. The number of significant digits in the fractional part is
- governed by the current floating precision (@pxref{Precision}). The
- range of acceptable values is from @c{$10^{-3999999}$}
- @cite{10^-3999999} (inclusive)
- to @c{$10^{4000000}$}
- @cite{10^4000000}
- (exclusive), plus the corresponding negative
- values and zero.
- Calculations that would exceed the allowable range of values (such
- as @samp{exp(exp(20))}) are left in symbolic form by Calc. The
- messages ``floating-point overflow'' or ``floating-point underflow''
- indicate that during the calculation a number would have been produced
- that was too large or too close to zero, respectively, to be represented
- by Calc. This does not necessarily mean the final result would have
- overflowed, just that an overflow occurred while computing the result.
- (In fact, it could report an underflow even though the final result
- would have overflowed!)
- If a rational number and a float are mixed in a calculation, the result
- will in general be expressed as a float. Commands that require an integer
- value (such as @kbd{k g} [@code{gcd}]) will also accept integer-valued
- floats, i.e., floating-point numbers with nothing after the decimal point.
- Floats are identified by the presence of a decimal point and/or an
- exponent. In general a float consists of an optional sign, digits
- including an optional decimal point, and an optional exponent consisting
- of an @samp{e}, an optional sign, and up to seven exponent digits.
- For example, @samp{23.5e-2} is 23.5 times ten to the minus-second power,
- or 0.235.
- Floating-point numbers are normally displayed in decimal notation with
- all significant figures shown. Exceedingly large or small numbers are
- displayed in scientific notation. Various other display options are
- available. @xref{Float Formats}.
- @cindex Accuracy of calculations
- Floating-point numbers are stored in decimal, not binary. The result
- of each operation is rounded to the nearest value representable in the
- number of significant digits specified by the current precision,
- rounding away from zero in the case of a tie. Thus (in the default
- display mode) what you see is exactly what you get. Some operations such
- as square roots and transcendental functions are performed with several
- digits of extra precision and then rounded down, in an effort to make the
- final result accurate to the full requested precision. However,
- accuracy is not rigorously guaranteed. If you suspect the validity of a
- result, try doing the same calculation in a higher precision. The
- Calculator's arithmetic is not intended to be IEEE-conformant in any
- way.@refill
- While floats are always @emph{stored} in decimal, they can be entered
- and displayed in any radix just like integers and fractions. The
- notation @samp{@var{radix}#@var{ddd}.@var{ddd}} is a floating-point
- number whose digits are in the specified radix. Note that the @samp{.}
- is more aptly referred to as a ``radix point'' than as a decimal
- point in this case. The number @samp{8#123.4567} is defined as
- @samp{8#1234567 * 8^-4}. If the radix is 14 or less, you can use
- @samp{e} notation to write a non-decimal number in scientific notation.
- The exponent is written in decimal, and is considered to be a power
- of the radix: @samp{8#1234567e-4}. If the radix is 15 or above, the
- letter @samp{e} is a digit, so scientific notation must be written
- out, e.g., @samp{16#123.4567*16^2}. The first two exercises of the
- Modes Tutorial explore some of the properties of non-decimal floats.
- @node Complex Numbers, Infinities, Floats, Data Types
- @section Complex Numbers
- @noindent
- @cindex Complex numbers
- There are two supported formats for complex numbers: rectangular and
- polar. The default format is rectangular, displayed in the form
- @samp{(@var{real},@var{imag})} where @var{real} is the real part and
- @var{imag} is the imaginary part, each of which may be any real number.
- Rectangular complex numbers can also be displayed in @samp{@var{a}+@var{b}i}
- notation; @pxref{Complex Formats}.@refill
- Polar complex numbers are displayed in the form `@t{(}@var{r}@t{;}@c{$\theta$}
- @var{theta}@t{)}'
- where @var{r} is the nonnegative magnitude and @c{$\theta$}
- @var{theta} is the argument
- or phase angle. The range of @c{$\theta$}
- @var{theta} depends on the current angular
- mode (@pxref{Angular Modes}); it is generally between @i{-180} and
- @i{+180} degrees or the equivalent range in radians.@refill
- Complex numbers are entered in stages using incomplete objects.
- @xref{Incomplete Objects}.
- Operations on rectangular complex numbers yield rectangular complex
- results, and similarly for polar complex numbers. Where the two types
- are mixed, or where new complex numbers arise (as for the square root of
- a negative real), the current @dfn{Polar Mode} is used to determine the
- type. @xref{Polar Mode}.
- A complex result in which the imaginary part is zero (or the phase angle
- is 0 or 180 degrees or @c{$\pi$}
- @cite{pi} radians) is automatically converted to a real
- number.
- @node Infinities, Vectors and Matrices, Complex Numbers, Data Types
- @section Infinities
- @noindent
- @cindex Infinity
- @cindex @code{inf} variable
- @cindex @code{uinf} variable
- @cindex @code{nan} variable
- @vindex inf
- @vindex uinf
- @vindex nan
- The word @code{inf} represents the mathematical concept of @dfn{infinity}.
- Calc actually has three slightly different infinity-like values:
- @code{inf}, @code{uinf}, and @code{nan}. These are just regular
- variable names (@pxref{Variables}); you should avoid using these
- names for your own variables because Calc gives them special
- treatment. Infinities, like all variable names, are normally
- entered using algebraic entry.
- Mathematically speaking, it is not rigorously correct to treat
- ``infinity'' as if it were a number, but mathematicians often do
- so informally. When they say that @samp{1 / inf = 0}, what they
- really mean is that @cite{1 / x}, as @cite{x} becomes larger and
- larger, becomes arbitrarily close to zero. So you can imagine
- that if @cite{x} got ``all the way to infinity,'' then @cite{1 / x}
- would go all the way to zero. Similarly, when they say that
- @samp{exp(inf) = inf}, they mean that @c{$e^x$}
- @cite{exp(x)} grows without
- bound as @cite{x} grows. The symbol @samp{-inf} likewise stands
- for an infinitely negative real value; for example, we say that
- @samp{exp(-inf) = 0}. You can have an infinity pointing in any
- direction on the complex plane: @samp{sqrt(-inf) = i inf}.
- The same concept of limits can be used to define @cite{1 / 0}. We
- really want the value that @cite{1 / x} approaches as @cite{x}
- approaches zero. But if all we have is @cite{1 / 0}, we can't
- tell which direction @cite{x} was coming from. If @cite{x} was
- positive and decreasing toward zero, then we should say that
- @samp{1 / 0 = inf}. But if @cite{x} was negative and increasing
- toward zero, the answer is @samp{1 / 0 = -inf}. In fact, @cite{x}
- could be an imaginary number, giving the answer @samp{i inf} or
- @samp{-i inf}. Calc uses the special symbol @samp{uinf} to mean
- @dfn{undirected infinity}, i.e., a value which is infinitely
- large but with an unknown sign (or direction on the complex plane).
- Calc actually has three modes that say how infinities are handled.
- Normally, infinities never arise from calculations that didn't
- already have them. Thus, @cite{1 / 0} is treated simply as an
- error and left unevaluated. The @kbd{m i} (@code{calc-infinite-mode})
- command (@pxref{Infinite Mode}) enables a mode in which
- @cite{1 / 0} evaluates to @code{uinf} instead. There is also
- an alternative type of infinite mode which says to treat zeros
- as if they were positive, so that @samp{1 / 0 = inf}. While this
- is less mathematically correct, it may be the answer you want in
- some cases.
- Since all infinities are ``as large'' as all others, Calc simplifies,
- e.g., @samp{5 inf} to @samp{inf}. Another example is
- @samp{5 - inf = -inf}, where the @samp{-inf} is so large that
- adding a finite number like five to it does not affect it.
- Note that @samp{a - inf} also results in @samp{-inf}; Calc assumes
- that variables like @code{a} always stand for finite quantities.
- Just to show that infinities really are all the same size,
- note that @samp{sqrt(inf) = inf^2 = exp(inf) = inf} in Calc's
- notation.
- It's not so easy to define certain formulas like @samp{0 * inf} and
- @samp{inf / inf}. Depending on where these zeros and infinities
- came from, the answer could be literally anything. The latter
- formula could be the limit of @cite{x / x} (giving a result of one),
- or @cite{2 x / x} (giving two), or @cite{x^2 / x} (giving @code{inf}),
- or @cite{x / x^2} (giving zero). Calc uses the symbol @code{nan}
- to represent such an @dfn{indeterminate} value. (The name ``nan''
- comes from analogy with the ``NAN'' concept of IEEE standard
- arithmetic; it stands for ``Not A Number.'' This is somewhat of a
- misnomer, since @code{nan} @emph{does} stand for some number or
- infinity, it's just that @emph{which} number it stands for
- cannot be determined.) In Calc's notation, @samp{0 * inf = nan}
- and @samp{inf / inf = nan}. A few other common indeterminate
- expressions are @samp{inf - inf} and @samp{inf ^ 0}. Also,
- @samp{0 / 0 = nan} if you have turned on ``infinite mode''
- (as described above).
- Infinities are especially useful as parts of @dfn{intervals}.
- @xref{Interval Forms}.
- @node Vectors and Matrices, Strings, Infinities, Data Types
- @section Vectors and Matrices
- @noindent
- @cindex Vectors
- @cindex Plain vectors
- @cindex Matrices
- The @dfn{vector} data type is flexible and general. A vector is simply a
- list of zero or more data objects. When these objects are numbers, the
- whole is a vector in the mathematical sense. When these objects are
- themselves vectors of equal (nonzero) length, the whole is a @dfn{matrix}.
- A vector which is not a matrix is referred to here as a @dfn{plain vector}.
- A vector is displayed as a list of values separated by commas and enclosed
- in square brackets: @samp{[1, 2, 3]}. Thus the following is a 2 row by
- 3 column matrix: @samp{[[1, 2, 3], [4, 5, 6]]}. Vectors, like complex
- numbers, are entered as incomplete objects. @xref{Incomplete Objects}.
- During algebraic entry, vectors are entered all at once in the usual
- brackets-and-commas form. Matrices may be entered algebraically as nested
- vectors, or using the shortcut notation @w{@samp{[1, 2, 3; 4, 5, 6]}},
- with rows separated by semicolons. The commas may usually be omitted
- when entering vectors: @samp{[1 2 3]}. Curly braces may be used in
- place of brackets: @samp{@{1, 2, 3@}}, but the commas are required in
- this case.
- Traditional vector and matrix arithmetic is also supported;
- @pxref{Basic Arithmetic} and @pxref{Matrix Functions}.
- Many other operations are applied to vectors element-wise. For example,
- the complex conjugate of a vector is a vector of the complex conjugates
- of its elements.@refill
- @ignore
- @starindex
- @end ignore
- @tindex vec
- Algebraic functions for building vectors include @samp{vec(a, b, c)}
- to build @samp{[a, b, c]}, @samp{cvec(a, n, m)} to build an @c{$n\times m$}
- @asis{@var{n}x@var{m}}
- matrix of @samp{a}s, and @samp{index(n)} to build a vector of integers
- from 1 to @samp{n}.
- @node Strings, HMS Forms, Vectors and Matrices, Data Types
- @section Strings
- @noindent
- @kindex "
- @cindex Strings
- @cindex Character strings
- Character strings are not a special data type in the Calculator.
- Rather, a string is represented simply as a vector all of whose
- elements are integers in the range 0 to 255 (ASCII codes). You can
- enter a string at any time by pressing the @kbd{"} key. Quotation
- marks and backslashes are written @samp{\"} and @samp{\\}, respectively,
- inside strings. Other notations introduced by backslashes are:
- @example
- @group
- \a 7 \^@@ 0
- \b 8 \^a-z 1-26
- \e 27 \^[ 27
- \f 12 \^\\ 28
- \n 10 \^] 29
- \r 13 \^^ 30
- \t 9 \^_ 31
- \^? 127
- @end group
- @end example
- @noindent
- Finally, a backslash followed by three octal digits produces any
- character from its ASCII code.
- @kindex d "
- @pindex calc-display-strings
- Strings are normally displayed in vector-of-integers form. The
- @w{@kbd{d "}} (@code{calc-display-strings}) command toggles a mode in
- which any vectors of small integers are displayed as quoted strings
- instead.
- The backslash notations shown above are also used for displaying
- strings. Characters 128 and above are not translated by Calc; unless
- you have an Emacs modified for 8-bit fonts, these will show up in
- backslash-octal-digits notation. For characters below 32, and
- for character 127, Calc uses the backslash-letter combination if
- there is one, or otherwise uses a @samp{\^} sequence.
- The only Calc feature that uses strings is @dfn{compositions};
- @pxref{Compositions}. Strings also provide a convenient
- way to do conversions between ASCII characters and integers.
- @ignore
- @starindex
- @end ignore
- @tindex string
- There is a @code{string} function which provides a different display
- format for strings. Basically, @samp{string(@var{s})}, where @var{s}
- is a vector of integers in the proper range, is displayed as the
- corresponding string of characters with no surrounding quotation
- marks or other modifications. Thus @samp{string("ABC")} (or
- @samp{string([65 66 67])}) will look like @samp{ABC} on the stack.
- This happens regardless of whether @w{@kbd{d "}} has been used. The
- only way to turn it off is to use @kbd{d U} (unformatted language
- mode) which will display @samp{string("ABC")} instead.
- Control characters are displayed somewhat differently by @code{string}.
- Characters below 32, and character 127, are shown using @samp{^} notation
- (same as shown above, but without the backslash). The quote and
- backslash characters are left alone, as are characters 128 and above.
- @ignore
- @starindex
- @end ignore
- @tindex bstring
- The @code{bstring} function is just like @code{string} except that
- the resulting string is breakable across multiple lines if it doesn't
- fit all on one line. Potential break points occur at every space
- character in the string.
- @node HMS Forms, Date Forms, Strings, Data Types
- @section HMS Forms
- @noindent
- @cindex Hours-minutes-seconds forms
- @cindex Degrees-minutes-seconds forms
- @dfn{HMS} stands for Hours-Minutes-Seconds; when used as an angular
- argument, the interpretation is Degrees-Minutes-Seconds. All functions
- that operate on angles accept HMS forms. These are interpreted as
- degrees regardless of the current angular mode. It is also possible to
- use HMS as the angular mode so that calculated angles are expressed in
- degrees, minutes, and seconds.
- @kindex @@
- @ignore
- @mindex @null
- @end ignore
- @kindex ' (HMS forms)
- @ignore
- @mindex @null
- @end ignore
- @kindex " (HMS forms)
- @ignore
- @mindex @null
- @end ignore
- @kindex h (HMS forms)
- @ignore
- @mindex @null
- @end ignore
- @kindex o (HMS forms)
- @ignore
- @mindex @null
- @end ignore
- @kindex m (HMS forms)
- @ignore
- @mindex @null
- @end ignore
- @kindex s (HMS forms)
- The default format for HMS values is
- @samp{@var{hours}@@ @var{mins}' @var{secs}"}. During entry, the letters
- @samp{h} (for ``hours'') or
- @samp{o} (approximating the ``degrees'' symbol) are accepted as well as
- @samp{@@}, @samp{m} is accepted in place of @samp{'}, and @samp{s} is
- accepted in place of @samp{"}.
- The @var{hours} value is an integer (or integer-valued float).
- The @var{mins} value is an integer or integer-valued float between 0 and 59.
- The @var{secs} value is a real number between 0 (inclusive) and 60
- (exclusive). A positive HMS form is interpreted as @var{hours} +
- @var{mins}/60 + @var{secs}/3600. A negative HMS form is interpreted
- as @i{- @var{hours}} @i{-} @var{mins}/60 @i{-} @var{secs}/3600.
- Display format for HMS forms is quite flexible. @xref{HMS Formats}.@refill
- HMS forms can be added and subtracted. When they are added to numbers,
- the numbers are interpreted according to the current angular mode. HMS
- forms can also be multiplied and divided by real numbers. Dividing
- two HMS forms produces a real-valued ratio of the two angles.
- @pindex calc-time
- @cindex Time of day
- Just for kicks, @kbd{M-x calc-time} pushes the current time of day on
- the stack as an HMS form.
- @node Date Forms, Modulo Forms, HMS Forms, Data Types
- @section Date Forms
- @noindent
- @cindex Date forms
- A @dfn{date form} represents a date and possibly an associated time.
- Simple date arithmetic is supported: Adding a number to a date
- produces a new date shifted by that many days; adding an HMS form to
- a date shifts it by that many hours. Subtracting two date forms
- computes the number of days between them (represented as a simple
- number). Many other operations, such as multiplying two date forms,
- are nonsensical and are not allowed by Calc.
- Date forms are entered and displayed enclosed in @samp{< >} brackets.
- The default format is, e.g., @samp{<Wed Jan 9, 1991>} for dates,
- or @samp{<3:32:20pm Wed Jan 9, 1991>} for dates with times.
- Input is flexible; date forms can be entered in any of the usual
- notations for dates and times. @xref{Date Formats}.
- Date forms are stored internally as numbers, specifically the number
- of days since midnight on the morning of January 1 of the year 1 AD.
- If the internal number is an integer, the form represents a date only;
- if the internal number is a fraction or float, the form represents
- a date and time. For example, @samp{<6:00am Wed Jan 9, 1991>}
- is represented by the number 726842.25. The standard precision of
- 12 decimal digits is enough to ensure that a (reasonable) date and
- time can be stored without roundoff error.
- If the current precision is greater than 12, date forms will keep
- additional digits in the seconds position. For example, if the
- precision is 15, the seconds will keep three digits after the
- decimal point. Decreasing the precision below 12 may cause the
- time part of a date form to become inaccurate. This can also happen
- if astronomically high years are used, though this will not be an
- issue in everyday (or even everymillenium) use. Note that date
- forms without times are stored as exact integers, so roundoff is
- never an issue for them.
- You can use the @kbd{v p} (@code{calc-pack}) and @kbd{v u}
- (@code{calc-unpack}) commands to get at the numerical representation
- of a date form. @xref{Packing and Unpacking}.
- Date forms can go arbitrarily far into the future or past. Negative
- year numbers represent years BC. Calc uses a combination of the
- Gregorian and Julian calendars, following the history of Great
- Britain and the British colonies. This is the same calendar that
- is used by the @code{cal} program in most Unix implementations.
- @cindex Julian calendar
- @cindex Gregorian calendar
- Some historical background: The Julian calendar was created by
- Julius Caesar in the year 46 BC as an attempt to fix the gradual
- drift caused by the lack of leap years in the calendar used
- until that time. The Julian calendar introduced an extra day in
- all years divisible by four. After some initial confusion, the
- calendar was adopted around the year we call 8 AD. Some centuries
- later it became apparent that the Julian year of 365.25 days was
- itself not quite right. In 1582 Pope Gregory XIII introduced the
- Gregorian calendar, which added the new rule that years divisible
- by 100, but not by 400, were not to be considered leap years
- despite being divisible by four. Many countries delayed adoption
- of the Gregorian calendar because of religious differences;
- in Britain it was put off until the year 1752, by which time
- the Julian calendar had fallen eleven days behind the true
- seasons. So the switch to the Gregorian calendar in early
- September 1752 introduced a discontinuity: The day after
- Sep 2, 1752 is Sep 14, 1752. Calc follows this convention.
- To take another example, Russia waited until 1918 before
- adopting the new calendar, and thus needed to remove thirteen
- days (between Feb 1, 1918 and Feb 14, 1918). This means that
- Calc's reckoning will be inconsistent with Russian history between
- 1752 and 1918, and similarly for various other countries.
- Today's timekeepers introduce an occasional ``leap second'' as
- well, but Calc does not take these minor effects into account.
- (If it did, it would have to report a non-integer number of days
- between, say, @samp{<12:00am Mon Jan 1, 1900>} and
- @samp{<12:00am Sat Jan 1, 2000>}.)
- Calc uses the Julian calendar for all dates before the year 1752,
- including dates BC when the Julian calendar technically had not
- yet been invented. Thus the claim that day number @i{-10000} is
- called ``August 16, 28 BC'' should be taken with a grain of salt.
- Please note that there is no ``year 0''; the day before
- @samp{<Sat Jan 1, +1>} is @samp{<Fri Dec 31, -1>}. These are
- days 0 and @i{-1} respectively in Calc's internal numbering scheme.
- @cindex Julian day counting
- Another day counting system in common use is, confusingly, also
- called ``Julian.'' It was invented in 1583 by Joseph Justus
- Scaliger, who named it in honor of his father Julius Caesar
- Scaliger. For obscure reasons he chose to start his day
- numbering on Jan 1, 4713 BC at noon, which in Calc's scheme
- is @i{-1721423.5} (recall that Calc starts at midnight instead
- of noon). Thus to convert a Calc date code obtained by
- unpacking a date form into a Julian day number, simply add
- 1721423.5. The Julian code for @samp{6:00am Jan 9, 1991}
- is 2448265.75. The built-in @kbd{t J} command performs
- this conversion for you.
- @cindex Unix time format
- The Unix operating system measures time as an integer number of
- seconds since midnight, Jan 1, 1970. To convert a Calc date
- value into a Unix time stamp, first subtract 719164 (the code
- for @samp{<Jan 1, 1970>}), then multiply by 86400 (the number of
- seconds in a day) and press @kbd{R} to round to the nearest
- integer. If you have a date form, you can simply subtract the
- day @samp{<Jan 1, 1970>} instead of unpacking and subtracting
- 719164. Likewise, divide by 86400 and add @samp{<Jan 1, 1970>}
- to convert from Unix time to a Calc date form. (Note that
- Unix normally maintains the time in the GMT time zone; you may
- need to subtract five hours to get New York time, or eight hours
- for California time. The same is usually true of Julian day
- counts.) The built-in @kbd{t U} command performs these
- conversions.
- @node Modulo Forms, Error Forms, Date Forms, Data Types
- @section Modulo Forms
- @noindent
- @cindex Modulo forms
- A @dfn{modulo form} is a real number which is taken modulo (i.e., within
- an integer multiple of) some value @var{M}. Arithmetic modulo @var{M}
- often arises in number theory. Modulo forms are written
- `@var{a} @t{mod} @var{M}',
- where @var{a} and @var{M} are real numbers or HMS forms, and
- @c{$0 \le a < M$}
- @cite{0 <= a < @var{M}}.
- In many applications @cite{a} and @cite{M} will be
- integers but this is not required.@refill
- Modulo forms are not to be confused with the modulo operator @samp{%}.
- The expression @samp{27 % 10} means to compute 27 modulo 10 to produce
- the result 7. Further computations treat this 7 as just a regular integer.
- The expression @samp{27 mod 10} produces the result @samp{7 mod 10};
- further computations with this value are again reduced modulo 10 so that
- the result always lies in the desired range.
- When two modulo forms with identical @cite{M}'s are added or multiplied,
- the Calculator simply adds or multiplies the values, then reduces modulo
- @cite{M}. If one argument is a modulo form and the other a plain number,
- the plain number is treated like a compatible modulo form. It is also
- possible to raise modulo forms to powers; the result is the value raised
- to the power, then reduced modulo @cite{M}. (When all values involved
- are integers, this calculation is done much more efficiently than
- actually computing the power and then reducing.)
- @cindex Modulo division
- Two modulo forms `@var{a} @t{mod} @var{M}' and `@var{b} @t{mod} @var{M}'
- can be divided if @cite{a}, @cite{b}, and @cite{M} are all
- integers. The result is the modulo form which, when multiplied by
- `@var{b} @t{mod} @var{M}', produces `@var{a} @t{mod} @var{M}'. If
- there is no solution to this equation (which can happen only when
- @cite{M} is non-prime), or if any of the arguments are non-integers, the
- division is left in symbolic form. Other operations, such as square
- roots, are not yet supported for modulo forms. (Note that, although
- @w{`@t{(}@var{a} @t{mod} @var{M}@t{)^.5}'} will compute a ``modulo square root''
- in the sense of reducing @c{$\sqrt a$}
- @cite{sqrt(a)} modulo @cite{M}, this is not a
- useful definition from the number-theoretical point of view.)@refill
- @ignore
- @mindex M
- @end ignore
- @kindex M (modulo forms)
- @ignore
- @mindex mod
- @end ignore
- @tindex mod (operator)
- To create a modulo form during numeric entry, press the shift-@kbd{M}
- key to enter the word @samp{mod}. As a special convenience, pressing
- shift-@kbd{M} a second time automatically enters the value of @cite{M}
- that was most recently used before. During algebraic entry, either
- type @samp{mod} by hand or press @kbd{M-m} (that's @kbd{@key{META}-m}).
- Once again, pressing this a second time enters the current modulo.@refill
- You can also use @kbd{v p} and @kbd{%} to modify modulo forms.
- @xref{Building Vectors}. @xref{Basic Arithmetic}.
- It is possible to mix HMS forms and modulo forms. For example, an
- HMS form modulo 24 could be used to manipulate clock times; an HMS
- form modulo 360 would be suitable for angles. Making the modulo @cite{M}
- also be an HMS form eliminates troubles that would arise if the angular
- mode were inadvertently set to Radians, in which case
- @w{@samp{2@@ 0' 0" mod 24}} would be interpreted as two degrees modulo
- 24 radians!
- Modulo forms cannot have variables or formulas for components. If you
- enter the formula @samp{(x + 2) mod 5}, Calc propagates the modulus
- to each of the coefficients: @samp{(1 mod 5) x + (2 mod 5)}.
- @ignore
- @starindex
- @end ignore
- @tindex makemod
- The algebraic function @samp{makemod(a, m)} builds the modulo form
- @w{@samp{a mod m}}.
- @node Error Forms, Interval Forms, Modulo Forms, Data Types
- @section Error Forms
- @noindent
- @cindex Error forms
- @cindex Standard deviations
- An @dfn{error form} is a number with an associated standard
- deviation, as in @samp{2.3 +/- 0.12}. The notation
- `@var{x} @t{+/-} @c{$\sigma$}
- @asis{sigma}' stands for an uncertain value which follows a normal or
- Gaussian distribution of mean @cite{x} and standard deviation or
- ``error'' @c{$\sigma$}
- @cite{sigma}. Both the mean and the error can be either numbers or
- formulas. Generally these are real numbers but the mean may also be
- complex. If the error is negative or complex, it is changed to its
- absolute value. An error form with zero error is converted to a
- regular number by the Calculator.@refill
- All arithmetic and transcendental functions accept error forms as input.
- Operations on the mean-value part work just like operations on regular
- numbers. The error part for any function @cite{f(x)} (such as @c{$\sin x$}
- @cite{sin(x)})
- is defined by the error of @cite{x} times the derivative of @cite{f}
- evaluated at the mean value of @cite{x}. For a two-argument function
- @cite{f(x,y)} (such as addition) the error is the square root of the sum
- of the squares of the errors due to @cite{x} and @cite{y}.
- @tex
- $$ \eqalign{
- f(x \hbox{\code{ +/- }} \sigma)
- &= f(x) \hbox{\code{ +/- }} \sigma \left| {df(x) \over dx} \right| \cr
- f(x \hbox{\code{ +/- }} \sigma_x, y \hbox{\code{ +/- }} \sigma_y)
- &= f(x,y) \hbox{\code{ +/- }}
- \sqrt{\left(\sigma_x \left| {\partial f(x,y) \over \partial x}
- \right| \right)^2
- +\left(\sigma_y \left| {\partial f(x,y) \over \partial y}
- \right| \right)^2 } \cr
- } $$
- @end tex
- Note that this
- definition assumes the errors in @cite{x} and @cite{y} are uncorrelated.
- A side effect of this definition is that @samp{(2 +/- 1) * (2 +/- 1)}
- is not the same as @samp{(2 +/- 1)^2}; the former represents the product
- of two independent values which happen to have the same probability
- distributions, and the latter is the product of one random value with itself.
- The former will produce an answer with less error, since on the average
- the two independent errors can be expected to cancel out.@refill
- Consult a good text on error analysis for a discussion of the proper use
- of standard deviations. Actual errors often are neither Gaussian-distributed
- nor uncorrelated, and the above formulas are valid only when errors
- are small. As an example, the error arising from
- `@t{sin(}@var{x} @t{+/-} @c{$\sigma$}
- @var{sigma}@t{)}' is
- `@c{$\sigma$\nobreak}
- @var{sigma} @t{abs(cos(}@var{x}@t{))}'. When @cite{x} is close to zero,
- @c{$\cos x$}
- @cite{cos(x)} is
- close to one so the error in the sine is close to @c{$\sigma$}
- @cite{sigma}; this makes sense, since @c{$\sin x$}
- @cite{sin(x)} is approximately @cite{x} near zero, so a given
- error in @cite{x} will produce about the same error in the sine. Likewise,
- near 90 degrees @c{$\cos x$}
- @cite{cos(x)} is nearly zero and so the computed error is
- small: The sine curve is nearly flat in that region, so an error in @cite{x}
- has relatively little effect on the value of @c{$\sin x$}
- @cite{sin(x)}. However, consider
- @samp{sin(90 +/- 1000)}. The cosine of 90 is zero, so Calc will report
- zero error! We get an obviously wrong result because we have violated
- the small-error approximation underlying the error analysis. If the error
- in @cite{x} had been small, the error in @c{$\sin x$}
- @cite{sin(x)} would indeed have been negligible.@refill
- @ignore
- @mindex p
- @end ignore
- @kindex p (error forms)
- @tindex +/-
- To enter an error form during regular numeric entry, use the @kbd{p}
- (``plus-or-minus'') key to type the @samp{+/-} symbol. (If you try actually
- typing @samp{+/-} the @kbd{+} key will be interpreted as the Calculator's
- @kbd{+} command!) Within an algebraic formula, you can press @kbd{M-p} to
- type the @samp{+/-} symbol, or type it out by hand.
- Error forms and complex numbers can be mixed; the formulas shown above
- are used for complex numbers, too; note that if the error part evaluates
- to a complex number its absolute value (or the square root of the sum of
- the squares of the absolute values of the two error contributions) is
- used. Mathematically, this corresponds to a radially symmetric Gaussian
- distribution of numbers on the complex plane. However, note that Calc
- considers an error form with real components to represent a real number,
- not a complex distribution around a real mean.
- Error forms may also be composed of HMS forms. For best results, both
- the mean and the error should be HMS forms if either one is.
- @ignore
- @starindex
- @end ignore
- @tindex sdev
- The algebraic function @samp{sdev(a, b)} builds the error form @samp{a +/- b}.
- @node Interval Forms, Incomplete Objects, Error Forms, Data Types
- @section Interval Forms
- @noindent
- @cindex Interval forms
- An @dfn{interval} is a subset of consecutive real numbers. For example,
- the interval @samp{[2 ..@: 4]} represents all the numbers from 2 to 4,
- inclusive. If you multiply it by the interval @samp{[0.5 ..@: 2]} you
- obtain @samp{[1 ..@: 8]}. This calculation represents the fact that if
- you multiply some number in the range @samp{[2 ..@: 4]} by some other
- number in the range @samp{[0.5 ..@: 2]}, your result will lie in the range
- from 1 to 8. Interval arithmetic is used to get a worst-case estimate
- of the possible range of values a computation will produce, given the
- set of possible values of the input.
- @ifinfo
- Calc supports several varieties of intervals, including @dfn{closed}
- intervals of the type shown above, @dfn{open} intervals such as
- @samp{(2 ..@: 4)}, which represents the range of numbers from 2 to 4
- @emph{exclusive}, and @dfn{semi-open} intervals in which one end
- uses a round parenthesis and the other a square bracket. In mathematical
- terms,
- @samp{[2 ..@: 4]} means @cite{2 <= x <= 4}, whereas
- @samp{[2 ..@: 4)} represents @cite{2 <= x < 4},
- @samp{(2 ..@: 4]} represents @cite{2 < x <= 4}, and
- @samp{(2 ..@: 4)} represents @cite{2 < x < 4}.@refill
- @end ifinfo
- @tex
- Calc supports several varieties of intervals, including \dfn{closed}
- intervals of the type shown above, \dfn{open} intervals such as
- \samp{(2 ..\: 4)}, which represents the range of numbers from 2 to 4
- \emph{exclusive}, and \dfn{semi-open} intervals in which one end
- uses a round parenthesis and the other a square bracket. In mathematical
- terms,
- $$ \eqalign{
- [2 \hbox{\cite{..}} 4] &\quad\hbox{means}\quad 2 \le x \le 4 \cr
- [2 \hbox{\cite{..}} 4) &\quad\hbox{means}\quad 2 \le x < 4 \cr
- (2 \hbox{\cite{..}} 4] &\quad\hbox{means}\quad 2 < x \le 4 \cr
- (2 \hbox{\cite{..}} 4) &\quad\hbox{means}\quad 2 < x < 4 \cr
- } $$
- @end tex
- The lower and upper limits of an interval must be either real numbers
- (or HMS or date forms), or symbolic expressions which are assumed to be
- real-valued, or @samp{-inf} and @samp{inf}. In general the lower limit
- must be less than the upper limit. A closed interval containing only
- one value, @samp{[3 ..@: 3]}, is converted to a plain number (3)
- automatically. An interval containing no values at all (such as
- @samp{[3 ..@: 2]} or @samp{[2 ..@: 2)}) can be represented but is not
- guaranteed to behave well when used in arithmetic. Note that the
- interval @samp{[3 .. inf)} represents all real numbers greater than
- or equal to 3, and @samp{(-inf .. inf)} represents all real numbers.
- In fact, @samp{[-inf .. inf]} represents all real numbers including
- the real infinities.
- Intervals are entered in the notation shown here, either as algebraic
- formulas, or using incomplete forms. (@xref{Incomplete Objects}.)
- In algebraic formulas, multiple periods in a row are collected from
- left to right, so that @samp{1...1e2} is interpreted as @samp{1.0 ..@: 1e2}
- rather than @samp{1 ..@: 0.1e2}. Add spaces or zeros if you want to
- get the other interpretation. If you omit the lower or upper limit,
- a default of @samp{-inf} or @samp{inf} (respectively) is furnished.
- ``Infinite mode'' also affects operations on intervals
- (@pxref{Infinities}). Calc will always introduce an open infinity,
- as in @samp{1 / (0 .. 2] = [0.5 .. inf)}. But closed infinities,
- @w{@samp{1 / [0 .. 2] = [0.5 .. inf]}}, arise only in infinite mode;
- otherwise they are left unevaluated. Note that the ``direction'' of
- a zero is not an issue in this case since the zero is always assumed
- to be continuous with the rest of the interval. For intervals that
- contain zero inside them Calc is forced to give the result,
- @samp{1 / (-2 .. 2) = [-inf .. inf]}.
- While it may seem that intervals and error forms are similar, they are
- based on entirely different concepts of inexact quantities. An error
- form `@var{x} @t{+/-} @c{$\sigma$}
- @var{sigma}' means a variable is random, and its value could
- be anything but is ``probably'' within one @c{$\sigma$}
- @var{sigma} of the mean value @cite{x}.
- An interval `@t{[}@var{a} @t{..@:} @var{b}@t{]}' means a variable's value
- is unknown, but guaranteed to lie in the specified range. Error forms
- are statistical or ``average case'' approximations; interval arithmetic
- tends to produce ``worst case'' bounds on an answer.@refill
- Intervals may not contain complex numbers, but they may contain
- HMS forms or date forms.
- @xref{Set Operations}, for commands that interpret interval forms
- as subsets of the set of real numbers.
- @ignore
- @starindex
- @end ignore
- @tindex intv
- The algebraic function @samp{intv(n, a, b)} builds an interval form
- from @samp{a} to @samp{b}; @samp{n} is an integer code which must
- be 0 for @samp{(..)}, 1 for @samp{(..]}, 2 for @samp{[..)}, or
- 3 for @samp{[..]}.
- Please note that in fully rigorous interval arithmetic, care would be
- taken to make sure that the computation of the lower bound rounds toward
- minus infinity, while upper bound computations round toward plus
- infinity. Calc's arithmetic always uses a round-to-nearest mode,
- which means that roundoff errors could creep into an interval
- calculation to produce intervals slightly smaller than they ought to
- be. For example, entering @samp{[1..2]} and pressing @kbd{Q 2 ^}
- should yield the interval @samp{[1..2]} again, but in fact it yields the
- (slightly too small) interval @samp{[1..1.9999999]} due to roundoff
- error.
- @node Incomplete Objects, Variables, Interval Forms, Data Types
- @section Incomplete Objects
- @noindent
- @ignore
- @mindex [ ]
- @end ignore
- @kindex [
- @ignore
- @mindex ( )
- @end ignore
- @kindex (
- @kindex ,
- @ignore
- @mindex @null
- @end ignore
- @kindex ]
- @ignore
- @mindex @null
- @end ignore
- @kindex )
- @cindex Incomplete vectors
- @cindex Incomplete complex numbers
- @cindex Incomplete interval forms
- When @kbd{(} or @kbd{[} is typed to begin entering a complex number or
- vector, respectively, the effect is to push an @dfn{incomplete} complex
- number or vector onto the stack. The @kbd{,} key adds the value(s) at
- the top of the stack onto the current incomplete object. The @kbd{)}
- and @kbd{]} keys ``close'' the incomplete object after adding any values
- on the top of the stack in front of the incomplete object.
- As a result, the sequence of keystrokes @kbd{[ 2 , 3 @key{RET} 2 * , 9 ]}
- pushes the vector @samp{[2, 6, 9]} onto the stack. Likewise, @kbd{( 1 , 2 Q )}
- pushes the complex number @samp{(1, 1.414)} (approximately).
- If several values lie on the stack in front of the incomplete object,
- all are collected and appended to the object. Thus the @kbd{,} key
- is redundant: @kbd{[ 2 @key{RET} 3 @key{RET} 2 * 9 ]}. Some people
- prefer the equivalent @key{SPC} key to @key{RET}.@refill
- As a special case, typing @kbd{,} immediately after @kbd{(}, @kbd{[}, or
- @kbd{,} adds a zero or duplicates the preceding value in the list being
- formed. Typing @key{DEL} during incomplete entry removes the last item
- from the list.
- @kindex ;
- The @kbd{;} key is used in the same way as @kbd{,} to create polar complex
- numbers: @kbd{( 1 ; 2 )}. When entering a vector, @kbd{;} is useful for
- creating a matrix. In particular, @kbd{[ [ 1 , 2 ; 3 , 4 ; 5 , 6 ] ]} is
- equivalent to @kbd{[ [ 1 , 2 ] , [ 3 , 4 ] , [ 5 , 6 ] ]}.
- @kindex ..
- @pindex calc-dots
- Incomplete entry is also used to enter intervals. For example,
- @kbd{[ 2 ..@: 4 )} enters a semi-open interval. Note that when you type
- the first period, it will be interpreted as a decimal point, but when
- you type a second period immediately afterward, it is re-interpreted as
- part of the interval symbol. Typing @kbd{..} corresponds to executing
- the @code{calc-dots} command.
- If you find incomplete entry distracting, you may wish to enter vectors
- and complex numbers as algebraic formulas by pressing the apostrophe key.
- @node Variables, Formulas, Incomplete Objects, Data Types
- @section Variables
- @noindent
- @cindex Variables, in formulas
- A @dfn{variable} is somewhere between a storage register on a conventional
- calculator, and a variable in a programming language. (In fact, a Calc
- variable is really just an Emacs Lisp variable that contains a Calc number
- or formula.) A variable's name is normally composed of letters and digits.
- Calc also allows apostrophes and @code{#} signs in variable names.
- The Calc variable @code{foo} corresponds to the Emacs Lisp variable
- @code{var-foo}. Commands like @kbd{s s} (@code{calc-store}) that operate
- on variables can be made to use any arbitrary Lisp variable simply by
- backspacing over the @samp{var-} prefix in the minibuffer.@refill
- In a command that takes a variable name, you can either type the full
- name of a variable, or type a single digit to use one of the special
- convenience variables @code{var-q0} through @code{var-q9}. For example,
- @kbd{3 s s 2} stores the number 3 in variable @code{var-q2}, and
- @w{@kbd{3 s s foo @key{RET}}} stores that number in variable
- @code{var-foo}.@refill
- To push a variable itself (as opposed to the variable's value) on the
- stack, enter its name as an algebraic expression using the apostrophe
- (@key{'}) key. Variable names in algebraic formulas implicitly have
- @samp{var-} prefixed to their names. The @samp{#} character in variable
- names used in algebraic formulas corresponds to a dash @samp{-} in the
- Lisp variable name. If the name contains any dashes, the prefix @samp{var-}
- is @emph{not} automatically added. Thus the two formulas @samp{foo + 1}
- and @samp{var#foo + 1} both refer to the same variable.
- @kindex =
- @pindex calc-evaluate
- @cindex Evaluation of variables in a formula
- @cindex Variables, evaluation
- @cindex Formulas, evaluation
- The @kbd{=} (@code{calc-evaluate}) key ``evaluates'' a formula by
- replacing all variables in the formula which have been given values by a
- @code{calc-store} or @code{calc-let} command by their stored values.
- Other variables are left alone. Thus a variable that has not been
- stored acts like an abstract variable in algebra; a variable that has
- been stored acts more like a register in a traditional calculator.
- With a positive numeric prefix argument, @kbd{=} evaluates the top
- @var{n} stack entries; with a negative argument, @kbd{=} evaluates
- the @var{n}th stack entry.
- @cindex @code{e} variable
- @cindex @code{pi} variable
- @cindex @code{i} variable
- @cindex @code{phi} variable
- @cindex @code{gamma} variable
- @vindex e
- @vindex pi
- @vindex i
- @vindex phi
- @vindex gamma
- A few variables are called @dfn{special constants}. Their names are
- @samp{e}, @samp{pi}, @samp{i}, @samp{phi}, and @samp{gamma}.
- (@xref{Scientific Functions}.) When they are evaluated with @kbd{=},
- their values are calculated if necessary according to the current precision
- or complex polar mode. If you wish to use these symbols for other purposes,
- simply undefine or redefine them using @code{calc-store}.@refill
- The variables @samp{inf}, @samp{uinf}, and @samp{nan} stand for
- infinite or indeterminate values. It's best not to use them as
- regular variables, since Calc uses special algebraic rules when
- it manipulates them. Calc displays a warning message if you store
- a value into any of these special variables.
- @xref{Store and Recall}, for a discussion of commands dealing with variables.
- @node Formulas, , Variables, Data Types
- @section Formulas
- @noindent
- @cindex Formulas
- @cindex Expressions
- @cindex Operators in formulas
- @cindex Precedence of operators
- When you press the apostrophe key you may enter any expression or formula
- in algebraic form. (Calc uses the terms ``expression'' and ``formula''
- interchangeably.) An expression is built up of numbers, variable names,
- and function calls, combined with various arithmetic operators.
- Parentheses may
- be used to indicate grouping. Spaces are ignored within formulas, except
- that spaces are not permitted within variable names or numbers.
- Arithmetic operators, in order from highest to lowest precedence, and
- with their equivalent function names, are:
- @samp{_} [@code{subscr}] (subscripts);
- postfix @samp{%} [@code{percent}] (as in @samp{25% = 0.25});
- prefix @samp{+} and @samp{-} [@code{neg}] (as in @samp{-x})
- and prefix @samp{!} [@code{lnot}] (logical ``not,'' as in @samp{!x});
- @samp{+/-} [@code{sdev}] (the standard deviation symbol) and
- @samp{mod} [@code{makemod}] (the symbol for modulo forms);
- postfix @samp{!} [@code{fact}] (factorial, as in @samp{n!})
- and postfix @samp{!!} [@code{dfact}] (double factorial);
- @samp{^} [@code{pow}] (raised-to-the-power-of);
- @samp{*} [@code{mul}];
- @samp{/} [@code{div}], @samp{%} [@code{mod}] (modulo), and
- @samp{\} [@code{idiv}] (integer division);
- infix @samp{+} [@code{add}] and @samp{-} [@code{sub}] (as in @samp{x-y});
- @samp{|} [@code{vconcat}] (vector concatenation);
- relations @samp{=} [@code{eq}], @samp{!=} [@code{neq}], @samp{<} [@code{lt}],
- @samp{>} [@code{gt}], @samp{<=} [@code{leq}], and @samp{>=} [@code{geq}];
- @samp{&&} [@code{land}] (logical ``and'');
- @samp{||} [@code{lor}] (logical ``or'');
- the C-style ``if'' operator @samp{a?b:c} [@code{if}];
- @samp{!!!} [@code{pnot}] (rewrite pattern ``not'');
- @samp{&&&} [@code{pand}] (rewrite pattern ``and'');
- @samp{|||} [@code{por}] (rewrite pattern ``or'');
- @samp{:=} [@code{assign}] (for assignments and rewrite rules);
- @samp{::} [@code{condition}] (rewrite pattern condition);
- @samp{=>} [@code{evalto}].
- Note that, unlike in usual computer notation, multiplication binds more
- strongly than division: @samp{a*b/c*d} is equivalent to @c{$a b \over c d$}
- @cite{(a*b)/(c*d)}.
- @cindex Multiplication, implicit
- @cindex Implicit multiplication
- The multiplication sign @samp{*} may be omitted in many cases. In particular,
- if the righthand side is a number, variable name, or parenthesized
- expression, the @samp{*} may be omitted. Implicit multiplication has the
- same precedence as the explicit @samp{*} operator. The one exception to
- the rule is that a variable name followed by a parenthesized expression,
- as in @samp{f(x)},
- is interpreted as a function call, not an implicit @samp{*}. In many
- cases you must use a space if you omit the @samp{*}: @samp{2a} is the
- same as @samp{2*a}, and @samp{a b} is the same as @samp{a*b}, but @samp{ab}
- is a variable called @code{ab}, @emph{not} the product of @samp{a} and
- @samp{b}! Also note that @samp{f (x)} is still a function call.@refill
- @cindex Implicit comma in vectors
- The rules are slightly different for vectors written with square brackets.
- In vectors, the space character is interpreted (like the comma) as a
- separator of elements of the vector. Thus @w{@samp{[ 2a b+c d ]}} is
- equivalent to @samp{[2*a, b+c, d]}, whereas @samp{2a b+c d} is equivalent
- to @samp{2*a*b + c*d}.
- Note that spaces around the brackets, and around explicit commas, are
- ignored. To force spaces to be interpreted as multiplication you can
- enclose a formula in parentheses as in @samp{[(a b) 2(c d)]}, which is
- interpreted as @samp{[a*b, 2*c*d]}. An implicit comma is also inserted
- between @samp{][}, as in the matrix @samp{[[1 2][3 4]]}.@refill
- Vectors that contain commas (not embedded within nested parentheses or
- brackets) do not treat spaces specially: @samp{[a b, 2 c d]} is a vector
- of two elements. Also, if it would be an error to treat spaces as
- separators, but not otherwise, then Calc will ignore spaces:
- @w{@samp{[a - b]}} is a vector of one element, but @w{@samp{[a -b]}} is
- a vector of two elements. Finally, vectors entered with curly braces
- instead of square brackets do not give spaces any special treatment.
- When Calc displays a vector that does not contain any commas, it will
- insert parentheses if necessary to make the meaning clear:
- @w{@samp{[(a b)]}}.
- The expression @samp{5%-2} is ambiguous; is this five-percent minus two,
- or five modulo minus-two? Calc always interprets the leftmost symbol as
- an infix operator preferentially (modulo, in this case), so you would
- need to write @samp{(5%)-2} to get the former interpretation.
- @cindex Function call notation
- A function call is, e.g., @samp{sin(1+x)}. Function names follow the same
- rules as variable names except that the default prefix @samp{calcFunc-} is
- used (instead of @samp{var-}) for the internal Lisp form.
- Most mathematical Calculator commands like
- @code{calc-sin} have function equivalents like @code{sin}.
- If no Lisp function is defined for a function called by a formula, the
- call is left as it is during algebraic manipulation: @samp{f(x+y)} is
- left alone. Beware that many innocent-looking short names like @code{in}
- and @code{re} have predefined meanings which could surprise you; however,
- single letters or single letters followed by digits are always safe to
- use for your own function names. @xref{Function Index}.@refill
- In the documentation for particular commands, the notation @kbd{H S}
- (@code{calc-sinh}) [@code{sinh}] means that the key sequence @kbd{H S}, the
- command @kbd{M-x calc-sinh}, and the algebraic function @code{sinh(x)} all
- represent the same operation.@refill
- Commands that interpret (``parse'') text as algebraic formulas include
- algebraic entry (@kbd{'}), editing commands like @kbd{`} which parse
- the contents of the editing buffer when you finish, the @kbd{M-# g}
- and @w{@kbd{M-# r}} commands, the @kbd{C-y} command, the X window system
- ``paste'' mouse operation, and Embedded Mode. All of these operations
- use the same rules for parsing formulas; in particular, language modes
- (@pxref{Language Modes}) affect them all in the same way.
- When you read a large amount of text into the Calculator (say a vector
- which represents a big set of rewrite rules; @pxref{Rewrite Rules}),
- you may wish to include comments in the text. Calc's formula parser
- ignores the symbol @samp{%%} and anything following it on a line:
- @example
- [ a + b, %% the sum of "a" and "b"
- c + d,
- %% last line is coming up:
- e + f ]
- @end example
- @noindent
- This is parsed exactly the same as @samp{[ a + b, c + d, e + f ]}.
- @xref{Syntax Tables}, for a way to create your own operators and other
- input notations. @xref{Compositions}, for a way to create new display
- formats.
- @xref{Algebra}, for commands for manipulating formulas symbolically.
- @node Stack and Trail, Mode Settings, Data Types, Top
- @chapter Stack and Trail Commands
- @noindent
- This chapter describes the Calc commands for manipulating objects on the
- stack and in the trail buffer. (These commands operate on objects of any
- type, such as numbers, vectors, formulas, and incomplete objects.)
- @menu
- * Stack Manipulation::
- * Editing Stack Entries::
- * Trail Commands::
- * Keep Arguments::
- @end menu
- @node Stack Manipulation, Editing Stack Entries, Stack and Trail, Stack and Trail
- @section Stack Manipulation Commands
- @noindent
- @kindex @key{RET}
- @kindex @key{SPC}
- @pindex calc-enter
- @cindex Duplicating stack entries
- To duplicate the top object on the stack, press @key{RET} or @key{SPC}
- (two equivalent keys for the @code{calc-enter} command).
- Given a positive numeric prefix argument, these commands duplicate
- several elements at the top of the stack.
- Given a negative argument,
- these commands duplicate the specified element of the stack.
- Given an argument of zero, they duplicate the entire stack.
- For example, with @samp{10 20 30} on the stack,
- @key{RET} creates @samp{10 20 30 30},
- @kbd{C-u 2 @key{RET}} creates @samp{10 20 30 20 30},
- @kbd{C-u - 2 @key{RET}} creates @samp{10 20 30 20}, and
- @kbd{C-u 0 @key{RET}} creates @samp{10 20 30 10 20 30}.@refill
- @kindex @key{LFD}
- @pindex calc-over
- The @key{LFD} (@code{calc-over}) command (on a key marked Line-Feed if you
- have it, else on @kbd{C-j}) is like @code{calc-enter}
- except that the sign of the numeric prefix argument is interpreted
- oppositely. Also, with no prefix argument the default argument is 2.
- Thus with @samp{10 20 30} on the stack, @key{LFD} and @kbd{C-u 2 @key{LFD}}
- are both equivalent to @kbd{C-u - 2 @key{RET}}, producing
- @samp{10 20 30 20}.@refill
- @kindex @key{DEL}
- @kindex C-d
- @pindex calc-pop
- @cindex Removing stack entries
- @cindex Deleting stack entries
- To remove the top element from the stack, press @key{DEL} (@code{calc-pop}).
- The @kbd{C-d} key is a synonym for @key{DEL}.
- (If the top element is an incomplete object with at least one element, the
- last element is removed from it.) Given a positive numeric prefix argument,
- several elements are removed. Given a negative argument, the specified
- element of the stack is deleted. Given an argument of zero, the entire
- stack is emptied.
- For example, with @samp{10 20 30} on the stack,
- @key{DEL} leaves @samp{10 20},
- @kbd{C-u 2 @key{DEL}} leaves @samp{10},
- @kbd{C-u - 2 @key{DEL}} leaves @samp{10 30}, and
- @kbd{C-u 0 @key{DEL}} leaves an empty stack.@refill
- @kindex M-@key{DEL}
- @pindex calc-pop-above
- The @kbd{M-@key{DEL}} (@code{calc-pop-above}) command is to @key{DEL} what
- @key{LFD} is to @key{RET}: It interprets the sign of the numeric
- prefix argument in the opposite way, and the default argument is 2.
- Thus @kbd{M-@key{DEL}} by itself removes the second-from-top stack element,
- leaving the first, third, fourth, and so on; @kbd{M-3 M-@key{DEL}} deletes
- the third stack element.
- @kindex @key{TAB}
- @pindex calc-roll-down
- To exchange the top two elements of the stack, press @key{TAB}
- (@code{calc-roll-down}). Given a positive numeric prefix argument, the
- specified number of elements at the top of the stack are rotated downward.
- Given a negative argument, the entire stack is rotated downward the specified
- number of times. Given an argument of zero, the entire stack is reversed
- top-for-bottom.
- For example, with @samp{10 20 30 40 50} on the stack,
- @key{TAB} creates @samp{10 20 30 50 40},
- @kbd{C-u 3 @key{TAB}} creates @samp{10 20 50 30 40},
- @kbd{C-u - 2 @key{TAB}} creates @samp{40 50 10 20 30}, and
- @kbd{C-u 0 @key{TAB}} creates @samp{50 40 30 20 10}.@refill
- @kindex M-@key{TAB}
- @pindex calc-roll-up
- The command @kbd{M-@key{TAB}} (@code{calc-roll-up}) is analogous to @key{TAB}
- except that it rotates upward instead of downward. Also, the default
- with no prefix argument is to rotate the top 3 elements.
- For example, with @samp{10 20 30 40 50} on the stack,
- @kbd{M-@key{TAB}} creates @samp{10 20 40 50 30},
- @kbd{C-u 4 M-@key{TAB}} creates @samp{10 30 40 50 20},
- @kbd{C-u - 2 M-@key{TAB}} creates @samp{30 40 50 10 20}, and
- @kbd{C-u 0 M-@key{TAB}} creates @samp{50 40 30 20 10}.@refill
- A good way to view the operation of @key{TAB} and @kbd{M-@key{TAB}} is in
- terms of moving a particular element to a new position in the stack.
- With a positive argument @var{n}, @key{TAB} moves the top stack
- element down to level @var{n}, making room for it by pulling all the
- intervening stack elements toward the top. @kbd{M-@key{TAB}} moves the
- element at level @var{n} up to the top. (Compare with @key{LFD},
- which copies instead of moving the element in level @var{n}.)
- With a negative argument @i{-@var{n}}, @key{TAB} rotates the stack
- to move the object in level @var{n} to the deepest place in the
- stack, and the object in level @i{@var{n}+1} to the top. @kbd{M-@key{TAB}}
- rotates the deepest stack element to be in level @i{n}, also
- putting the top stack element in level @i{@var{n}+1}.
- @xref{Selecting Subformulas}, for a way to apply these commands to
- any portion of a vector or formula on the stack.
- @node Editing Stack Entries, Trail Commands, Stack Manipulation, Stack and Trail
- @section Editing Stack Entries
- @noindent
- @kindex `
- @pindex calc-edit
- @pindex calc-edit-finish
- @cindex Editing the stack with Emacs
- The backquote, @kbd{`} (@code{calc-edit}) command creates a temporary
- buffer (@samp{*Calc Edit*}) for editing the top-of-stack value using
- regular Emacs commands. With a numeric prefix argument, it edits the
- specified number of stack entries at once. (An argument of zero edits
- the entire stack; a negative argument edits one specific stack entry.)
- When you are done editing, press @kbd{M-# M-#} to finish and return
- to Calc. The @key{RET} and @key{LFD} keys also work to finish most
- sorts of editing, though in some cases Calc leaves @key{RET} with its
- usual meaning (``insert a newline'') if it's a situation where you
- might want to insert new lines into the editing buffer. The traditional
- Emacs ``finish'' key sequence, @kbd{C-c C-c}, also works to finish
- editing and may be easier to type, depending on your keyboard.
- When you finish editing, the Calculator parses the lines of text in
- the @samp{*Calc Edit*} buffer as numbers or formulas, replaces the
- original stack elements in the original buffer with these new values,
- then kills the @samp{*Calc Edit*} buffer. The original Calculator buffer
- continues to exist during editing, but for best results you should be
- careful not to change it until you have finished the edit. You can
- also cancel the edit by pressing @kbd{M-# x}.
- The formula is normally reevaluated as it is put onto the stack.
- For example, editing @samp{a + 2} to @samp{3 + 2} and pressing
- @kbd{M-# M-#} will push 5 on the stack. If you use @key{LFD} to
- finish, Calc will put the result on the stack without evaluating it.
- If you give a prefix argument to @kbd{M-# M-#} (or @kbd{C-c C-c}),
- Calc will not kill the @samp{*Calc Edit*} buffer. You can switch
- back to that buffer and continue editing if you wish. However, you
- should understand that if you initiated the edit with @kbd{`}, the
- @kbd{M-# M-#} operation will be programmed to replace the top of the
- stack with the new edited value, and it will do this even if you have
- rearranged the stack in the meanwhile. This is not so much of a problem
- with other editing commands, though, such as @kbd{s e}
- (@code{calc-edit-variable}; @pxref{Operations on Variables}).
- If the @code{calc-edit} command involves more than one stack entry,
- each line of the @samp{*Calc Edit*} buffer is interpreted as a
- separate formula. Otherwise, the entire buffer is interpreted as
- one formula, with line breaks ignored. (You can use @kbd{C-o} or
- @kbd{C-q C-j} to insert a newline in the buffer without pressing @key{RET}.)
- The @kbd{`} key also works during numeric or algebraic entry. The
- text entered so far is moved to the @code{*Calc Edit*} buffer for
- more extensive editing than is convenient in the minibuffer.
- @node Trail Commands, Keep Arguments, Editing Stack Entries, Stack and Trail
- @section Trail Commands
- @noindent
- @cindex Trail buffer
- The commands for manipulating the Calc Trail buffer are two-key sequences
- beginning with the @kbd{t} prefix.
- @kindex t d
- @pindex calc-trail-display
- The @kbd{t d} (@code{calc-trail-display}) command turns display of the
- trail on and off. Normally the trail display is toggled on if it was off,
- off if it was on. With a numeric prefix of zero, this command always
- turns the trail off; with a prefix of one, it always turns the trail on.
- The other trail-manipulation commands described here automatically turn
- the trail on. Note that when the trail is off values are still recorded
- there; they are simply not displayed. To set Emacs to turn the trail
- off by default, type @kbd{t d} and then save the mode settings with
- @kbd{m m} (@code{calc-save-modes}).
- @kindex t i
- @pindex calc-trail-in
- @kindex t o
- @pindex calc-trail-out
- The @kbd{t i} (@code{calc-trail-in}) and @kbd{t o}
- (@code{calc-trail-out}) commands switch the cursor into and out of the
- Calc Trail window. In practice they are rarely used, since the commands
- shown below are a more convenient way to move around in the
- trail, and they work ``by remote control'' when the cursor is still
- in the Calculator window.@refill
- @cindex Trail pointer
- There is a @dfn{trail pointer} which selects some entry of the trail at
- any given time. The trail pointer looks like a @samp{>} symbol right
- before the selected number. The following commands operate on the
- trail pointer in various ways.
- @kindex t y
- @pindex calc-trail-yank
- @cindex Retrieving previous results
- The @kbd{t y} (@code{calc-trail-yank}) command reads the selected value in
- the trail and pushes it onto the Calculator stack. It allows you to
- re-use any previously computed value without retyping. With a numeric
- prefix argument @var{n}, it yanks the value @var{n} lines above the current
- trail pointer.
- @kindex t <
- @pindex calc-trail-scroll-left
- @kindex t >
- @pindex calc-trail-scroll-right
- The @kbd{t <} (@code{calc-trail-scroll-left}) and @kbd{t >}
- (@code{calc-trail-scroll-right}) commands horizontally scroll the trail
- window left or right by one half of its width.@refill
- @kindex t n
- @pindex calc-trail-next
- @kindex t p
- @pindex calc-trail-previous
- @kindex t f
- @pindex calc-trail-forward
- @kindex t b
- @pindex calc-trail-backward
- The @kbd{t n} (@code{calc-trail-next}) and @kbd{t p}
- (@code{calc-trail-previous)} commands move the trail pointer down or up
- one line. The @kbd{t f} (@code{calc-trail-forward}) and @kbd{t b}
- (@code{calc-trail-backward}) commands move the trail pointer down or up
- one screenful at a time. All of these commands accept numeric prefix
- arguments to move several lines or screenfuls at a time.@refill
- @kindex t [
- @pindex calc-trail-first
- @kindex t ]
- @pindex calc-trail-last
- @kindex t h
- @pindex calc-trail-here
- The @kbd{t [} (@code{calc-trail-first}) and @kbd{t ]}
- (@code{calc-trail-last}) commands move the trail pointer to the first or
- last line of the trail. The @kbd{t h} (@code{calc-trail-here}) command
- moves the trail pointer to the cursor position; unlike the other trail
- commands, @kbd{t h} works only when Calc Trail is the selected window.@refill
- @kindex t s
- @pindex calc-trail-isearch-forward
- @kindex t r
- @pindex calc-trail-isearch-backward
- @ifinfo
- The @kbd{t s} (@code{calc-trail-isearch-forward}) and @kbd{t r}
- (@code{calc-trail-isearch-backward}) commands perform an incremental
- search forward or backward through the trail. You can press @key{RET}
- to terminate the search; the trail pointer moves to the current line.
- If you cancel the search with @kbd{C-g}, the trail pointer stays where
- it was when the search began.@refill
- @end ifinfo
- @tex
- The @kbd{t s} (@code{calc-trail-isearch-forward}) and @kbd{t r}
- (@code{calc-trail-isearch-backward}) com\-mands perform an incremental
- search forward or backward through the trail. You can press @key{RET}
- to terminate the search; the trail pointer moves to the current line.
- If you cancel the search with @kbd{C-g}, the trail pointer stays where
- it was when the search began.
- @end tex
- @kindex t m
- @pindex calc-trail-marker
- The @kbd{t m} (@code{calc-trail-marker}) command allows you to enter a
- line of text of your own choosing into the trail. The text is inserted
- after the line containing the trail pointer; this usually means it is
- added to the end of the trail. Trail markers are useful mainly as the
- targets for later incremental searches in the trail.
- @kindex t k
- @pindex calc-trail-kill
- The @kbd{t k} (@code{calc-trail-kill}) command removes the selected line
- from the trail. The line is saved in the Emacs kill ring suitable for
- yanking into another buffer, but it is not easy to yank the text back
- into the trail buffer. With a numeric prefix argument, this command
- kills the @var{n} lines below or above the selected one.
- The @kbd{t .} (@code{calc-full-trail-vectors}) command is described
- elsewhere; @pxref{Vector and Matrix Formats}.
- @node Keep Arguments, , Trail Commands, Stack and Trail
- @section Keep Arguments
- @noindent
- @kindex K
- @pindex calc-keep-args
- The @kbd{K} (@code{calc-keep-args}) command acts like a prefix for
- the following command. It prevents that command from removing its
- arguments from the stack. For example, after @kbd{2 @key{RET} 3 +},
- the stack contains the sole number 5, but after @kbd{2 @key{RET} 3 K +},
- the stack contains the arguments and the result: @samp{2 3 5}.
- This works for all commands that take arguments off the stack. As
- another example, @kbd{K a s} simplifies a formula, pushing the
- simplified version of the formula onto the stack after the original
- formula (rather than replacing the original formula).
- Note that you could get the same effect by typing @kbd{@key{RET} a s},
- copying the formula and then simplifying the copy. One difference
- is that for a very large formula the time taken to format the
- intermediate copy in @kbd{@key{RET} a s} could be noticeable; @kbd{K a s}
- would avoid this extra work.
- Even stack manipulation commands are affected. @key{TAB} works by
- popping two values and pushing them back in the opposite order,
- so @kbd{2 @key{RET} 3 K @key{TAB}} produces @samp{2 3 3 2}.
- A few Calc commands provide other ways of doing the same thing.
- For example, @kbd{' sin($)} replaces the number on the stack with
- its sine using algebraic entry; to push the sine and keep the
- original argument you could use either @kbd{' sin($1)} or
- @kbd{K ' sin($)}. @xref{Algebraic Entry}. Also, the @kbd{s s}
- command is effectively the same as @kbd{K s t}. @xref{Storing Variables}.
- Keyboard macros may interact surprisingly with the @kbd{K} prefix.
- If you have defined a keyboard macro to be, say, @samp{Q +} to add
- one number to the square root of another, then typing @kbd{K X} will
- execute @kbd{K Q +}, probably not what you expected. The @kbd{K}
- prefix will apply to just the first command in the macro rather than
- the whole macro.
- If you execute a command and then decide you really wanted to keep
- the argument, you can press @kbd{M-@key{RET}} (@code{calc-last-args}).
- This command pushes the last arguments that were popped by any command
- onto the stack. Note that the order of things on the stack will be
- different than with @kbd{K}: @kbd{2 @key{RET} 3 + M-@key{RET}} leaves
- @samp{5 2 3} on the stack instead of @samp{2 3 5}. @xref{Undo}.
- @node Mode Settings, Arithmetic, Stack and Trail, Top
- @chapter Mode Settings
- @noindent
- This chapter describes commands that set modes in the Calculator.
- They do not affect the contents of the stack, although they may change
- the @emph{appearance} or @emph{interpretation} of the stack's contents.
- @menu
- * General Mode Commands::
- * Precision::
- * Inverse and Hyperbolic::
- * Calculation Modes::
- * Simplification Modes::
- * Declarations::
- * Display Modes::
- * Language Modes::
- * Modes Variable::
- * Calc Mode Line::
- @end menu
- @node General Mode Commands, Precision, Mode Settings, Mode Settings
- @section General Mode Commands
- @noindent
- @kindex m m
- @pindex calc-save-modes
- @cindex Continuous memory
- @cindex Saving mode settings
- @cindex Permanent mode settings
- @cindex @file{.emacs} file, mode settings
- You can save all of the current mode settings in your @file{.emacs} file
- with the @kbd{m m} (@code{calc-save-modes}) command. This will cause
- Emacs to reestablish these modes each time it starts up. The modes saved
- in the file include everything controlled by the @kbd{m} and @kbd{d}
- prefix keys, the current precision and binary word size, whether or not
- the trail is displayed, the current height of the Calc window, and more.
- The current interface (used when you type @kbd{M-# M-#}) is also saved.
- If there were already saved mode settings in the file, they are replaced.
- Otherwise, the new mode information is appended to the end of the file.
- @kindex m R
- @pindex calc-mode-record-mode
- The @kbd{m R} (@code{calc-mode-record-mode}) command tells Calc to
- record the new mode settings (as if by pressing @kbd{m m}) every
- time a mode setting changes. If Embedded Mode is enabled, other
- options are available; @pxref{Mode Settings in Embedded Mode}.
- @kindex m F
- @pindex calc-settings-file-name
- The @kbd{m F} (@code{calc-settings-file-name}) command allows you to
- choose a different place than your @file{.emacs} file for @kbd{m m},
- @kbd{Z P}, and similar commands to save permanent information.
- You are prompted for a file name. All Calc modes are then reset to
- their default values, then settings from the file you named are loaded
- if this file exists, and this file becomes the one that Calc will
- use in the future for commands like @kbd{m m}. The default settings
- file name is @file{~/.emacs}. You can see the current file name by
- giving a blank response to the @kbd{m F} prompt. See also the
- discussion of the @code{calc-settings-file} variable; @pxref{Installation}.
- If the file name you give contains the string @samp{.emacs} anywhere
- inside it, @kbd{m F} will not automatically load the new file. This
- is because you are presumably switching to your @file{~/.emacs} file,
- which may contain other things you don't want to reread. You can give
- a numeric prefix argument of 1 to @kbd{m F} to force it to read the
- file no matter what its name. Conversely, an argument of @i{-1} tells
- @kbd{m F} @emph{not} to read the new file. An argument of 2 or @i{-2}
- tells @kbd{m F} not to reset the modes to their defaults beforehand,
- which is useful if you intend your new file to have a variant of the
- modes present in the file you were using before.
- @kindex m x
- @pindex calc-always-load-extensions
- The @kbd{m x} (@code{calc-always-load-extensions}) command enables a mode
- in which the first use of Calc loads the entire program, including all
- extensions modules. Otherwise, the extensions modules will not be loaded
- until the various advanced Calc features are used. Since this mode only
- has effect when Calc is first loaded, @kbd{m x} is usually followed by
- @kbd{m m} to make the mode-setting permanent. To load all of Calc just
- once, rather than always in the future, you can press @kbd{M-# L}.
- @kindex m S
- @pindex calc-shift-prefix
- The @kbd{m S} (@code{calc-shift-prefix}) command enables a mode in which
- all of Calc's letter prefix keys may be typed shifted as well as unshifted.
- If you are typing, say, @kbd{a S} (@code{calc-solve-for}) quite often
- you might find it easier to turn this mode on so that you can type
- @kbd{A S} instead. When this mode is enabled, the commands that used to
- be on those single shifted letters (e.g., @kbd{A} (@code{calc-abs})) can
- now be invoked by pressing the shifted letter twice: @kbd{A A}. Note
- that the @kbd{v} prefix key always works both shifted and unshifted, and
- the @kbd{z} and @kbd{Z} prefix keys are always distinct. Also, the @kbd{h}
- prefix is not affected by this mode. Press @kbd{m S} again to disable
- shifted-prefix mode.
- @node Precision, Inverse and Hyperbolic, General Mode Commands, Mode Settings
- @section Precision
- @noindent
- @kindex p
- @pindex calc-precision
- @cindex Precision of calculations
- The @kbd{p} (@code{calc-precision}) command controls the precision to
- which floating-point calculations are carried. The precision must be
- at least 3 digits and may be arbitrarily high, within the limits of
- memory and time. This affects only floats: Integer and rational
- calculations are always carried out with as many digits as necessary.
- The @kbd{p} key prompts for the current precision. If you wish you
- can instead give the precision as a numeric prefix argument.
- Many internal calculations are carried to one or two digits higher
- precision than normal. Results are rounded down afterward to the
- current precision. Unless a special display mode has been selected,
- floats are always displayed with their full stored precision, i.e.,
- what you see is what you get. Reducing the current precision does not
- round values already on the stack, but those values will be rounded
- down before being used in any calculation. The @kbd{c 0} through
- @kbd{c 9} commands (@pxref{Conversions}) can be used to round an
- existing value to a new precision.@refill
- @cindex Accuracy of calculations
- It is important to distinguish the concepts of @dfn{precision} and
- @dfn{accuracy}. In the normal usage of these words, the number
- 123.4567 has a precision of 7 digits but an accuracy of 4 digits.
- The precision is the total number of digits not counting leading
- or trailing zeros (regardless of the position of the decimal point).
- The accuracy is simply the number of digits after the decimal point
- (again not counting trailing zeros). In Calc you control the precision,
- not the accuracy of computations. If you were to set the accuracy
- instead, then calculations like @samp{exp(100)} would generate many
- more digits than you would typically need, while @samp{exp(-100)} would
- probably round to zero! In Calc, both these computations give you
- exactly 12 (or the requested number of) significant digits.
- The only Calc features that deal with accuracy instead of precision
- are fixed-point display mode for floats (@kbd{d f}; @pxref{Float Formats}),
- and the rounding functions like @code{floor} and @code{round}
- (@pxref{Integer Truncation}). Also, @kbd{c 0} through @kbd{c 9}
- deal with both precision and accuracy depending on the magnitudes
- of the numbers involved.
- If you need to work with a particular fixed accuracy (say, dollars and
- cents with two digits after the decimal point), one solution is to work
- with integers and an ``implied'' decimal point. For example, $8.99
- divided by 6 would be entered @kbd{899 @key{RET} 6 /}, yielding 149.833
- (actually $1.49833 with our implied decimal point); pressing @kbd{R}
- would round this to 150 cents, i.e., $1.50.
- @xref{Floats}, for still more on floating-point precision and related
- issues.
- @node Inverse and Hyperbolic, Calculation Modes, Precision, Mode Settings
- @section Inverse and Hyperbolic Flags
- @noindent
- @kindex I
- @pindex calc-inverse
- There is no single-key equivalent to the @code{calc-arcsin} function.
- Instead, you must first press @kbd{I} (@code{calc-inverse}) to set
- the @dfn{Inverse Flag}, then press @kbd{S} (@code{calc-sin}).
- The @kbd{I} key actually toggles the Inverse Flag. When this flag
- is set, the word @samp{Inv} appears in the mode line.@refill
- @kindex H
- @pindex calc-hyperbolic
- Likewise, the @kbd{H} key (@code{calc-hyperbolic}) sets or clears the
- Hyperbolic Flag, which transforms @code{calc-sin} into @code{calc-sinh}.
- If both of these flags are set at once, the effect will be
- @code{calc-arcsinh}. (The Hyperbolic flag is also used by some
- non-trigonometric commands; for example @kbd{H L} computes a base-10,
- instead of base-@i{e}, logarithm.)@refill
- Command names like @code{calc-arcsin} are provided for completeness, and
- may be executed with @kbd{x} or @kbd{M-x}. Their effect is simply to
- toggle the Inverse and/or Hyperbolic flags and then execute the
- corresponding base command (@code{calc-sin} in this case).
- The Inverse and Hyperbolic flags apply only to the next Calculator
- command, after which they are automatically cleared. (They are also
- cleared if the next keystroke is not a Calc command.) Digits you
- type after @kbd{I} or @kbd{H} (or @kbd{K}) are treated as prefix
- arguments for the next command, not as numeric entries. The same
- is true of @kbd{C-u}, but not of the minus sign (@kbd{K -} means to
- subtract and keep arguments).
- The third Calc prefix flag, @kbd{K} (keep-arguments), is discussed
- elsewhere. @xref{Keep Arguments}.
- @node Calculation Modes, Simplification Modes, Inverse and Hyperbolic, Mode Settings
- @section Calculation Modes
- @noindent
- The commands in this section are two-key sequences beginning with
- the @kbd{m} prefix. (That's the letter @kbd{m}, not the @key{META} key.)
- The @samp{m a} (@code{calc-algebraic-mode}) command is described elsewhere
- (@pxref{Algebraic Entry}).
- @menu
- * Angular Modes::
- * Polar Mode::
- * Fraction Mode::
- * Infinite Mode::
- * Symbolic Mode::
- * Matrix Mode::
- * Automatic Recomputation::
- * Working Message::
- @end menu
- @node Angular Modes, Polar Mode, Calculation Modes, Calculation Modes
- @subsection Angular Modes
- @noindent
- @cindex Angular mode
- The Calculator supports three notations for angles: radians, degrees,
- and degrees-minutes-seconds. When a number is presented to a function
- like @code{sin} that requires an angle, the current angular mode is
- used to interpret the number as either radians or degrees. If an HMS
- form is presented to @code{sin}, it is always interpreted as
- degrees-minutes-seconds.
- Functions that compute angles produce a number in radians, a number in
- degrees, or an HMS form depending on the current angular mode. If the
- result is a complex number and the current mode is HMS, the number is
- instead expressed in degrees. (Complex-number calculations would
- normally be done in radians mode, though. Complex numbers are converted
- to degrees by calculating the complex result in radians and then
- multiplying by 180 over @c{$\pi$}
- @cite{pi}.)
- @kindex m r
- @pindex calc-radians-mode
- @kindex m d
- @pindex calc-degrees-mode
- @kindex m h
- @pindex calc-hms-mode
- The @kbd{m r} (@code{calc-radians-mode}), @kbd{m d} (@code{calc-degrees-mode}),
- and @kbd{m h} (@code{calc-hms-mode}) commands control the angular mode.
- The current angular mode is displayed on the Emacs mode line.
- The default angular mode is degrees.@refill
- @node Polar Mode, Fraction Mode, Angular Modes, Calculation Modes
- @subsection Polar Mode
- @noindent
- @cindex Polar mode
- The Calculator normally ``prefers'' rectangular complex numbers in the
- sense that rectangular form is used when the proper form can not be
- decided from the input. This might happen by multiplying a rectangular
- number by a polar one, by taking the square root of a negative real
- number, or by entering @kbd{( 2 @key{SPC} 3 )}.
- @kindex m p
- @pindex calc-polar-mode
- The @kbd{m p} (@code{calc-polar-mode}) command toggles complex-number
- preference between rectangular and polar forms. In polar mode, all
- of the above example situations would produce polar complex numbers.
- @node Fraction Mode, Infinite Mode, Polar Mode, Calculation Modes
- @subsection Fraction Mode
- @noindent
- @cindex Fraction mode
- @cindex Division of integers
- Division of two integers normally yields a floating-point number if the
- result cannot be expressed as an integer. In some cases you would
- rather get an exact fractional answer. One way to accomplish this is
- to multiply fractions instead: @kbd{6 @key{RET} 1:4 *} produces @cite{3:2}
- even though @kbd{6 @key{RET} 4 /} produces @cite{1.5}.
- @kindex m f
- @pindex calc-frac-mode
- To set the Calculator to produce fractional results for normal integer
- divisions, use the @kbd{m f} (@code{calc-frac-mode}) command.
- For example, @cite{8/4} produces @cite{2} in either mode,
- but @cite{6/4} produces @cite{3:2} in Fraction Mode, @cite{1.5} in
- Float Mode.@refill
- At any time you can use @kbd{c f} (@code{calc-float}) to convert a
- fraction to a float, or @kbd{c F} (@code{calc-fraction}) to convert a
- float to a fraction. @xref{Conversions}.
- @node Infinite Mode, Symbolic Mode, Fraction Mode, Calculation Modes
- @subsection Infinite Mode
- @noindent
- @cindex Infinite mode
- The Calculator normally treats results like @cite{1 / 0} as errors;
- formulas like this are left in unsimplified form. But Calc can be
- put into a mode where such calculations instead produce ``infinite''
- results.
- @kindex m i
- @pindex calc-infinite-mode
- The @kbd{m i} (@code{calc-infinite-mode}) command turns this mode
- on and off. When the mode is off, infinities do not arise except
- in calculations that already had infinities as inputs. (One exception
- is that infinite open intervals like @samp{[0 .. inf)} can be
- generated; however, intervals closed at infinity (@samp{[0 .. inf]})
- will not be generated when infinite mode is off.)
- With infinite mode turned on, @samp{1 / 0} will generate @code{uinf},
- an undirected infinity. @xref{Infinities}, for a discussion of the
- difference between @code{inf} and @code{uinf}. Also, @cite{0 / 0}
- evaluates to @code{nan}, the ``indeterminate'' symbol. Various other
- functions can also return infinities in this mode; for example,
- @samp{ln(0) = -inf}, and @samp{gamma(-7) = uinf}. Once again,
- note that @samp{exp(inf) = inf} regardless of infinite mode because
- this calculation has infinity as an input.
- @cindex Positive infinite mode
- The @kbd{m i} command with a numeric prefix argument of zero,
- i.e., @kbd{C-u 0 m i}, turns on a ``positive infinite mode'' in
- which zero is treated as positive instead of being directionless.
- Thus, @samp{1 / 0 = inf} and @samp{-1 / 0 = -inf} in this mode.
- Note that zero never actually has a sign in Calc; there are no
- separate representations for @i{+0} and @i{-0}. Positive
- infinite mode merely changes the interpretation given to the
- single symbol, @samp{0}. One consequence of this is that, while
- you might expect @samp{1 / -0 = -inf}, actually @samp{1 / -0}
- is equivalent to @samp{1 / 0}, which is equal to positive @code{inf}.
- @node Symbolic Mode, Matrix Mode, Infinite Mode, Calculation Modes
- @subsection Symbolic Mode
- @noindent
- @cindex Symbolic mode
- @cindex Inexact results
- Calculations are normally performed numerically wherever possible.
- For example, the @code{calc-sqrt} command, or @code{sqrt} function in an
- algebraic expression, produces a numeric answer if the argument is a
- number or a symbolic expression if the argument is an expression:
- @kbd{2 Q} pushes 1.4142 but @kbd{@key{'} x+1 @key{RET} Q} pushes @samp{sqrt(x+1)}.
- @kindex m s
- @pindex calc-symbolic-mode
- In @dfn{symbolic mode}, controlled by the @kbd{m s} (@code{calc-symbolic-mode})
- command, functions which would produce inexact, irrational results are
- left in symbolic form. Thus @kbd{16 Q} pushes 4, but @kbd{2 Q} pushes
- @samp{sqrt(2)}.
- @kindex N
- @pindex calc-eval-num
- The shift-@kbd{N} (@code{calc-eval-num}) command evaluates numerically
- the expression at the top of the stack, by temporarily disabling
- @code{calc-symbolic-mode} and executing @kbd{=} (@code{calc-evaluate}).
- Given a numeric prefix argument, it also
- sets the floating-point precision to the specified value for the duration
- of the command.@refill
- To evaluate a formula numerically without expanding the variables it
- contains, you can use the key sequence @kbd{m s a v m s} (this uses
- @code{calc-alg-evaluate}, which resimplifies but doesn't evaluate
- variables.)
- @node Matrix Mode, Automatic Recomputation, Symbolic Mode, Calculation Modes
- @subsection Matrix and Scalar Modes
- @noindent
- @cindex Matrix mode
- @cindex Scalar mode
- Calc sometimes makes assumptions during algebraic manipulation that
- are awkward or incorrect when vectors and matrices are involved.
- Calc has two modes, @dfn{matrix mode} and @dfn{scalar mode}, which
- modify its behavior around vectors in useful ways.
- @kindex m v
- @pindex calc-matrix-mode
- Press @kbd{m v} (@code{calc-matrix-mode}) once to enter matrix mode.
- In this mode, all objects are assumed to be matrices unless provably
- otherwise. One major effect is that Calc will no longer consider
- multiplication to be commutative. (Recall that in matrix arithmetic,
- @samp{A*B} is not the same as @samp{B*A}.) This assumption affects
- rewrite rules and algebraic simplification. Another effect of this
- mode is that calculations that would normally produce constants like
- 0 and 1 (e.g., @cite{a - a} and @cite{a / a}, respectively) will now
- produce function calls that represent ``generic'' zero or identity
- matrices: @samp{idn(0)}, @samp{idn(1)}. The @code{idn} function
- @samp{idn(@var{a},@var{n})} returns @var{a} times an @var{n}x@var{n}
- identity matrix; if @var{n} is omitted, it doesn't know what
- dimension to use and so the @code{idn} call remains in symbolic
- form. However, if this generic identity matrix is later combined
- with a matrix whose size is known, it will be converted into
- a true identity matrix of the appropriate size. On the other hand,
- if it is combined with a scalar (as in @samp{idn(1) + 2}), Calc
- will assume it really was a scalar after all and produce, e.g., 3.
- Press @kbd{m v} a second time to get scalar mode. Here, objects are
- assumed @emph{not} to be vectors or matrices unless provably so.
- For example, normally adding a variable to a vector, as in
- @samp{[x, y, z] + a}, will leave the sum in symbolic form because
- as far as Calc knows, @samp{a} could represent either a number or
- another 3-vector. In scalar mode, @samp{a} is assumed to be a
- non-vector, and the addition is evaluated to @samp{[x+a, y+a, z+a]}.
- Press @kbd{m v} a third time to return to the normal mode of operation.
- If you press @kbd{m v} with a numeric prefix argument @var{n}, you
- get a special ``dimensioned matrix mode'' in which matrices of
- unknown size are assumed to be @var{n}x@var{n} square matrices.
- Then, the function call @samp{idn(1)} will expand into an actual
- matrix rather than representing a ``generic'' matrix.
- @cindex Declaring scalar variables
- Of course these modes are approximations to the true state of
- affairs, which is probably that some quantities will be matrices
- and others will be scalars. One solution is to ``declare''
- certain variables or functions to be scalar-valued.
- @xref{Declarations}, to see how to make declarations in Calc.
- There is nothing stopping you from declaring a variable to be
- scalar and then storing a matrix in it; however, if you do, the
- results you get from Calc may not be valid. Suppose you let Calc
- get the result @samp{[x+a, y+a, z+a]} shown above, and then stored
- @samp{[1, 2, 3]} in @samp{a}. The result would not be the same as
- for @samp{[x, y, z] + [1, 2, 3]}, but that's because you have broken
- your earlier promise to Calc that @samp{a} would be scalar.
- Another way to mix scalars and matrices is to use selections
- (@pxref{Selecting Subformulas}). Use matrix mode when operating on
- your formula normally; then, to apply scalar mode to a certain part
- of the formula without affecting the rest just select that part,
- change into scalar mode and press @kbd{=} to resimplify the part
- under this mode, then change back to matrix mode before deselecting.
- @node Automatic Recomputation, Working Message, Matrix Mode, Calculation Modes
- @subsection Automatic Recomputation
- @noindent
- The @dfn{evaluates-to} operator, @samp{=>}, has the special
- property that any @samp{=>} formulas on the stack are recomputed
- whenever variable values or mode settings that might affect them
- are changed. @xref{Evaluates-To Operator}.
- @kindex m C
- @pindex calc-auto-recompute
- The @kbd{m C} (@code{calc-auto-recompute}) command turns this
- automatic recomputation on and off. If you turn it off, Calc will
- not update @samp{=>} operators on the stack (nor those in the
- attached Embedded Mode buffer, if there is one). They will not
- be updated unless you explicitly do so by pressing @kbd{=} or until
- you press @kbd{m C} to turn recomputation back on. (While automatic
- recomputation is off, you can think of @kbd{m C m C} as a command
- to update all @samp{=>} operators while leaving recomputation off.)
- To update @samp{=>} operators in an Embedded buffer while
- automatic recomputation is off, use @w{@kbd{M-# u}}.
- @xref{Embedded Mode}.
- @node Working Message, , Automatic Recomputation, Calculation Modes
- @subsection Working Messages
- @noindent
- @cindex Performance
- @cindex Working messages
- Since the Calculator is written entirely in Emacs Lisp, which is not
- designed for heavy numerical work, many operations are quite slow.
- The Calculator normally displays the message @samp{Working...} in the
- echo area during any command that may be slow. In addition, iterative
- operations such as square roots and trigonometric functions display the
- intermediate result at each step. Both of these types of messages can
- be disabled if you find them distracting.
- @kindex m w
- @pindex calc-working
- Type @kbd{m w} (@code{calc-working}) with a numeric prefix of 0 to
- disable all ``working'' messages. Use a numeric prefix of 1 to enable
- only the plain @samp{Working...} message. Use a numeric prefix of 2 to
- see intermediate results as well. With no numeric prefix this displays
- the current mode.@refill
- While it may seem that the ``working'' messages will slow Calc down
- considerably, experiments have shown that their impact is actually
- quite small. But if your terminal is slow you may find that it helps
- to turn the messages off.
- @node Simplification Modes, Declarations, Calculation Modes, Mode Settings
- @section Simplification Modes
- @noindent
- The current @dfn{simplification mode} controls how numbers and formulas
- are ``normalized'' when being taken from or pushed onto the stack.
- Some normalizations are unavoidable, such as rounding floating-point
- results to the current precision, and reducing fractions to simplest
- form. Others, such as simplifying a formula like @cite{a+a} (or @cite{2+3}),
- are done by default but can be turned off when necessary.
- When you press a key like @kbd{+} when @cite{2} and @cite{3} are on the
- stack, Calc pops these numbers, normalizes them, creates the formula
- @cite{2+3}, normalizes it, and pushes the result. Of course the standard
- rules for normalizing @cite{2+3} will produce the result @cite{5}.
- Simplification mode commands consist of the lower-case @kbd{m} prefix key
- followed by a shifted letter.
- @kindex m O
- @pindex calc-no-simplify-mode
- The @kbd{m O} (@code{calc-no-simplify-mode}) command turns off all optional
- simplifications. These would leave a formula like @cite{2+3} alone. In
- fact, nothing except simple numbers are ever affected by normalization
- in this mode.
- @kindex m N
- @pindex calc-num-simplify-mode
- The @kbd{m N} (@code{calc-num-simplify-mode}) command turns off simplification
- of any formulas except those for which all arguments are constants. For
- example, @cite{1+2} is simplified to @cite{3}, and @cite{a+(2-2)} is
- simplified to @cite{a+0} but no further, since one argument of the sum
- is not a constant. Unfortunately, @cite{(a+2)-2} is @emph{not} simplified
- because the top-level @samp{-} operator's arguments are not both
- constant numbers (one of them is the formula @cite{a+2}).
- A constant is a number or other numeric object (such as a constant
- error form or modulo form), or a vector all of whose
- elements are constant.@refill
- @kindex m D
- @pindex calc-default-simplify-mode
- The @kbd{m D} (@code{calc-default-simplify-mode}) command restores the
- default simplifications for all formulas. This includes many easy and
- fast algebraic simplifications such as @cite{a+0} to @cite{a}, and
- @cite{a + 2 a} to @cite{3 a}, as well as evaluating functions like
- @cite{@t{deriv}(x^2, x)} to @cite{2 x}.
- @kindex m B
- @pindex calc-bin-simplify-mode
- The @kbd{m B} (@code{calc-bin-simplify-mode}) mode applies the default
- simplifications to a result and then, if the result is an integer,
- uses the @kbd{b c} (@code{calc-clip}) command to clip the integer according
- to the current binary word size. @xref{Binary Functions}. Real numbers
- are rounded to the nearest integer and then clipped; other kinds of
- results (after the default simplifications) are left alone.
- @kindex m A
- @pindex calc-alg-simplify-mode
- The @kbd{m A} (@code{calc-alg-simplify-mode}) mode does algebraic
- simplification; it applies all the default simplifications, and also
- the more powerful (and slower) simplifications made by @kbd{a s}
- (@code{calc-simplify}). @xref{Algebraic Simplifications}.
- @kindex m E
- @pindex calc-ext-simplify-mode
- The @kbd{m E} (@code{calc-ext-simplify-mode}) mode does ``extended''
- algebraic simplification, as by the @kbd{a e} (@code{calc-simplify-extended})
- command. @xref{Unsafe Simplifications}.
- @kindex m U
- @pindex calc-units-simplify-mode
- The @kbd{m U} (@code{calc-units-simplify-mode}) mode does units
- simplification; it applies the command @kbd{u s}
- (@code{calc-simplify-units}), which in turn
- is a superset of @kbd{a s}. In this mode, variable names which
- are identifiable as unit names (like @samp{mm} for ``millimeters'')
- are simplified with their unit definitions in mind.@refill
- A common technique is to set the simplification mode down to the lowest
- amount of simplification you will allow to be applied automatically, then
- use manual commands like @kbd{a s} and @kbd{c c} (@code{calc-clean}) to
- perform higher types of simplifications on demand. @xref{Algebraic
- Definitions}, for another sample use of no-simplification mode.@refill
- @node Declarations, Display Modes, Simplification Modes, Mode Settings
- @section Declarations
- @noindent
- A @dfn{declaration} is a statement you make that promises you will
- use a certain variable or function in a restricted way. This may
- give Calc the freedom to do things that it couldn't do if it had to
- take the fully general situation into account.
- @menu
- * Declaration Basics::
- * Kinds of Declarations::
- * Functions for Declarations::
- @end menu
- @node Declaration Basics, Kinds of Declarations, Declarations, Declarations
- @subsection Declaration Basics
- @noindent
- @kindex s d
- @pindex calc-declare-variable
- The @kbd{s d} (@code{calc-declare-variable}) command is the easiest
- way to make a declaration for a variable. This command prompts for
- the variable name, then prompts for the declaration. The default
- at the declaration prompt is the previous declaration, if any.
- You can edit this declaration, or press @kbd{C-k} to erase it and
- type a new declaration. (Or, erase it and press @key{RET} to clear
- the declaration, effectively ``undeclaring'' the variable.)
- A declaration is in general a vector of @dfn{type symbols} and
- @dfn{range} values. If there is only one type symbol or range value,
- you can write it directly rather than enclosing it in a vector.
- For example, @kbd{s d foo @key{RET} real @key{RET}} declares @code{foo} to
- be a real number, and @kbd{s d bar @key{RET} [int, const, [1..6]] @key{RET}}
- declares @code{bar} to be a constant integer between 1 and 6.
- (Actually, you can omit the outermost brackets and Calc will
- provide them for you: @kbd{s d bar @key{RET} int, const, [1..6] @key{RET}}.)
- @cindex @code{Decls} variable
- @vindex Decls
- Declarations in Calc are kept in a special variable called @code{Decls}.
- This variable encodes the set of all outstanding declarations in
- the form of a matrix. Each row has two elements: A variable or
- vector of variables declared by that row, and the declaration
- specifier as described above. You can use the @kbd{s D} command to
- edit this variable if you wish to see all the declarations at once.
- @xref{Operations on Variables}, for a description of this command
- and the @kbd{s p} command that allows you to save your declarations
- permanently if you wish.
- Items being declared can also be function calls. The arguments in
- the call are ignored; the effect is to say that this function returns
- values of the declared type for any valid arguments. The @kbd{s d}
- command declares only variables, so if you wish to make a function
- declaration you will have to edit the @code{Decls} matrix yourself.
- For example, the declaration matrix
- @smallexample
- @group
- [ [ foo, real ]
- [ [j, k, n], int ]
- [ f(1,2,3), [0 .. inf) ] ]
- @end group
- @end smallexample
- @noindent
- declares that @code{foo} represents a real number, @code{j}, @code{k}
- and @code{n} represent integers, and the function @code{f} always
- returns a real number in the interval shown.
- @vindex All
- If there is a declaration for the variable @code{All}, then that
- declaration applies to all variables that are not otherwise declared.
- It does not apply to function names. For example, using the row
- @samp{[All, real]} says that all your variables are real unless they
- are explicitly declared without @code{real} in some other row.
- The @kbd{s d} command declares @code{All} if you give a blank
- response to the variable-name prompt.
- @node Kinds of Declarations, Functions for Declarations, Declaration Basics, Declarations
- @subsection Kinds of Declarations
- @noindent
- The type-specifier part of a declaration (that is, the second prompt
- in the @kbd{s d} command) can be a type symbol, an interval, or a
- vector consisting of zero or more type symbols followed by zero or
- more intervals or numbers that represent the set of possible values
- for the variable.
- @smallexample
- @group
- [ [ a, [1, 2, 3, 4, 5] ]
- [ b, [1 .. 5] ]
- [ c, [int, 1 .. 5] ] ]
- @end group
- @end smallexample
- Here @code{a} is declared to contain one of the five integers shown;
- @code{b} is any number in the interval from 1 to 5 (any real number
- since we haven't specified), and @code{c} is any integer in that
- interval. Thus the declarations for @code{a} and @code{c} are
- nearly equivalent (see below).
- The type-specifier can be the empty vector @samp{[]} to say that
- nothing is known about a given variable's value. This is the same
- as not declaring the variable at all except that it overrides any
- @code{All} declaration which would otherwise apply.
- The initial value of @code{Decls} is the empty vector @samp{[]}.
- If @code{Decls} has no stored value or if the value stored in it
- is not valid, it is ignored and there are no declarations as far
- as Calc is concerned. (The @kbd{s d} command will replace such a
- malformed value with a fresh empty matrix, @samp{[]}, before recording
- the new declaration.) Unrecognized type symbols are ignored.
- The following type symbols describe what sorts of numbers will be
- stored in a variable:
- @table @code
- @item int
- Integers.
- @item numint
- Numerical integers. (Integers or integer-valued floats.)
- @item frac
- Fractions. (Rational numbers which are not integers.)
- @item rat
- Rational numbers. (Either integers or fractions.)
- @item float
- Floating-point numbers.
- @item real
- Real numbers. (Integers, fractions, or floats. Actually,
- intervals and error forms with real components also count as
- reals here.)
- @item pos
- Positive real numbers. (Strictly greater than zero.)
- @item nonneg
- Nonnegative real numbers. (Greater than or equal to zero.)
- @item number
- Numbers. (Real or complex.)
- @end table
- Calc uses this information to determine when certain simplifications
- of formulas are safe. For example, @samp{(x^y)^z} cannot be
- simplified to @samp{x^(y z)} in general; for example,
- @samp{((-3)^2)^1:2} is 3, but @samp{(-3)^(2*1:2) = (-3)^1} is @i{-3}.
- However, this simplification @emph{is} safe if @code{z} is known
- to be an integer, or if @code{x} is known to be a nonnegative
- real number. If you have given declarations that allow Calc to
- deduce either of these facts, Calc will perform this simplification
- of the formula.
- Calc can apply a certain amount of logic when using declarations.
- For example, @samp{(x^y)^(2n+1)} will be simplified if @code{n}
- has been declared @code{int}; Calc knows that an integer times an
- integer, plus an integer, must always be an integer. (In fact,
- Calc would simplify @samp{(-x)^(2n+1)} to @samp{-(x^(2n+1))} since
- it is able to determine that @samp{2n+1} must be an odd integer.)
- Similarly, @samp{(abs(x)^y)^z} will be simplified to @samp{abs(x)^(y z)}
- because Calc knows that the @code{abs} function always returns a
- nonnegative real. If you had a @code{myabs} function that also had
- this property, you could get Calc to recognize it by adding the row
- @samp{[myabs(), nonneg]} to the @code{Decls} matrix.
- One instance of this simplification is @samp{sqrt(x^2)} (since the
- @code{sqrt} function is effectively a one-half power). Normally
- Calc leaves this formula alone. After the command
- @kbd{s d x @key{RET} real @key{RET}}, however, it can simplify the formula to
- @samp{abs(x)}. And after @kbd{s d x @key{RET} nonneg @key{RET}}, Calc can
- simplify this formula all the way to @samp{x}.
- If there are any intervals or real numbers in the type specifier,
- they comprise the set of possible values that the variable or
- function being declared can have. In particular, the type symbol
- @code{real} is effectively the same as the range @samp{[-inf .. inf]}
- (note that infinity is included in the range of possible values);
- @code{pos} is the same as @samp{(0 .. inf]}, and @code{nonneg} is
- the same as @samp{[0 .. inf]}. Saying @samp{[real, [-5 .. 5]]} is
- redundant because the fact that the variable is real can be
- deduced just from the interval, but @samp{[int, [-5 .. 5]]} and
- @samp{[rat, [-5 .. 5]]} are useful combinations.
- Note that the vector of intervals or numbers is in the same format
- used by Calc's set-manipulation commands. @xref{Set Operations}.
- The type specifier @samp{[1, 2, 3]} is equivalent to
- @samp{[numint, 1, 2, 3]}, @emph{not} to @samp{[int, 1, 2, 3]}.
- In other words, the range of possible values means only that
- the variable's value must be numerically equal to a number in
- that range, but not that it must be equal in type as well.
- Calc's set operations act the same way; @samp{in(2, [1., 2., 3.])}
- and @samp{in(1.5, [1:2, 3:2, 5:2])} both report ``true.''
- If you use a conflicting combination of type specifiers, the
- results are unpredictable. An example is @samp{[pos, [0 .. 5]]},
- where the interval does not lie in the range described by the
- type symbol.
- ``Real'' declarations mostly affect simplifications involving powers
- like the one described above. Another case where they are used
- is in the @kbd{a P} command which returns a list of all roots of a
- polynomial; if the variable has been declared real, only the real
- roots (if any) will be included in the list.
- ``Integer'' declarations are used for simplifications which are valid
- only when certain values are integers (such as @samp{(x^y)^z}
- shown above).
- Another command that makes use of declarations is @kbd{a s}, when
- simplifying equations and inequalities. It will cancel @code{x}
- from both sides of @samp{a x = b x} only if it is sure @code{x}
- is non-zero, say, because it has a @code{pos} declaration.
- To declare specifically that @code{x} is real and non-zero,
- use @samp{[[-inf .. 0), (0 .. inf]]}. (There is no way in the
- current notation to say that @code{x} is nonzero but not necessarily
- real.) The @kbd{a e} command does ``unsafe'' simplifications,
- including cancelling @samp{x} from the equation when @samp{x} is
- not known to be nonzero.
- Another set of type symbols distinguish between scalars and vectors.
- @table @code
- @item scalar
- The value is not a vector.
- @item vector
- The value is a vector.
- @item matrix
- The value is a matrix (a rectangular vector of vectors).
- @end table
- These type symbols can be combined with the other type symbols
- described above; @samp{[int, matrix]} describes an object which
- is a matrix of integers.
- Scalar/vector declarations are used to determine whether certain
- algebraic operations are safe. For example, @samp{[a, b, c] + x}
- is normally not simplified to @samp{[a + x, b + x, c + x]}, but
- it will be if @code{x} has been declared @code{scalar}. On the
- other hand, multiplication is usually assumed to be commutative,
- but the terms in @samp{x y} will never be exchanged if both @code{x}
- and @code{y} are known to be vectors or matrices. (Calc currently
- never distinguishes between @code{vector} and @code{matrix}
- declarations.)
- @xref{Matrix Mode}, for a discussion of ``matrix mode'' and
- ``scalar mode,'' which are similar to declaring @samp{[All, matrix]}
- or @samp{[All, scalar]} but much more convenient.
- One more type symbol that is recognized is used with the @kbd{H a d}
- command for taking total derivatives of a formula. @xref{Calculus}.
- @table @code
- @item const
- The value is a constant with respect to other variables.
- @end table
- Calc does not check the declarations for a variable when you store
- a value in it. However, storing @i{-3.5} in a variable that has
- been declared @code{pos}, @code{int}, or @code{matrix} may have
- unexpected effects; Calc may evaluate @samp{sqrt(x^2)} to @cite{3.5}
- if it substitutes the value first, or to @cite{-3.5} if @code{x}
- was declared @code{pos} and the formula @samp{sqrt(x^2)} is
- simplified to @samp{x} before the value is substituted. Before
- using a variable for a new purpose, it is best to use @kbd{s d}
- or @kbd{s D} to check to make sure you don't still have an old
- declaration for the variable that will conflict with its new meaning.
- @node Functions for Declarations, , Kinds of Declarations, Declarations
- @subsection Functions for Declarations
- @noindent
- Calc has a set of functions for accessing the current declarations
- in a convenient manner. These functions return 1 if the argument
- can be shown to have the specified property, or 0 if the argument
- can be shown @emph{not} to have that property; otherwise they are
- left unevaluated. These functions are suitable for use with rewrite
- rules (@pxref{Conditional Rewrite Rules}) or programming constructs
- (@pxref{Conditionals in Macros}). They can be entered only using
- algebraic notation. @xref{Logical Operations}, for functions
- that perform other tests not related to declarations.
- For example, @samp{dint(17)} returns 1 because 17 is an integer, as
- do @samp{dint(n)} and @samp{dint(2 n - 3)} if @code{n} has been declared
- @code{int}, but @samp{dint(2.5)} and @samp{dint(n + 0.5)} return 0.
- Calc consults knowledge of its own built-in functions as well as your
- own declarations: @samp{dint(floor(x))} returns 1.
- @ignore
- @starindex
- @end ignore
- @tindex dint
- @ignore
- @starindex
- @end ignore
- @tindex dnumint
- @ignore
- @starindex
- @end ignore
- @tindex dnatnum
- The @code{dint} function checks if its argument is an integer.
- The @code{dnatnum} function checks if its argument is a natural
- number, i.e., a nonnegative integer. The @code{dnumint} function
- checks if its argument is numerically an integer, i.e., either an
- integer or an integer-valued float. Note that these and the other
- data type functions also accept vectors or matrices composed of
- suitable elements, and that real infinities @samp{inf} and @samp{-inf}
- are considered to be integers for the purposes of these functions.
- @ignore
- @starindex
- @end ignore
- @tindex drat
- The @code{drat} function checks if its argument is rational, i.e.,
- an integer or fraction. Infinities count as rational, but intervals
- and error forms do not.
- @ignore
- @starindex
- @end ignore
- @tindex dreal
- The @code{dreal} function checks if its argument is real. This
- includes integers, fractions, floats, real error forms, and intervals.
- @ignore
- @starindex
- @end ignore
- @tindex dimag
- The @code{dimag} function checks if its argument is imaginary,
- i.e., is mathematically equal to a real number times @cite{i}.
- @ignore
- @starindex
- @end ignore
- @tindex dpos
- @ignore
- @starindex
- @end ignore
- @tindex dneg
- @ignore
- @starindex
- @end ignore
- @tindex dnonneg
- The @code{dpos} function checks for positive (but nonzero) reals.
- The @code{dneg} function checks for negative reals. The @code{dnonneg}
- function checks for nonnegative reals, i.e., reals greater than or
- equal to zero. Note that the @kbd{a s} command can simplify an
- expression like @cite{x > 0} to 1 or 0 using @code{dpos}, and that
- @kbd{a s} is effectively applied to all conditions in rewrite rules,
- so the actual functions @code{dpos}, @code{dneg}, and @code{dnonneg}
- are rarely necessary.
- @ignore
- @starindex
- @end ignore
- @tindex dnonzero
- The @code{dnonzero} function checks that its argument is nonzero.
- This includes all nonzero real or complex numbers, all intervals that
- do not include zero, all nonzero modulo forms, vectors all of whose
- elements are nonzero, and variables or formulas whose values can be
- deduced to be nonzero. It does not include error forms, since they
- represent values which could be anything including zero. (This is
- also the set of objects considered ``true'' in conditional contexts.)
- @ignore
- @starindex
- @end ignore
- @tindex deven
- @ignore
- @starindex
- @end ignore
- @tindex dodd
- The @code{deven} function returns 1 if its argument is known to be
- an even integer (or integer-valued float); it returns 0 if its argument
- is known not to be even (because it is known to be odd or a non-integer).
- The @kbd{a s} command uses this to simplify a test of the form
- @samp{x % 2 = 0}. There is also an analogous @code{dodd} function.
- @ignore
- @starindex
- @end ignore
- @tindex drange
- The @code{drange} function returns a set (an interval or a vector
- of intervals and/or numbers; @pxref{Set Operations}) that describes
- the set of possible values of its argument. If the argument is
- a variable or a function with a declaration, the range is copied
- from the declaration. Otherwise, the possible signs of the
- expression are determined using a method similar to @code{dpos},
- etc., and a suitable set like @samp{[0 .. inf]} is returned. If
- the expression is not provably real, the @code{drange} function
- remains unevaluated.
- @ignore
- @starindex
- @end ignore
- @tindex dscalar
- The @code{dscalar} function returns 1 if its argument is provably
- scalar, or 0 if its argument is provably non-scalar. It is left
- unevaluated if this cannot be determined. (If matrix mode or scalar
- mode are in effect, this function returns 1 or 0, respectively,
- if it has no other information.) When Calc interprets a condition
- (say, in a rewrite rule) it considers an unevaluated formula to be
- ``false.'' Thus, @samp{dscalar(a)} is ``true'' only if @code{a} is
- provably scalar, and @samp{!dscalar(a)} is ``true'' only if @code{a}
- is provably non-scalar; both are ``false'' if there is insufficient
- information to tell.
- @node Display Modes, Language Modes, Declarations, Mode Settings
- @section Display Modes
- @noindent
- The commands in this section are two-key sequences beginning with the
- @kbd{d} prefix. The @kbd{d l} (@code{calc-line-numbering}) and @kbd{d b}
- (@code{calc-line-breaking}) commands are described elsewhere;
- @pxref{Stack Basics} and @pxref{Normal Language Modes}, respectively.
- Display formats for vectors and matrices are also covered elsewhere;
- @pxref{Vector and Matrix Formats}.@refill
- One thing all display modes have in common is their treatment of the
- @kbd{H} prefix. This prefix causes any mode command that would normally
- refresh the stack to leave the stack display alone. The word ``Dirty''
- will appear in the mode line when Calc thinks the stack display may not
- reflect the latest mode settings.
- @kindex d @key{RET}
- @pindex calc-refresh-top
- The @kbd{d @key{RET}} (@code{calc-refresh-top}) command reformats the
- top stack entry according to all the current modes. Positive prefix
- arguments reformat the top @var{n} entries; negative prefix arguments
- reformat the specified entry, and a prefix of zero is equivalent to
- @kbd{d @key{SPC}} (@code{calc-refresh}), which reformats the entire stack.
- For example, @kbd{H d s M-2 d @key{RET}} changes to scientific notation
- but reformats only the top two stack entries in the new mode.
- The @kbd{I} prefix has another effect on the display modes. The mode
- is set only temporarily; the top stack entry is reformatted according
- to that mode, then the original mode setting is restored. In other
- words, @kbd{I d s} is equivalent to @kbd{H d s d @key{RET} H d (@var{old mode})}.
- @menu
- * Radix Modes::
- * Grouping Digits::
- * Float Formats::
- * Complex Formats::
- * Fraction Formats::
- * HMS Formats::
- * Date Formats::
- * Truncating the Stack::
- * Justification::
- * Labels::
- @end menu
- @node Radix Modes, Grouping Digits, Display Modes, Display Modes
- @subsection Radix Modes
- @noindent
- @cindex Radix display
- @cindex Non-decimal numbers
- @cindex Decimal and non-decimal numbers
- Calc normally displays numbers in decimal (@dfn{base-10} or @dfn{radix-10})
- notation. Calc can actually display in any radix from two (binary) to 36.
- When the radix is above 10, the letters @code{A} to @code{Z} are used as
- digits. When entering such a number, letter keys are interpreted as
- potential digits rather than terminating numeric entry mode.
- @kindex d 2
- @kindex d 8
- @kindex d 6
- @kindex d 0
- @cindex Hexadecimal integers
- @cindex Octal integers
- The key sequences @kbd{d 2}, @kbd{d 8}, @kbd{d 6}, and @kbd{d 0} select
- binary, octal, hexadecimal, and decimal as the current display radix,
- respectively. Numbers can always be entered in any radix, though the
- current radix is used as a default if you press @kbd{#} without any initial
- digits. A number entered without a @kbd{#} is @emph{always} interpreted
- as decimal.@refill
- @kindex d r
- @pindex calc-radix
- To set the radix generally, use @kbd{d r} (@code{calc-radix}) and enter
- an integer from 2 to 36. You can specify the radix as a numeric prefix
- argument; otherwise you will be prompted for it.
- @kindex d z
- @pindex calc-leading-zeros
- @cindex Leading zeros
- Integers normally are displayed with however many digits are necessary to
- represent the integer and no more. The @kbd{d z} (@code{calc-leading-zeros})
- command causes integers to be padded out with leading zeros according to the
- current binary word size. (@xref{Binary Functions}, for a discussion of
- word size.) If the absolute value of the word size is @cite{w}, all integers
- are displayed with at least enough digits to represent @c{$2^w-1$}
- @cite{(2^w)-1} in the
- current radix. (Larger integers will still be displayed in their entirety.)
- @node Grouping Digits, Float Formats, Radix Modes, Display Modes
- @subsection Grouping Digits
- @noindent
- @kindex d g
- @pindex calc-group-digits
- @cindex Grouping digits
- @cindex Digit grouping
- Long numbers can be hard to read if they have too many digits. For
- example, the factorial of 30 is 33 digits long! Press @kbd{d g}
- (@code{calc-group-digits}) to enable @dfn{grouping} mode, in which digits
- are displayed in clumps of 3 or 4 (depending on the current radix)
- separated by commas.
- The @kbd{d g} command toggles grouping on and off.
- With a numerix prefix of 0, this command displays the current state of
- the grouping flag; with an argument of minus one it disables grouping;
- with a positive argument @cite{N} it enables grouping on every @cite{N}
- digits. For floating-point numbers, grouping normally occurs only
- before the decimal point. A negative prefix argument @cite{-N} enables
- grouping every @cite{N} digits both before and after the decimal point.@refill
- @kindex d ,
- @pindex calc-group-char
- The @kbd{d ,} (@code{calc-group-char}) command allows you to choose any
- character as the grouping separator. The default is the comma character.
- If you find it difficult to read vectors of large integers grouped with
- commas, you may wish to use spaces or some other character instead.
- This command takes the next character you type, whatever it is, and
- uses it as the digit separator. As a special case, @kbd{d , \} selects
- @samp{\,} (@TeX{}'s thin-space symbol) as the digit separator.
- Please note that grouped numbers will not generally be parsed correctly
- if re-read in textual form, say by the use of @kbd{M-# y} and @kbd{M-# g}.
- (@xref{Kill and Yank}, for details on these commands.) One exception is
- the @samp{\,} separator, which doesn't interfere with parsing because it
- is ignored by @TeX{} language mode.
- @node Float Formats, Complex Formats, Grouping Digits, Display Modes
- @subsection Float Formats
- @noindent
- Floating-point quantities are normally displayed in standard decimal
- form, with scientific notation used if the exponent is especially high
- or low. All significant digits are normally displayed. The commands
- in this section allow you to choose among several alternative display
- formats for floats.
- @kindex d n
- @pindex calc-normal-notation
- The @kbd{d n} (@code{calc-normal-notation}) command selects the normal
- display format. All significant figures in a number are displayed.
- With a positive numeric prefix, numbers are rounded if necessary to
- that number of significant digits. With a negative numerix prefix,
- the specified number of significant digits less than the current
- precision is used. (Thus @kbd{C-u -2 d n} displays 10 digits if the
- current precision is 12.)
- @kindex d f
- @pindex calc-fix-notation
- The @kbd{d f} (@code{calc-fix-notation}) command selects fixed-point
- notation. The numeric argument is the number of digits after the
- decimal point, zero or more. This format will relax into scientific
- notation if a nonzero number would otherwise have been rounded all the
- way to zero. Specifying a negative number of digits is the same as
- for a positive number, except that small nonzero numbers will be rounded
- to zero rather than switching to scientific notation.
- @kindex d s
- @pindex calc-sci-notation
- @cindex Scientific notation, display of
- The @kbd{d s} (@code{calc-sci-notation}) command selects scientific
- notation. A positive argument sets the number of significant figures
- displayed, of which one will be before and the rest after the decimal
- point. A negative argument works the same as for @kbd{d n} format.
- The default is to display all significant digits.
- @kindex d e
- @pindex calc-eng-notation
- @cindex Engineering notation, display of
- The @kbd{d e} (@code{calc-eng-notation}) command selects engineering
- notation. This is similar to scientific notation except that the
- exponent is rounded down to a multiple of three, with from one to three
- digits before the decimal point. An optional numeric prefix sets the
- number of significant digits to display, as for @kbd{d s}.
- It is important to distinguish between the current @emph{precision} and
- the current @emph{display format}. After the commands @kbd{C-u 10 p}
- and @kbd{C-u 6 d n} the Calculator computes all results to ten
- significant figures but displays only six. (In fact, intermediate
- calculations are often carried to one or two more significant figures,
- but values placed on the stack will be rounded down to ten figures.)
- Numbers are never actually rounded to the display precision for storage,
- except by commands like @kbd{C-k} and @kbd{M-# y} which operate on the
- actual displayed text in the Calculator buffer.
- @kindex d .
- @pindex calc-point-char
- The @kbd{d .} (@code{calc-point-char}) command selects the character used
- as a decimal point. Normally this is a period; users in some countries
- may wish to change this to a comma. Note that this is only a display
- style; on entry, periods must always be used to denote floating-point
- numbers, and commas to separate elements in a list.
- @node Complex Formats, Fraction Formats, Float Formats, Display Modes
- @subsection Complex Formats
- @noindent
- @kindex d c
- @pindex calc-complex-notation
- There are three supported notations for complex numbers in rectangular
- form. The default is as a pair of real numbers enclosed in parentheses
- and separated by a comma: @samp{(a,b)}. The @kbd{d c}
- (@code{calc-complex-notation}) command selects this style.@refill
- @kindex d i
- @pindex calc-i-notation
- @kindex d j
- @pindex calc-j-notation
- The other notations are @kbd{d i} (@code{calc-i-notation}), in which
- numbers are displayed in @samp{a+bi} form, and @kbd{d j}
- (@code{calc-j-notation}) which displays the form @samp{a+bj} preferred
- in some disciplines.@refill
- @cindex @code{i} variable
- @vindex i
- Complex numbers are normally entered in @samp{(a,b)} format.
- If you enter @samp{2+3i} as an algebraic formula, it will be stored as
- the formula @samp{2 + 3 * i}. However, if you use @kbd{=} to evaluate
- this formula and you have not changed the variable @samp{i}, the @samp{i}
- will be interpreted as @samp{(0,1)} and the formula will be simplified
- to @samp{(2,3)}. Other commands (like @code{calc-sin}) will @emph{not}
- interpret the formula @samp{2 + 3 * i} as a complex number.
- @xref{Variables}, under ``special constants.''@refill
- @node Fraction Formats, HMS Formats, Complex Formats, Display Modes
- @subsection Fraction Formats
- @noindent
- @kindex d o
- @pindex calc-over-notation
- Display of fractional numbers is controlled by the @kbd{d o}
- (@code{calc-over-notation}) command. By default, a number like
- eight thirds is displayed in the form @samp{8:3}. The @kbd{d o} command
- prompts for a one- or two-character format. If you give one character,
- that character is used as the fraction separator. Common separators are
- @samp{:} and @samp{/}. (During input of numbers, the @kbd{:} key must be
- used regardless of the display format; in particular, the @kbd{/} is used
- for RPN-style division, @emph{not} for entering fractions.)
- If you give two characters, fractions use ``integer-plus-fractional-part''
- notation. For example, the format @samp{+/} would display eight thirds
- as @samp{2+2/3}. If two colons are present in a number being entered,
- the number is interpreted in this form (so that the entries @kbd{2:2:3}
- and @kbd{8:3} are equivalent).
- It is also possible to follow the one- or two-character format with
- a number. For example: @samp{:10} or @samp{+/3}. In this case,
- Calc adjusts all fractions that are displayed to have the specified
- denominator, if possible. Otherwise it adjusts the denominator to
- be a multiple of the specified value. For example, in @samp{:6} mode
- the fraction @cite{1:6} will be unaffected, but @cite{2:3} will be
- displayed as @cite{4:6}, @cite{1:2} will be displayed as @cite{3:6},
- and @cite{1:8} will be displayed as @cite{3:24}. Integers are also
- affected by this mode: 3 is displayed as @cite{18:6}. Note that the
- format @samp{:1} writes fractions the same as @samp{:}, but it writes
- integers as @cite{n:1}.
- The fraction format does not affect the way fractions or integers are
- stored, only the way they appear on the screen. The fraction format
- never affects floats.
- @node HMS Formats, Date Formats, Fraction Formats, Display Modes
- @subsection HMS Formats
- @noindent
- @kindex d h
- @pindex calc-hms-notation
- The @kbd{d h} (@code{calc-hms-notation}) command controls the display of
- HMS (hours-minutes-seconds) forms. It prompts for a string which
- consists basically of an ``hours'' marker, optional punctuation, a
- ``minutes'' marker, more optional punctuation, and a ``seconds'' marker.
- Punctuation is zero or more spaces, commas, or semicolons. The hours
- marker is one or more non-punctuation characters. The minutes and
- seconds markers must be single non-punctuation characters.
- The default HMS format is @samp{@@ ' "}, producing HMS values of the form
- @samp{23@@ 30' 15.75"}. The format @samp{deg, ms} would display this same
- value as @samp{23deg, 30m15.75s}. During numeric entry, the @kbd{h} or @kbd{o}
- keys are recognized as synonyms for @kbd{@@} regardless of display format.
- The @kbd{m} and @kbd{s} keys are recognized as synonyms for @kbd{'} and
- @kbd{"}, respectively, but only if an @kbd{@@} (or @kbd{h} or @kbd{o}) has
- already been typed; otherwise, they have their usual meanings
- (@kbd{m-} prefix and @kbd{s-} prefix). Thus, @kbd{5 "}, @kbd{0 @@ 5 "}, and
- @kbd{0 h 5 s} are some of the ways to enter the quantity ``five seconds.''
- The @kbd{'} key is recognized as ``minutes'' only if @kbd{@@} (or @kbd{h} or
- @kbd{o}) has already been pressed; otherwise it means to switch to algebraic
- entry.
- @node Date Formats, Truncating the Stack, HMS Formats, Display Modes
- @subsection Date Formats
- @noindent
- @kindex d d
- @pindex calc-date-notation
- The @kbd{d d} (@code{calc-date-notation}) command controls the display
- of date forms (@pxref{Date Forms}). It prompts for a string which
- contains letters that represent the various parts of a date and time.
- To show which parts should be omitted when the form represents a pure
- date with no time, parts of the string can be enclosed in @samp{< >}
- marks. If you don't include @samp{< >} markers in the format, Calc
- guesses at which parts, if any, should be omitted when formatting
- pure dates.
- The default format is: @samp{<H:mm:SSpp >Www Mmm D, YYYY}.
- An example string in this format is @samp{3:32pm Wed Jan 9, 1991}.
- If you enter a blank format string, this default format is
- reestablished.
- Calc uses @samp{< >} notation for nameless functions as well as for
- dates. @xref{Specifying Operators}. To avoid confusion with nameless
- functions, your date formats should avoid using the @samp{#} character.
- @menu
- * Date Formatting Codes::
- * Free-Form Dates::
- * Standard Date Formats::
- @end menu
- @node Date Formatting Codes, Free-Form Dates, Date Formats, Date Formats
- @subsubsection Date Formatting Codes
- @noindent
- When displaying a date, the current date format is used. All
- characters except for letters and @samp{<} and @samp{>} are
- copied literally when dates are formatted. The portion between
- @samp{< >} markers is omitted for pure dates, or included for
- date/time forms. Letters are interpreted according to the table
- below.
- When dates are read in during algebraic entry, Calc first tries to
- match the input string to the current format either with or without
- the time part. The punctuation characters (including spaces) must
- match exactly; letter fields must correspond to suitable text in
- the input. If this doesn't work, Calc checks if the input is a
- simple number; if so, the number is interpreted as a number of days
- since Jan 1, 1 AD. Otherwise, Calc tries a much more relaxed and
- flexible algorithm which is described in the next section.
- Weekday names are ignored during reading.
- Two-digit year numbers are interpreted as lying in the range
- from 1941 to 2039. Years outside that range are always
- entered and displayed in full. Year numbers with a leading
- @samp{+} sign are always interpreted exactly, allowing the
- entry and display of the years 1 through 99 AD.
- Here is a complete list of the formatting codes for dates:
- @table @asis
- @item Y
- Year: ``91'' for 1991, ``7'' for 2007, ``+23'' for 23 AD.
- @item YY
- Year: ``91'' for 1991, ``07'' for 2007, ``+23'' for 23 AD.
- @item BY
- Year: ``91'' for 1991, `` 7'' for 2007, ``+23'' for 23 AD.
- @item YYY
- Year: ``1991'' for 1991, ``23'' for 23 AD.
- @item YYYY
- Year: ``1991'' for 1991, ``+23'' for 23 AD.
- @item aa
- Year: ``ad'' or blank.
- @item AA
- Year: ``AD'' or blank.
- @item aaa
- Year: ``ad '' or blank. (Note trailing space.)
- @item AAA
- Year: ``AD '' or blank.
- @item aaaa
- Year: ``a.d.'' or blank.
- @item AAAA
- Year: ``A.D.'' or blank.
- @item bb
- Year: ``bc'' or blank.
- @item BB
- Year: ``BC'' or blank.
- @item bbb
- Year: `` bc'' or blank. (Note leading space.)
- @item BBB
- Year: `` BC'' or blank.
- @item bbbb
- Year: ``b.c.'' or blank.
- @item BBBB
- Year: ``B.C.'' or blank.
- @item M
- Month: ``8'' for August.
- @item MM
- Month: ``08'' for August.
- @item BM
- Month: `` 8'' for August.
- @item MMM
- Month: ``AUG'' for August.
- @item Mmm
- Month: ``Aug'' for August.
- @item mmm
- Month: ``aug'' for August.
- @item MMMM
- Month: ``AUGUST'' for August.
- @item Mmmm
- Month: ``August'' for August.
- @item D
- Day: ``7'' for 7th day of month.
- @item DD
- Day: ``07'' for 7th day of month.
- @item BD
- Day: `` 7'' for 7th day of month.
- @item W
- Weekday: ``0'' for Sunday, ``6'' for Saturday.
- @item WWW
- Weekday: ``SUN'' for Sunday.
- @item Www
- Weekday: ``Sun'' for Sunday.
- @item www
- Weekday: ``sun'' for Sunday.
- @item WWWW
- Weekday: ``SUNDAY'' for Sunday.
- @item Wwww
- Weekday: ``Sunday'' for Sunday.
- @item d
- Day of year: ``34'' for Feb. 3.
- @item ddd
- Day of year: ``034'' for Feb. 3.
- @item bdd
- Day of year: `` 34'' for Feb. 3.
- @item h
- Hour: ``5'' for 5 AM; ``17'' for 5 PM.
- @item hh
- Hour: ``05'' for 5 AM; ``17'' for 5 PM.
- @item bh
- Hour: `` 5'' for 5 AM; ``17'' for 5 PM.
- @item H
- Hour: ``5'' for 5 AM and 5 PM.
- @item HH
- Hour: ``05'' for 5 AM and 5 PM.
- @item BH
- Hour: `` 5'' for 5 AM and 5 PM.
- @item p
- AM/PM: ``a'' or ``p''.
- @item P
- AM/PM: ``A'' or ``P''.
- @item pp
- AM/PM: ``am'' or ``pm''.
- @item PP
- AM/PM: ``AM'' or ``PM''.
- @item pppp
- AM/PM: ``a.m.'' or ``p.m.''.
- @item PPPP
- AM/PM: ``A.M.'' or ``P.M.''.
- @item m
- Minutes: ``7'' for 7.
- @item mm
- Minutes: ``07'' for 7.
- @item bm
- Minutes: `` 7'' for 7.
- @item s
- Seconds: ``7'' for 7; ``7.23'' for 7.23.
- @item ss
- Seconds: ``07'' for 7; ``07.23'' for 7.23.
- @item bs
- Seconds: `` 7'' for 7; `` 7.23'' for 7.23.
- @item SS
- Optional seconds: ``07'' for 7; blank for 0.
- @item BS
- Optional seconds: `` 7'' for 7; blank for 0.
- @item N
- Numeric date/time: ``726842.25'' for 6:00am Wed Jan 9, 1991.
- @item n
- Numeric date: ``726842'' for any time on Wed Jan 9, 1991.
- @item J
- Julian date/time: ``2448265.75'' for 6:00am Wed Jan 9, 1991.
- @item j
- Julian date: ``2448266'' for any time on Wed Jan 9, 1991.
- @item U
- Unix time: ``663400800'' for 6:00am Wed Jan 9, 1991.
- @item X
- Brackets suppression. An ``X'' at the front of the format
- causes the surrounding @w{@samp{< >}} delimiters to be omitted
- when formatting dates. Note that the brackets are still
- required for algebraic entry.
- @end table
- If ``SS'' or ``BS'' (optional seconds) is preceded by a colon, the
- colon is also omitted if the seconds part is zero.
- If ``bb,'' ``bbb'' or ``bbbb'' or their upper-case equivalents
- appear in the format, then negative year numbers are displayed
- without a minus sign. Note that ``aa'' and ``bb'' are mutually
- exclusive. Some typical usages would be @samp{YYYY AABB};
- @samp{AAAYYYYBBB}; @samp{YYYYBBB}.
- The formats ``YY,'' ``YYYY,'' ``MM,'' ``DD,'' ``ddd,'' ``hh,'' ``HH,''
- ``mm,'' ``ss,'' and ``SS'' actually match any number of digits during
- reading unless several of these codes are strung together with no
- punctuation in between, in which case the input must have exactly as
- many digits as there are letters in the format.
- The ``j,'' ``J,'' and ``U'' formats do not make any time zone
- adjustment. They effectively use @samp{julian(x,0)} and
- @samp{unixtime(x,0)} to make the conversion; @pxref{Date Arithmetic}.
- @node Free-Form Dates, Standard Date Formats, Date Formatting Codes, Date Formats
- @subsubsection Free-Form Dates
- @noindent
- When reading a date form during algebraic entry, Calc falls back
- on the algorithm described here if the input does not exactly
- match the current date format. This algorithm generally
- ``does the right thing'' and you don't have to worry about it,
- but it is described here in full detail for the curious.
- Calc does not distinguish between upper- and lower-case letters
- while interpreting dates.
- First, the time portion, if present, is located somewhere in the
- text and then removed. The remaining text is then interpreted as
- the date.
- A time is of the form @samp{hh:mm:ss}, possibly with the seconds
- part omitted and possibly with an AM/PM indicator added to indicate
- 12-hour time. If the AM/PM is present, the minutes may also be
- omitted. The AM/PM part may be any of the words @samp{am},
- @samp{pm}, @samp{noon}, or @samp{midnight}; each of these may be
- abbreviated to one letter, and the alternate forms @samp{a.m.},
- @samp{p.m.}, and @samp{mid} are also understood. Obviously
- @samp{noon} and @samp{midnight} are allowed only on 12:00:00.
- The words @samp{noon}, @samp{mid}, and @samp{midnight} are also
- recognized with no number attached.
- If there is no AM/PM indicator, the time is interpreted in 24-hour
- format.
- To read the date portion, all words and numbers are isolated
- from the string; other characters are ignored. All words must
- be either month names or day-of-week names (the latter of which
- are ignored). Names can be written in full or as three-letter
- abbreviations.
- Large numbers, or numbers with @samp{+} or @samp{-} signs,
- are interpreted as years. If one of the other numbers is
- greater than 12, then that must be the day and the remaining
- number in the input is therefore the month. Otherwise, Calc
- assumes the month, day and year are in the same order that they
- appear in the current date format. If the year is omitted, the
- current year is taken from the system clock.
- If there are too many or too few numbers, or any unrecognizable
- words, then the input is rejected.
- If there are any large numbers (of five digits or more) other than
- the year, they are ignored on the assumption that they are something
- like Julian dates that were included along with the traditional
- date components when the date was formatted.
- One of the words @samp{ad}, @samp{a.d.}, @samp{bc}, or @samp{b.c.}
- may optionally be used; the latter two are equivalent to a
- minus sign on the year value.
- If you always enter a four-digit year, and use a name instead
- of a number for the month, there is no danger of ambiguity.
- @node Standard Date Formats, , Free-Form Dates, Date Formats
- @subsubsection Standard Date Formats
- @noindent
- There are actually ten standard date formats, numbered 0 through 9.
- Entering a blank line at the @kbd{d d} command's prompt gives
- you format number 1, Calc's usual format. You can enter any digit
- to select the other formats.
- To create your own standard date formats, give a numeric prefix
- argument from 0 to 9 to the @w{@kbd{d d}} command. The format you
- enter will be recorded as the new standard format of that
- number, as well as becoming the new current date format.
- You can save your formats permanently with the @w{@kbd{m m}}
- command (@pxref{Mode Settings}).
- @table @asis
- @item 0
- @samp{N} (Numerical format)
- @item 1
- @samp{<H:mm:SSpp >Www Mmm D, YYYY} (American format)
- @item 2
- @samp{D Mmm YYYY<, h:mm:SS>} (European format)
- @item 3
- @samp{Www Mmm BD< hh:mm:ss> YYYY} (Unix written date format)
- @item 4
- @samp{M/D/Y< H:mm:SSpp>} (American slashed format)
- @item 5
- @samp{D.M.Y< h:mm:SS>} (European dotted format)
- @item 6
- @samp{M-D-Y< H:mm:SSpp>} (American dashed format)
- @item 7
- @samp{D-M-Y< h:mm:SS>} (European dashed format)
- @item 8
- @samp{j<, h:mm:ss>} (Julian day plus time)
- @item 9
- @samp{YYddd< hh:mm:ss>} (Year-day format)
- @end table
- @node Truncating the Stack, Justification, Date Formats, Display Modes
- @subsection Truncating the Stack
- @noindent
- @kindex d t
- @pindex calc-truncate-stack
- @cindex Truncating the stack
- @cindex Narrowing the stack
- The @kbd{d t} (@code{calc-truncate-stack}) command moves the @samp{.}@:
- line that marks the top-of-stack up or down in the Calculator buffer.
- The number right above that line is considered to the be at the top of
- the stack. Any numbers below that line are ``hidden'' from all stack
- operations. This is similar to the Emacs ``narrowing'' feature, except
- that the values below the @samp{.} are @emph{visible}, just temporarily
- frozen. This feature allows you to keep several independent calculations
- running at once in different parts of the stack, or to apply a certain
- command to an element buried deep in the stack.@refill
- Pressing @kbd{d t} by itself moves the @samp{.} to the line the cursor
- is on. Thus, this line and all those below it become hidden. To un-hide
- these lines, move down to the end of the buffer and press @w{@kbd{d t}}.
- With a positive numeric prefix argument @cite{n}, @kbd{d t} hides the
- bottom @cite{n} values in the buffer. With a negative argument, it hides
- all but the top @cite{n} values. With an argument of zero, it hides zero
- values, i.e., moves the @samp{.} all the way down to the bottom.@refill
- @kindex d [
- @pindex calc-truncate-up
- @kindex d ]
- @pindex calc-truncate-down
- The @kbd{d [} (@code{calc-truncate-up}) and @kbd{d ]}
- (@code{calc-truncate-down}) commands move the @samp{.} up or down one
- line at a time (or several lines with a prefix argument).@refill
- @node Justification, Labels, Truncating the Stack, Display Modes
- @subsection Justification
- @noindent
- @kindex d <
- @pindex calc-left-justify
- @kindex d =
- @pindex calc-center-justify
- @kindex d >
- @pindex calc-right-justify
- Values on the stack are normally left-justified in the window. You can
- control this arrangement by typing @kbd{d <} (@code{calc-left-justify}),
- @kbd{d >} (@code{calc-right-justify}), or @kbd{d =}
- (@code{calc-center-justify}). For example, in right-justification mode,
- stack entries are displayed flush-right against the right edge of the
- window.@refill
- If you change the width of the Calculator window you may have to type
- @kbd{d @key{SPC}} (@code{calc-refresh}) to re-align right-justified or centered
- text.
- Right-justification is especially useful together with fixed-point
- notation (see @code{d f}; @code{calc-fix-notation}). With these modes
- together, the decimal points on numbers will always line up.
- With a numeric prefix argument, the justification commands give you
- a little extra control over the display. The argument specifies the
- horizontal ``origin'' of a display line. It is also possible to
- specify a maximum line width using the @kbd{d b} command (@pxref{Normal
- Language Modes}). For reference, the precise rules for formatting and
- breaking lines are given below. Notice that the interaction between
- origin and line width is slightly different in each justification
- mode.
- In left-justified mode, the line is indented by a number of spaces
- given by the origin (default zero). If the result is longer than the
- maximum line width, if given, or too wide to fit in the Calc window
- otherwise, then it is broken into lines which will fit; each broken
- line is indented to the origin.
- In right-justified mode, lines are shifted right so that the rightmost
- character is just before the origin, or just before the current
- window width if no origin was specified. If the line is too long
- for this, then it is broken; the current line width is used, if
- specified, or else the origin is used as a width if that is
- specified, or else the line is broken to fit in the window.
- In centering mode, the origin is the column number of the center of
- each stack entry. If a line width is specified, lines will not be
- allowed to go past that width; Calc will either indent less or
- break the lines if necessary. If no origin is specified, half the
- line width or Calc window width is used.
- Note that, in each case, if line numbering is enabled the display
- is indented an additional four spaces to make room for the line
- number. The width of the line number is taken into account when
- positioning according to the current Calc window width, but not
- when positioning by explicit origins and widths. In the latter
- case, the display is formatted as specified, and then uniformly
- shifted over four spaces to fit the line numbers.
- @node Labels, , Justification, Display Modes
- @subsection Labels
- @noindent
- @kindex d @{
- @pindex calc-left-label
- The @kbd{d @{} (@code{calc-left-label}) command prompts for a string,
- then displays that string to the left of every stack entry. If the
- entries are left-justified (@pxref{Justification}), then they will
- appear immediately after the label (unless you specified an origin
- greater than the length of the label). If the entries are centered
- or right-justified, the label appears on the far left and does not
- affect the horizontal position of the stack entry.
- Give a blank string (with @kbd{d @{ @key{RET}}) to turn the label off.
- @kindex d @}
- @pindex calc-right-label
- The @kbd{d @}} (@code{calc-right-label}) command similarly adds a
- label on the righthand side. It does not affect positioning of
- the stack entries unless they are right-justified. Also, if both
- a line width and an origin are given in right-justified mode, the
- stack entry is justified to the origin and the righthand label is
- justified to the line width.
- One application of labels would be to add equation numbers to
- formulas you are manipulating in Calc and then copying into a
- document (possibly using Embedded Mode). The equations would
- typically be centered, and the equation numbers would be on the
- left or right as you prefer.
- @node Language Modes, Modes Variable, Display Modes, Mode Settings
- @section Language Modes
- @noindent
- The commands in this section change Calc to use a different notation for
- entry and display of formulas, corresponding to the conventions of some
- other common language such as Pascal or @TeX{}. Objects displayed on the
- stack or yanked from the Calculator to an editing buffer will be formatted
- in the current language; objects entered in algebraic entry or yanked from
- another buffer will be interpreted according to the current language.
- The current language has no effect on things written to or read from the
- trail buffer, nor does it affect numeric entry. Only algebraic entry is
- affected. You can make even algebraic entry ignore the current language
- and use the standard notation by giving a numeric prefix, e.g., @kbd{C-u '}.
- For example, suppose the formula @samp{2*a[1] + atan(a[2])} occurs in a C
- program; elsewhere in the program you need the derivatives of this formula
- with respect to @samp{a[1]} and @samp{a[2]}. First, type @kbd{d C}
- to switch to C notation. Now use @code{C-u M-# g} to grab the formula
- into the Calculator, @kbd{a d a[1] @key{RET}} to differentiate with respect
- to the first variable, and @kbd{M-# y} to yank the formula for the derivative
- back into your C program. Press @kbd{U} to undo the differentiation and
- repeat with @kbd{a d a[2] @key{RET}} for the other derivative.
- Without being switched into C mode first, Calc would have misinterpreted
- the brackets in @samp{a[1]} and @samp{a[2]}, would not have known that
- @code{atan} was equivalent to Calc's built-in @code{arctan} function,
- and would have written the formula back with notations (like implicit
- multiplication) which would not have been legal for a C program.
- As another example, suppose you are maintaining a C program and a @TeX{}
- document, each of which needs a copy of the same formula. You can grab the
- formula from the program in C mode, switch to @TeX{} mode, and yank the
- formula into the document in @TeX{} math-mode format.
- Language modes are selected by typing the letter @kbd{d} followed by a
- shifted letter key.
- @menu
- * Normal Language Modes::
- * C FORTRAN Pascal::
- * TeX Language Mode::
- * Eqn Language Mode::
- * Mathematica Language Mode::
- * Maple Language Mode::
- * Compositions::
- * Syntax Tables::
- @end menu
- @node Normal Language Modes, C FORTRAN Pascal, Language Modes, Language Modes
- @subsection Normal Language Modes
- @noindent
- @kindex d N
- @pindex calc-normal-language
- The @kbd{d N} (@code{calc-normal-language}) command selects the usual
- notation for Calc formulas, as described in the rest of this manual.
- Matrices are displayed in a multi-line tabular format, but all other
- objects are written in linear form, as they would be typed from the
- keyboard.
- @kindex d O
- @pindex calc-flat-language
- @cindex Matrix display
- The @kbd{d O} (@code{calc-flat-language}) command selects a language
- identical with the normal one, except that matrices are written in
- one-line form along with everything else. In some applications this
- form may be more suitable for yanking data into other buffers.
- @kindex d b
- @pindex calc-line-breaking
- @cindex Line breaking
- @cindex Breaking up long lines
- Even in one-line mode, long formulas or vectors will still be split
- across multiple lines if they exceed the width of the Calculator window.
- The @kbd{d b} (@code{calc-line-breaking}) command turns this line-breaking
- feature on and off. (It works independently of the current language.)
- If you give a numeric prefix argument of five or greater to the @kbd{d b}
- command, that argument will specify the line width used when breaking
- long lines.
- @kindex d B
- @pindex calc-big-language
- The @kbd{d B} (@code{calc-big-language}) command selects a language
- which uses textual approximations to various mathematical notations,
- such as powers, quotients, and square roots:
- @example
- ____________
- | a + 1 2
- | ----- + c
- \| b
- @end example
- @noindent
- in place of @samp{sqrt((a+1)/b + c^2)}.
- Subscripts like @samp{a_i} are displayed as actual subscripts in ``big''
- mode. Double subscripts, @samp{a_i_j} (@samp{subscr(subscr(a, i), j)})
- are displayed as @samp{a} with subscripts separated by commas:
- @samp{i, j}. They must still be entered in the usual underscore
- notation.
- One slight ambiguity of Big notation is that
- @example
- 3
- - -
- 4
- @end example
- @noindent
- can represent either the negative rational number @cite{-3:4}, or the
- actual expression @samp{-(3/4)}; but the latter formula would normally
- never be displayed because it would immediately be evaluated to
- @cite{-3:4} or @cite{-0.75}, so this ambiguity is not a problem in
- typical use.
- Non-decimal numbers are displayed with subscripts. Thus there is no
- way to tell the difference between @samp{16#C2} and @samp{C2_16},
- though generally you will know which interpretation is correct.
- Logarithms @samp{log(x,b)} and @samp{log10(x)} also use subscripts
- in Big mode.
- In Big mode, stack entries often take up several lines. To aid
- readability, stack entries are separated by a blank line in this mode.
- You may find it useful to expand the Calc window's height using
- @kbd{C-x ^} (@code{enlarge-window}) or to make the Calc window the only
- one on the screen with @kbd{C-x 1} (@code{delete-other-windows}).
- Long lines are currently not rearranged to fit the window width in
- Big mode, so you may need to use the @kbd{<} and @kbd{>} keys
- to scroll across a wide formula. For really big formulas, you may
- even need to use @kbd{@{} and @kbd{@}} to scroll up and down.
- @kindex d U
- @pindex calc-unformatted-language
- The @kbd{d U} (@code{calc-unformatted-language}) command altogether disables
- the use of operator notation in formulas. In this mode, the formula
- shown above would be displayed:
- @example
- sqrt(add(div(add(a, 1), b), pow(c, 2)))
- @end example
- These four modes differ only in display format, not in the format
- expected for algebraic entry. The standard Calc operators work in
- all four modes, and unformatted notation works in any language mode
- (except that Mathematica mode expects square brackets instead of
- parentheses).
- @node C FORTRAN Pascal, TeX Language Mode, Normal Language Modes, Language Modes
- @subsection C, FORTRAN, and Pascal Modes
- @noindent
- @kindex d C
- @pindex calc-c-language
- @cindex C language
- The @kbd{d C} (@code{calc-c-language}) command selects the conventions
- of the C language for display and entry of formulas. This differs from
- the normal language mode in a variety of (mostly minor) ways. In
- particular, C language operators and operator precedences are used in
- place of Calc's usual ones. For example, @samp{a^b} means @samp{xor(a,b)}
- in C mode; a value raised to a power is written as a function call,
- @samp{pow(a,b)}.
- In C mode, vectors and matrices use curly braces instead of brackets.
- Octal and hexadecimal values are written with leading @samp{0} or @samp{0x}
- rather than using the @samp{#} symbol. Array subscripting is
- translated into @code{subscr} calls, so that @samp{a[i]} in C
- mode is the same as @samp{a_i} in normal mode. Assignments
- turn into the @code{assign} function, which Calc normally displays
- using the @samp{:=} symbol.
- The variables @code{var-pi} and @code{var-e} would be displayed @samp{pi}
- and @samp{e} in normal mode, but in C mode they are displayed as
- @samp{M_PI} and @samp{M_E}, corresponding to the names of constants
- typically provided in the @file{<math.h>} header. Functions whose
- names are different in C are translated automatically for entry and
- display purposes. For example, entering @samp{asin(x)} will push the
- formula @samp{arcsin(x)} onto the stack; this formula will be displayed
- as @samp{asin(x)} as long as C mode is in effect.
- @kindex d P
- @pindex calc-pascal-language
- @cindex Pascal language
- The @kbd{d P} (@code{calc-pascal-language}) command selects Pascal
- conventions. Like C mode, Pascal mode interprets array brackets and uses
- a different table of operators. Hexadecimal numbers are entered and
- displayed with a preceding dollar sign. (Thus the regular meaning of
- @kbd{$2} during algebraic entry does not work in Pascal mode, though
- @kbd{$} (and @kbd{$$}, etc.) not followed by digits works the same as
- always.) No special provisions are made for other non-decimal numbers,
- vectors, and so on, since there is no universally accepted standard way
- of handling these in Pascal.
- @kindex d F
- @pindex calc-fortran-language
- @cindex FORTRAN language
- The @kbd{d F} (@code{calc-fortran-language}) command selects FORTRAN
- conventions. Various function names are transformed into FORTRAN
- equivalents. Vectors are written as @samp{/1, 2, 3/}, and may be
- entered this way or using square brackets. Since FORTRAN uses round
- parentheses for both function calls and array subscripts, Calc displays
- both in the same way; @samp{a(i)} is interpreted as a function call
- upon reading, and subscripts must be entered as @samp{subscr(a, i)}.
- Also, if the variable @code{a} has been declared to have type
- @code{vector} or @code{matrix} then @samp{a(i)} will be parsed as a
- subscript. (@xref{Declarations}.) Usually it doesn't matter, though;
- if you enter the subscript expression @samp{a(i)} and Calc interprets
- it as a function call, you'll never know the difference unless you
- switch to another language mode or replace @code{a} with an actual
- vector (or unless @code{a} happens to be the name of a built-in
- function!).
- Underscores are allowed in variable and function names in all of these
- language modes. The underscore here is equivalent to the @samp{#} in
- normal mode, or to hyphens in the underlying Emacs Lisp variable names.
- FORTRAN and Pascal modes normally do not adjust the case of letters in
- formulas. Most built-in Calc names use lower-case letters. If you use a
- positive numeric prefix argument with @kbd{d P} or @kbd{d F}, these
- modes will use upper-case letters exclusively for display, and will
- convert to lower-case on input. With a negative prefix, these modes
- convert to lower-case for display and input.
- @node TeX Language Mode, Eqn Language Mode, C FORTRAN Pascal, Language Modes
- @subsection @TeX{} Language Mode
- @noindent
- @kindex d T
- @pindex calc-tex-language
- @cindex TeX language
- The @kbd{d T} (@code{calc-tex-language}) command selects the conventions
- of ``math mode'' in the @TeX{} typesetting language, by Donald Knuth.
- Formulas are entered
- and displayed in @TeX{} notation, as in @samp{\sin\left( a \over b \right)}.
- Math formulas are usually enclosed by @samp{$ $} signs in @TeX{}; these
- should be omitted when interfacing with Calc. To Calc, the @samp{$} sign
- has the same meaning it always does in algebraic formulas (a reference to
- an existing entry on the stack).@refill
- Complex numbers are displayed as in @samp{3 + 4i}. Fractions and
- quotients are written using @code{\over};
- binomial coefficients are written with @code{\choose}.
- Interval forms are written with @code{\ldots}, and
- error forms are written with @code{\pm}.
- Absolute values are written as in @samp{|x + 1|}, and the floor and
- ceiling functions are written with @code{\lfloor}, @code{\rfloor}, etc.
- The words @code{\left} and @code{\right} are ignored when reading
- formulas in @TeX{} mode. Both @code{inf} and @code{uinf} are written
- as @code{\infty}; when read, @code{\infty} always translates to
- @code{inf}.@refill
- Function calls are written the usual way, with the function name followed
- by the arguments in parentheses. However, functions for which @TeX{} has
- special names (like @code{\sin}) will use curly braces instead of
- parentheses for very simple arguments. During input, curly braces and
- parentheses work equally well for grouping, but when the document is
- formatted the curly braces will be invisible. Thus the printed result is
- @c{$\sin{2 x}$}
- @cite{sin 2x} but @c{$\sin(2 + x)$}
- @cite{sin(2 + x)}.
- Function and variable names not treated specially by @TeX{} are simply
- written out as-is, which will cause them to come out in italic letters
- in the printed document. If you invoke @kbd{d T} with a positive numeric
- prefix argument, names of more than one character will instead be written
- @samp{\hbox@{@var{name}@}}. The @samp{\hbox@{ @}} notation is ignored
- during reading. If you use a negative prefix argument, such function
- names are written @samp{\@var{name}}, and function names that begin
- with @code{\} during reading have the @code{\} removed. (Note that
- in this mode, long variable names are still written with @code{\hbox}.
- However, you can always make an actual variable name like @code{\bar}
- in any @TeX{} mode.)
- During reading, text of the form @samp{\matrix@{ ...@: @}} is replaced
- by @samp{[ ...@: ]}. The same also applies to @code{\pmatrix} and
- @code{\bmatrix}. The symbol @samp{&} is interpreted as a comma,
- and the symbols @samp{\cr} and @samp{\\} are interpreted as semicolons.
- During output, matrices are displayed in @samp{\matrix@{ a & b \\ c & d@}}
- format; you may need to edit this afterwards to change @code{\matrix}
- to @code{\pmatrix} or @code{\\} to @code{\cr}.
- Accents like @code{\tilde} and @code{\bar} translate into function
- calls internally (@samp{tilde(x)}, @samp{bar(x)}). The @code{\underline}
- sequence is treated as an accent. The @code{\vec} accent corresponds
- to the function name @code{Vec}, because @code{vec} is the name of
- a built-in Calc function. The following table shows the accents
- in Calc, @TeX{}, and @dfn{eqn} (described in the next section):
- @iftex
- @begingroup
- @let@calcindexershow=@calcindexernoshow @c Suppress marginal notes
- @let@calcindexersh=@calcindexernoshow
- @end iftex
- @ignore
- @starindex
- @end ignore
- @tindex acute
- @ignore
- @starindex
- @end ignore
- @tindex bar
- @ignore
- @starindex
- @end ignore
- @tindex breve
- @ignore
- @starindex
- @end ignore
- @tindex check
- @ignore
- @starindex
- @end ignore
- @tindex dot
- @ignore
- @starindex
- @end ignore
- @tindex dotdot
- @ignore
- @starindex
- @end ignore
- @tindex dyad
- @ignore
- @starindex
- @end ignore
- @tindex grave
- @ignore
- @starindex
- @end ignore
- @tindex hat
- @ignore
- @starindex
- @end ignore
- @tindex Prime
- @ignore
- @starindex
- @end ignore
- @tindex tilde
- @ignore
- @starindex
- @end ignore
- @tindex under
- @ignore
- @starindex
- @end ignore
- @tindex Vec
- @iftex
- @endgroup
- @end iftex
- @example
- Calc TeX eqn
- ---- --- ---
- acute \acute
- bar \bar bar
- breve \breve
- check \check
- dot \dot dot
- dotdot \ddot dotdot
- dyad dyad
- grave \grave
- hat \hat hat
- Prime prime
- tilde \tilde tilde
- under \underline under
- Vec \vec vec
- @end example
- The @samp{=>} (evaluates-to) operator appears as a @code{\to} symbol:
- @samp{@{@var{a} \to @var{b}@}}. @TeX{} defines @code{\to} as an
- alias for @code{\rightarrow}. However, if the @samp{=>} is the
- top-level expression being formatted, a slightly different notation
- is used: @samp{\evalto @var{a} \to @var{b}}. The @code{\evalto}
- word is ignored by Calc's input routines, and is undefined in @TeX{}.
- You will typically want to include one of the following definitions
- at the top of a @TeX{} file that uses @code{\evalto}:
- @example
- \def\evalto@{@}
- \def\evalto#1\to@{@}
- @end example
- The first definition formats evaluates-to operators in the usual
- way. The second causes only the @var{b} part to appear in the
- printed document; the @var{a} part and the arrow are hidden.
- Another definition you may wish to use is @samp{\let\to=\Rightarrow}
- which causes @code{\to} to appear more like Calc's @samp{=>} symbol.
- @xref{Evaluates-To Operator}, for a discussion of @code{evalto}.
- The complete set of @TeX{} control sequences that are ignored during
- reading is:
- @example
- \hbox \mbox \text \left \right
- \, \> \: \; \! \quad \qquad \hfil \hfill
- \displaystyle \textstyle \dsize \tsize
- \scriptstyle \scriptscriptstyle \ssize \ssize
- \rm \bf \it \sl \roman \bold \italic \slanted
- \cal \mit \Cal \Bbb \frak \goth
- \evalto
- @end example
- Note that, because these symbols are ignored, reading a @TeX{} formula
- into Calc and writing it back out may lose spacing and font information.
- Also, the ``discretionary multiplication sign'' @samp{\*} is read
- the same as @samp{*}.
- @ifinfo
- The @TeX{} version of this manual includes some printed examples at the
- end of this section.
- @end ifinfo
- @iftex
- Here are some examples of how various Calc formulas are formatted in @TeX{}:
- @example
- @group
- sin(a^2 / b_i)
- \sin\left( {a^2 \over b_i} \right)
- @end group
- @end example
- @tex
- \let\rm\goodrm
- $$ \sin\left( a^2 \over b_i \right) $$
- @end tex
- @sp 1
- @example
- @group
- [(3, 4), 3:4, 3 +/- 4, [3 .. inf)]
- [3 + 4i, @{3 \over 4@}, 3 \pm 4, [3 \ldots \infty)]
- @end group
- @end example
- @tex
- \turnoffactive
- $$ [3 + 4i, {3 \over 4}, 3 \pm 4, [ 3 \ldots \infty)] $$
- @end tex
- @sp 1
- @example
- @group
- [abs(a), abs(a / b), floor(a), ceil(a / b)]
- [|a|, \left| a \over b \right|,
- \lfloor a \rfloor, \left\lceil a \over b \right\rceil]
- @end group
- @end example
- @tex
- $$ [|a|, \left| a \over b \right|,
- \lfloor a \rfloor, \left\lceil a \over b \right\rceil] $$
- @end tex
- @sp 1
- @example
- @group
- [sin(a), sin(2 a), sin(2 + a), sin(a / b)]
- [\sin@{a@}, \sin@{2 a@}, \sin(2 + a),
- \sin\left( @{a \over b@} \right)]
- @end group
- @end example
- @tex
- \turnoffactive\let\rm\goodrm
- $$ [\sin{a}, \sin{2 a}, \sin(2 + a), \sin\left( {a \over b} \right)] $$
- @end tex
- @sp 2
- First with plain @kbd{d T}, then with @kbd{C-u d T}, then finally with
- @kbd{C-u - d T} (using the example definition
- @samp{\def\foo#1@{\tilde F(#1)@}}:
- @example
- @group
- [f(a), foo(bar), sin(pi)]
- [f(a), foo(bar), \sin{\pi}]
- [f(a), \hbox@{foo@}(\hbox@{bar@}), \sin@{\pi@}]
- [f(a), \foo@{\hbox@{bar@}@}, \sin@{\pi@}]
- @end group
- @end example
- @tex
- \let\rm\goodrm
- $$ [f(a), foo(bar), \sin{\pi}] $$
- $$ [f(a), \hbox{foo}(\hbox{bar}), \sin{\pi}] $$
- $$ [f(a), \tilde F(\hbox{bar}), \sin{\pi}] $$
- @end tex
- @sp 2
- First with @samp{\def\evalto@{@}}, then with @samp{\def\evalto#1\to@{@}}:
- @example
- @group
- 2 + 3 => 5
- \evalto 2 + 3 \to 5
- @end group
- @end example
- @tex
- \turnoffactive
- $$ 2 + 3 \to 5 $$
- $$ 5 $$
- @end tex
- @sp 2
- First with standard @code{\to}, then with @samp{\let\to\Rightarrow}:
- @example
- @group
- [2 + 3 => 5, a / 2 => (b + c) / 2]
- [@{2 + 3 \to 5@}, @{@{a \over 2@} \to @{b + c \over 2@}@}]
- @end group
- @end example
- @tex
- \turnoffactive
- $$ [{2 + 3 \to 5}, {{a \over 2} \to {b + c \over 2}}] $$
- {\let\to\Rightarrow
- $$ [{2 + 3 \to 5}, {{a \over 2} \to {b + c \over 2}}] $$}
- @end tex
- @sp 2
- Matrices normally, then changing @code{\matrix} to @code{\pmatrix}:
- @example
- @group
- [ [ a / b, 0 ], [ 0, 2^(x + 1) ] ]
- \matrix@{ @{a \over b@} & 0 \\ 0 & 2^@{(x + 1)@} @}
- \pmatrix@{ @{a \over b@} & 0 \\ 0 & 2^@{(x + 1)@} @}
- @end group
- @end example
- @tex
- \turnoffactive
- $$ \matrix{ {a \over b} & 0 \cr 0 & 2^{(x + 1)} } $$
- $$ \pmatrix{ {a \over b} & 0 \cr 0 & 2^{(x + 1)} } $$
- @end tex
- @sp 2
- @end iftex
- @node Eqn Language Mode, Mathematica Language Mode, TeX Language Mode, Language Modes
- @subsection Eqn Language Mode
- @noindent
- @kindex d E
- @pindex calc-eqn-language
- @dfn{Eqn} is another popular formatter for math formulas. It is
- designed for use with the TROFF text formatter, and comes standard
- with many versions of Unix. The @kbd{d E} (@code{calc-eqn-language})
- command selects @dfn{eqn} notation.
- The @dfn{eqn} language's main idiosyncrasy is that whitespace plays
- a significant part in the parsing of the language. For example,
- @samp{sqrt x+1 + y} treats @samp{x+1} as the argument of the
- @code{sqrt} operator. @dfn{Eqn} also understands more conventional
- grouping using curly braces: @samp{sqrt@{x+1@} + y}. Braces are
- required only when the argument contains spaces.
- In Calc's @dfn{eqn} mode, however, curly braces are required to
- delimit arguments of operators like @code{sqrt}. The first of the
- above examples would treat only the @samp{x} as the argument of
- @code{sqrt}, and in fact @samp{sin x+1} would be interpreted as
- @samp{sin * x + 1}, because @code{sin} is not a special operator
- in the @dfn{eqn} language. If you always surround the argument
- with curly braces, Calc will never misunderstand.
- Calc also understands parentheses as grouping characters. Another
- peculiarity of @dfn{eqn}'s syntax makes it advisable to separate
- words with spaces from any surrounding characters that aren't curly
- braces, so Calc writes @samp{sin ( x + y )} in @dfn{eqn} mode.
- (The spaces around @code{sin} are important to make @dfn{eqn}
- recognize that @code{sin} should be typeset in a roman font, and
- the spaces around @code{x} and @code{y} are a good idea just in
- case the @dfn{eqn} document has defined special meanings for these
- names, too.)
- Powers and subscripts are written with the @code{sub} and @code{sup}
- operators, respectively. Note that the caret symbol @samp{^} is
- treated the same as a space in @dfn{eqn} mode, as is the @samp{~}
- symbol (these are used to introduce spaces of various widths into
- the typeset output of @dfn{eqn}).
- As in @TeX{} mode, Calc's formatter omits parentheses around the
- arguments of functions like @code{ln} and @code{sin} if they are
- ``simple-looking''; in this case Calc surrounds the argument with
- braces, separated by a @samp{~} from the function name: @samp{sin~@{x@}}.
- Font change codes (like @samp{roman @var{x}}) and positioning codes
- (like @samp{~} and @samp{down @var{n} @var{x}}) are ignored by the
- @dfn{eqn} reader. Also ignored are the words @code{left}, @code{right},
- @code{mark}, and @code{lineup}. Quotation marks in @dfn{eqn} mode input
- are treated the same as curly braces: @samp{sqrt "1+x"} is equivalent to
- @samp{sqrt @{1+x@}}; this is only an approximation to the true meaning
- of quotes in @dfn{eqn}, but it is good enough for most uses.
- Accent codes (@samp{@var{x} dot}) are handled by treating them as
- function calls (@samp{dot(@var{x})}) internally. @xref{TeX Language
- Mode}, for a table of these accent functions. The @code{prime} accent
- is treated specially if it occurs on a variable or function name:
- @samp{f prime prime @w{( x prime )}} is stored internally as
- @samp{f'@w{'}(x')}. For example, taking the derivative of @samp{f(2 x)}
- with @kbd{a d x} will produce @samp{2 f'(2 x)}, which @dfn{eqn} mode
- will display as @samp{2 f prime ( 2 x )}.
- Assignments are written with the @samp{<-} (left-arrow) symbol,
- and @code{evalto} operators are written with @samp{->} or
- @samp{evalto ... ->} (@pxref{TeX Language Mode}, for a discussion
- of this). The regular Calc symbols @samp{:=} and @samp{=>} are also
- recognized for these operators during reading.
- Vectors in @dfn{eqn} mode use regular Calc square brackets, but
- matrices are formatted as @samp{matrix @{ ccol @{ a above b @} ... @}}.
- The words @code{lcol} and @code{rcol} are recognized as synonyms
- for @code{ccol} during input, and are generated instead of @code{ccol}
- if the matrix justification mode so specifies.
- @node Mathematica Language Mode, Maple Language Mode, Eqn Language Mode, Language Modes
- @subsection Mathematica Language Mode
- @noindent
- @kindex d M
- @pindex calc-mathematica-language
- @cindex Mathematica language
- The @kbd{d M} (@code{calc-mathematica-language}) command selects the
- conventions of Mathematica, a powerful and popular mathematical tool
- from Wolfram Research, Inc. Notable differences in Mathematica mode
- are that the names of built-in functions are capitalized, and function
- calls use square brackets instead of parentheses. Thus the Calc
- formula @samp{sin(2 x)} is entered and displayed @w{@samp{Sin[2 x]}} in
- Mathematica mode.
- Vectors and matrices use curly braces in Mathematica. Complex numbers
- are written @samp{3 + 4 I}. The standard special constants in Calc are
- written @code{Pi}, @code{E}, @code{I}, @code{GoldenRatio}, @code{EulerGamma},
- @code{Infinity}, @code{ComplexInfinity}, and @code{Indeterminate} in
- Mathematica mode.
- Non-decimal numbers are written, e.g., @samp{16^^7fff}. Floating-point
- numbers in scientific notation are written @samp{1.23*10.^3}.
- Subscripts use double square brackets: @samp{a[[i]]}.@refill
- @node Maple Language Mode, Compositions, Mathematica Language Mode, Language Modes
- @subsection Maple Language Mode
- @noindent
- @kindex d W
- @pindex calc-maple-language
- @cindex Maple language
- The @kbd{d W} (@code{calc-maple-language}) command selects the
- conventions of Maple, another mathematical tool from the University
- of Waterloo.
- Maple's language is much like C. Underscores are allowed in symbol
- names; square brackets are used for subscripts; explicit @samp{*}s for
- multiplications are required. Use either @samp{^} or @samp{**} to
- denote powers.
- Maple uses square brackets for lists and curly braces for sets. Calc
- interprets both notations as vectors, and displays vectors with square
- brackets. This means Maple sets will be converted to lists when they
- pass through Calc. As a special case, matrices are written as calls
- to the function @code{matrix}, given a list of lists as the argument,
- and can be read in this form or with all-capitals @code{MATRIX}.
- The Maple interval notation @samp{2 .. 3} has no surrounding brackets;
- Calc reads @samp{2 .. 3} as the closed interval @samp{[2 .. 3]}, and
- writes any kind of interval as @samp{2 .. 3}. This means you cannot
- see the difference between an open and a closed interval while in
- Maple display mode.
- Maple writes complex numbers as @samp{3 + 4*I}. Its special constants
- are @code{Pi}, @code{E}, @code{I}, and @code{infinity} (all three of
- @code{inf}, @code{uinf}, and @code{nan} display as @code{infinity}).
- Floating-point numbers are written @samp{1.23*10.^3}.
- Among things not currently handled by Calc's Maple mode are the
- various quote symbols, procedures and functional operators, and
- inert (@samp{&}) operators.
- @node Compositions, Syntax Tables, Maple Language Mode, Language Modes
- @subsection Compositions
- @noindent
- @cindex Compositions
- There are several @dfn{composition functions} which allow you to get
- displays in a variety of formats similar to those in Big language
- mode. Most of these functions do not evaluate to anything; they are
- placeholders which are left in symbolic form by Calc's evaluator but
- are recognized by Calc's display formatting routines.
- Two of these, @code{string} and @code{bstring}, are described elsewhere.
- @xref{Strings}. For example, @samp{string("ABC")} is displayed as
- @samp{ABC}. When viewed on the stack it will be indistinguishable from
- the variable @code{ABC}, but internally it will be stored as
- @samp{string([65, 66, 67])} and can still be manipulated this way; for
- example, the selection and vector commands @kbd{j 1 v v j u} would
- select the vector portion of this object and reverse the elements, then
- deselect to reveal a string whose characters had been reversed.
- The composition functions do the same thing in all language modes
- (although their components will of course be formatted in the current
- language mode). The one exception is Unformatted mode (@kbd{d U}),
- which does not give the composition functions any special treatment.
- The functions are discussed here because of their relationship to
- the language modes.
- @menu
- * Composition Basics::
- * Horizontal Compositions::
- * Vertical Compositions::
- * Other Compositions::
- * Information about Compositions::
- * User-Defined Compositions::
- @end menu
- @node Composition Basics, Horizontal Compositions, Compositions, Compositions
- @subsubsection Composition Basics
- @noindent
- Compositions are generally formed by stacking formulas together
- horizontally or vertically in various ways. Those formulas are
- themselves compositions. @TeX{} users will find this analogous
- to @TeX{}'s ``boxes.'' Each multi-line composition has a
- @dfn{baseline}; horizontal compositions use the baselines to
- decide how formulas should be positioned relative to one another.
- For example, in the Big mode formula
- @example
- @group
- 2
- a + b
- 17 + ------
- c
- @end group
- @end example
- @noindent
- the second term of the sum is four lines tall and has line three as
- its baseline. Thus when the term is combined with 17, line three
- is placed on the same level as the baseline of 17.
- @tex
- \bigskip
- @end tex
- Another important composition concept is @dfn{precedence}. This is
- an integer that represents the binding strength of various operators.
- For example, @samp{*} has higher precedence (195) than @samp{+} (180),
- which means that @samp{(a * b) + c} will be formatted without the
- parentheses, but @samp{a * (b + c)} will keep the parentheses.
- The operator table used by normal and Big language modes has the
- following precedences:
- @example
- _ 1200 @r{(subscripts)}
- % 1100 @r{(as in n}%@r{)}
- - 1000 @r{(as in }-@r{n)}
- ! 1000 @r{(as in }!@r{n)}
- mod 400
- +/- 300
- !! 210 @r{(as in n}!!@r{)}
- ! 210 @r{(as in n}!@r{)}
- ^ 200
- * 195 @r{(or implicit multiplication)}
- / % \ 190
- + - 180 @r{(as in a}+@r{b)}
- | 170
- < = 160 @r{(and other relations)}
- && 110
- || 100
- ? : 90
- !!! 85
- &&& 80
- ||| 75
- := 50
- :: 45
- => 40
- @end example
- The general rule is that if an operator with precedence @cite{n}
- occurs as an argument to an operator with precedence @cite{m}, then
- the argument is enclosed in parentheses if @cite{n < m}. Top-level
- expressions and expressions which are function arguments, vector
- components, etc., are formatted with precedence zero (so that they
- normally never get additional parentheses).
- For binary left-associative operators like @samp{+}, the righthand
- argument is actually formatted with one-higher precedence than shown
- in the table. This makes sure @samp{(a + b) + c} omits the parentheses,
- but the unnatural form @samp{a + (b + c)} keeps its parentheses.
- Right-associative operators like @samp{^} format the lefthand argument
- with one-higher precedence.
- @ignore
- @starindex
- @end ignore
- @tindex cprec
- The @code{cprec} function formats an expression with an arbitrary
- precedence. For example, @samp{cprec(abc, 185)} will combine into
- sums and products as follows: @samp{7 + abc}, @samp{7 (abc)} (because
- this @code{cprec} form has higher precedence than addition, but lower
- precedence than multiplication).
- @tex
- \bigskip
- @end tex
- A final composition issue is @dfn{line breaking}. Calc uses two
- different strategies for ``flat'' and ``non-flat'' compositions.
- A non-flat composition is anything that appears on multiple lines
- (not counting line breaking). Examples would be matrices and Big
- mode powers and quotients. Non-flat compositions are displayed
- exactly as specified. If they come out wider than the current
- window, you must use horizontal scrolling (@kbd{<} and @kbd{>}) to
- view them.
- Flat compositions, on the other hand, will be broken across several
- lines if they are too wide to fit the window. Certain points in a
- composition are noted internally as @dfn{break points}. Calc's
- general strategy is to fill each line as much as possible, then to
- move down to the next line starting at the first break point that
- didn't fit. However, the line breaker understands the hierarchical
- structure of formulas. It will not break an ``inner'' formula if
- it can use an earlier break point from an ``outer'' formula instead.
- For example, a vector of sums might be formatted as:
- @example
- @group
- [ a + b + c, d + e + f,
- g + h + i, j + k + l, m ]
- @end group
- @end example
- @noindent
- If the @samp{m} can fit, then so, it seems, could the @samp{g}.
- But Calc prefers to break at the comma since the comma is part
- of a ``more outer'' formula. Calc would break at a plus sign
- only if it had to, say, if the very first sum in the vector had
- itself been too large to fit.
- Of the composition functions described below, only @code{choriz}
- generates break points. The @code{bstring} function (@pxref{Strings})
- also generates breakable items: A break point is added after every
- space (or group of spaces) except for spaces at the very beginning or
- end of the string.
- Composition functions themselves count as levels in the formula
- hierarchy, so a @code{choriz} that is a component of a larger
- @code{choriz} will be less likely to be broken. As a special case,
- if a @code{bstring} occurs as a component of a @code{choriz} or
- @code{choriz}-like object (such as a vector or a list of arguments
- in a function call), then the break points in that @code{bstring}
- will be on the same level as the break points of the surrounding
- object.
- @node Horizontal Compositions, Vertical Compositions, Composition Basics, Compositions
- @subsubsection Horizontal Compositions
- @noindent
- @ignore
- @starindex
- @end ignore
- @tindex choriz
- The @code{choriz} function takes a vector of objects and composes
- them horizontally. For example, @samp{choriz([17, a b/c, d])} formats
- as @w{@samp{17a b / cd}} in normal language mode, or as
- @example
- @group
- a b
- 17---d
- c
- @end group
- @end example
- @noindent
- in Big language mode. This is actually one case of the general
- function @samp{choriz(@var{vec}, @var{sep}, @var{prec})}, where
- either or both of @var{sep} and @var{prec} may be omitted.
- @var{Prec} gives the @dfn{precedence} to use when formatting
- each of the components of @var{vec}. The default precedence is
- the precedence from the surrounding environment.
- @var{Sep} is a string (i.e., a vector of character codes as might
- be entered with @code{" "} notation) which should separate components
- of the composition. Also, if @var{sep} is given, the line breaker
- will allow lines to be broken after each occurrence of @var{sep}.
- If @var{sep} is omitted, the composition will not be breakable
- (unless any of its component compositions are breakable).
- For example, @samp{2 choriz([a, b c, d = e], " + ", 180)} is
- formatted as @samp{2 a + b c + (d = e)}. To get the @code{choriz}
- to have precedence 180 ``outwards'' as well as ``inwards,''
- enclose it in a @code{cprec} form: @samp{2 cprec(choriz(...), 180)}
- formats as @samp{2 (a + b c + (d = e))}.
- The baseline of a horizontal composition is the same as the
- baselines of the component compositions, which are all aligned.
- @node Vertical Compositions, Other Compositions, Horizontal Compositions, Compositions
- @subsubsection Vertical Compositions
- @noindent
- @ignore
- @starindex
- @end ignore
- @tindex cvert
- The @code{cvert} function makes a vertical composition. Each
- component of the vector is centered in a column. The baseline of
- the result is by default the top line of the resulting composition.
- For example, @samp{f(cvert([a, bb, ccc]), cvert([a^2 + 1, b^2]))}
- formats in Big mode as
- @example
- @group
- f( a , 2 )
- bb a + 1
- ccc 2
- b
- @end group
- @end example
- @ignore
- @starindex
- @end ignore
- @tindex cbase
- There are several special composition functions that work only as
- components of a vertical composition. The @code{cbase} function
- controls the baseline of the vertical composition; the baseline
- will be the same as the baseline of whatever component is enclosed
- in @code{cbase}. Thus @samp{f(cvert([a, cbase(bb), ccc]),
- cvert([a^2 + 1, cbase(b^2)]))} displays as
- @example
- @group
- 2
- a + 1
- a 2
- f(bb , b )
- ccc
- @end group
- @end example
- @ignore
- @starindex
- @end ignore
- @tindex ctbase
- @ignore
- @starindex
- @end ignore
- @tindex cbbase
- There are also @code{ctbase} and @code{cbbase} functions which
- make the baseline of the vertical composition equal to the top
- or bottom line (rather than the baseline) of that component.
- Thus @samp{cvert([cbase(a / b)]) + cvert([ctbase(a / b)]) +
- cvert([cbbase(a / b)])} gives
- @example
- @group
- a
- a -
- - + a + b
- b -
- b
- @end group
- @end example
- There should be only one @code{cbase}, @code{ctbase}, or @code{cbbase}
- function in a given vertical composition. These functions can also
- be written with no arguments: @samp{ctbase()} is a zero-height object
- which means the baseline is the top line of the following item, and
- @samp{cbbase()} means the baseline is the bottom line of the preceding
- item.
- @ignore
- @starindex
- @end ignore
- @tindex crule
- The @code{crule} function builds a ``rule,'' or horizontal line,
- across a vertical composition. By itself @samp{crule()} uses @samp{-}
- characters to build the rule. You can specify any other character,
- e.g., @samp{crule("=")}. The argument must be a character code or
- vector of exactly one character code. It is repeated to match the
- width of the widest item in the stack. For example, a quotient
- with a thick line is @samp{cvert([a + 1, cbase(crule("=")), b^2])}:
- @example
- @group
- a + 1
- =====
- 2
- b
- @end group
- @end example
- @ignore
- @starindex
- @end ignore
- @tindex clvert
- @ignore
- @starindex
- @end ignore
- @tindex crvert
- Finally, the functions @code{clvert} and @code{crvert} act exactly
- like @code{cvert} except that the items are left- or right-justified
- in the stack. Thus @samp{clvert([a, bb, ccc]) + crvert([a, bb, ccc])}
- gives:
- @example
- @group
- a + a
- bb bb
- ccc ccc
- @end group
- @end example
- Like @code{choriz}, the vertical compositions accept a second argument
- which gives the precedence to use when formatting the components.
- Vertical compositions do not support separator strings.
- @node Other Compositions, Information about Compositions, Vertical Compositions, Compositions
- @subsubsection Other Compositions
- @noindent
- @ignore
- @starindex
- @end ignore
- @tindex csup
- The @code{csup} function builds a superscripted expression. For
- example, @samp{csup(a, b)} looks the same as @samp{a^b} does in Big
- language mode. This is essentially a horizontal composition of
- @samp{a} and @samp{b}, where @samp{b} is shifted up so that its
- bottom line is one above the baseline.
- @ignore
- @starindex
- @end ignore
- @tindex csub
- Likewise, the @code{csub} function builds a subscripted expression.
- This shifts @samp{b} down so that its top line is one below the
- bottom line of @samp{a} (note that this is not quite analogous to
- @code{csup}). Other arrangements can be obtained by using
- @code{choriz} and @code{cvert} directly.
- @ignore
- @starindex
- @end ignore
- @tindex cflat
- The @code{cflat} function formats its argument in ``flat'' mode,
- as obtained by @samp{d O}, if the current language mode is normal
- or Big. It has no effect in other language modes. For example,
- @samp{a^(b/c)} is formatted by Big mode like @samp{csup(a, cflat(b/c))}
- to improve its readability.
- @ignore
- @starindex
- @end ignore
- @tindex cspace
- The @code{cspace} function creates horizontal space. For example,
- @samp{cspace(4)} is effectively the same as @samp{string(" ")}.
- A second string (i.e., vector of characters) argument is repeated
- instead of the space character. For example, @samp{cspace(4, "ab")}
- looks like @samp{abababab}. If the second argument is not a string,
- it is formatted in the normal way and then several copies of that
- are composed together: @samp{cspace(4, a^2)} yields
- @example
- @group
- 2 2 2 2
- a a a a
- @end group
- @end example
- @noindent
- If the number argument is zero, this is a zero-width object.
- @ignore
- @starindex
- @end ignore
- @tindex cvspace
- The @code{cvspace} function creates vertical space, or a vertical
- stack of copies of a certain string or formatted object. The
- baseline is the center line of the resulting stack. A numerical
- argument of zero will produce an object which contributes zero
- height if used in a vertical composition.
- @ignore
- @starindex
- @end ignore
- @tindex ctspace
- @ignore
- @starindex
- @end ignore
- @tindex cbspace
- There are also @code{ctspace} and @code{cbspace} functions which
- create vertical space with the baseline the same as the baseline
- of the top or bottom copy, respectively, of the second argument.
- Thus @samp{cvspace(2, a/b) + ctspace(2, a/b) + cbspace(2, a/b)}
- displays as:
- @example
- @group
- a
- -
- a b
- - a a
- b + - + -
- a b b
- - a
- b -
- b
- @end group
- @end example
- @node Information about Compositions, User-Defined Compositions, Other Compositions, Compositions
- @subsubsection Information about Compositions
- @noindent
- The functions in this section are actual functions; they compose their
- arguments according to the current language and other display modes,
- then return a certain measurement of the composition as an integer.
- @ignore
- @starindex
- @end ignore
- @tindex cwidth
- The @code{cwidth} function measures the width, in characters, of a
- composition. For example, @samp{cwidth(a + b)} is 5, and
- @samp{cwidth(a / b)} is 5 in normal mode, 1 in Big mode, and 11 in
- @TeX{} mode (for @samp{@{a \over b@}}). The argument may involve
- the composition functions described in this section.
- @ignore
- @starindex
- @end ignore
- @tindex cheight
- The @code{cheight} function measures the height of a composition.
- This is the total number of lines in the argument's printed form.
- @ignore
- @starindex
- @end ignore
- @tindex cascent
- @ignore
- @starindex
- @end ignore
- @tindex cdescent
- The functions @code{cascent} and @code{cdescent} measure the amount
- of the height that is above (and including) the baseline, or below
- the baseline, respectively. Thus @samp{cascent(@var{x}) + cdescent(@var{x})}
- always equals @samp{cheight(@var{x})}. For a one-line formula like
- @samp{a + b}, @code{cascent} returns 1 and @code{cdescent} returns 0.
- For @samp{a / b} in Big mode, @code{cascent} returns 2 and @code{cdescent}
- returns 1. The only formula for which @code{cascent} will return zero
- is @samp{cvspace(0)} or equivalents.
- @node User-Defined Compositions, , Information about Compositions, Compositions
- @subsubsection User-Defined Compositions
- @noindent
- @kindex Z C
- @pindex calc-user-define-composition
- The @kbd{Z C} (@code{calc-user-define-composition}) command lets you
- define the display format for any algebraic function. You provide a
- formula containing a certain number of argument variables on the stack.
- Any time Calc formats a call to the specified function in the current
- language mode and with that number of arguments, Calc effectively
- replaces the function call with that formula with the arguments
- replaced.
- Calc builds the default argument list by sorting all the variable names
- that appear in the formula into alphabetical order. You can edit this
- argument list before pressing @key{RET} if you wish. Any variables in
- the formula that do not appear in the argument list will be displayed
- literally; any arguments that do not appear in the formula will not
- affect the display at all.
- You can define formats for built-in functions, for functions you have
- defined with @kbd{Z F} (@pxref{Algebraic Definitions}), or for functions
- which have no definitions but are being used as purely syntactic objects.
- You can define different formats for each language mode, and for each
- number of arguments, using a succession of @kbd{Z C} commands. When
- Calc formats a function call, it first searches for a format defined
- for the current language mode (and number of arguments); if there is
- none, it uses the format defined for the Normal language mode. If
- neither format exists, Calc uses its built-in standard format for that
- function (usually just @samp{@var{func}(@var{args})}).
- If you execute @kbd{Z C} with the number 0 on the stack instead of a
- formula, any defined formats for the function in the current language
- mode will be removed. The function will revert to its standard format.
- For example, the default format for the binomial coefficient function
- @samp{choose(n, m)} in the Big language mode is
- @example
- @group
- n
- ( )
- m
- @end group
- @end example
- @noindent
- You might prefer the notation,
- @example
- @group
- C
- n m
- @end group
- @end example
- @noindent
- To define this notation, first make sure you are in Big mode,
- then put the formula
- @smallexample
- choriz([cvert([cvspace(1), n]), C, cvert([cvspace(1), m])])
- @end smallexample
- @noindent
- on the stack and type @kbd{Z C}. Answer the first prompt with
- @code{choose}. The second prompt will be the default argument list
- of @samp{(C m n)}. Edit this list to be @samp{(n m)} and press
- @key{RET}. Now, try it out: For example, turn simplification
- off with @kbd{m O} and enter @samp{choose(a,b) + choose(7,3)}
- as an algebraic entry.
- @example
- @group
- C + C
- a b 7 3
- @end group
- @end example
- As another example, let's define the usual notation for Stirling
- numbers of the first kind, @samp{stir1(n, m)}. This is just like
- the regular format for binomial coefficients but with square brackets
- instead of parentheses.
- @smallexample
- choriz([string("["), cvert([n, cbase(cvspace(1)), m]), string("]")])
- @end smallexample
- Now type @kbd{Z C stir1 @key{RET}}, edit the argument list to
- @samp{(n m)}, and type @key{RET}.
- The formula provided to @kbd{Z C} usually will involve composition
- functions, but it doesn't have to. Putting the formula @samp{a + b + c}
- onto the stack and typing @kbd{Z C foo @key{RET} @key{RET}} would define
- the function @samp{foo(x,y,z)} to display like @samp{x + y + z}.
- This ``sum'' will act exactly like a real sum for all formatting
- purposes (it will be parenthesized the same, and so on). However
- it will be computationally unrelated to a sum. For example, the
- formula @samp{2 * foo(1, 2, 3)} will display as @samp{2 (1 + 2 + 3)}.
- Operator precedences have caused the ``sum'' to be written in
- parentheses, but the arguments have not actually been summed.
- (Generally a display format like this would be undesirable, since
- it can easily be confused with a real sum.)
- The special function @code{eval} can be used inside a @kbd{Z C}
- composition formula to cause all or part of the formula to be
- evaluated at display time. For example, if the formula is
- @samp{a + eval(b + c)}, then @samp{foo(1, 2, 3)} will be displayed
- as @samp{1 + 5}. Evaluation will use the default simplifications,
- regardless of the current simplification mode. There are also
- @code{evalsimp} and @code{evalextsimp} which simplify as if by
- @kbd{a s} and @kbd{a e} (respectively). Note that these ``functions''
- operate only in the context of composition formulas (and also in
- rewrite rules, where they serve a similar purpose; @pxref{Rewrite
- Rules}). On the stack, a call to @code{eval} will be left in
- symbolic form.
- It is not a good idea to use @code{eval} except as a last resort.
- It can cause the display of formulas to be extremely slow. For
- example, while @samp{eval(a + b)} might seem quite fast and simple,
- there are several situations where it could be slow. For example,
- @samp{a} and/or @samp{b} could be polar complex numbers, in which
- case doing the sum requires trigonometry. Or, @samp{a} could be
- the factorial @samp{fact(100)} which is unevaluated because you
- have typed @kbd{m O}; @code{eval} will evaluate it anyway to
- produce a large, unwieldy integer.
- You can save your display formats permanently using the @kbd{Z P}
- command (@pxref{Creating User Keys}).
- @node Syntax Tables, , Compositions, Language Modes
- @subsection Syntax Tables
- @noindent
- @cindex Syntax tables
- @cindex Parsing formulas, customized
- Syntax tables do for input what compositions do for output: They
- allow you to teach custom notations to Calc's formula parser.
- Calc keeps a separate syntax table for each language mode.
- (Note that the Calc ``syntax tables'' discussed here are completely
- unrelated to the syntax tables described in the Emacs manual.)
- @kindex Z S
- @pindex calc-edit-user-syntax
- The @kbd{Z S} (@code{calc-edit-user-syntax}) command edits the
- syntax table for the current language mode. If you want your
- syntax to work in any language, define it in the normal language
- mode. Type @kbd{M-# M-#} to finish editing the syntax table, or
- @kbd{M-# x} to cancel the edit. The @kbd{m m} command saves all
- the syntax tables along with the other mode settings;
- @pxref{General Mode Commands}.
- @menu
- * Syntax Table Basics::
- * Precedence in Syntax Tables::
- * Advanced Syntax Patterns::
- * Conditional Syntax Rules::
- @end menu
- @node Syntax Table Basics, Precedence in Syntax Tables, Syntax Tables, Syntax Tables
- @subsubsection Syntax Table Basics
- @noindent
- @dfn{Parsing} is the process of converting a raw string of characters,
- such as you would type in during algebraic entry, into a Calc formula.
- Calc's parser works in two stages. First, the input is broken down
- into @dfn{tokens}, such as words, numbers, and punctuation symbols
- like @samp{+}, @samp{:=}, and @samp{+/-}. Space between tokens is
- ignored (except when it serves to separate adjacent words). Next,
- the parser matches this string of tokens against various built-in
- syntactic patterns, such as ``an expression followed by @samp{+}
- followed by another expression'' or ``a name followed by @samp{(},
- zero or more expressions separated by commas, and @samp{)}.''
- A @dfn{syntax table} is a list of user-defined @dfn{syntax rules},
- which allow you to specify new patterns to define your own
- favorite input notations. Calc's parser always checks the syntax
- table for the current language mode, then the table for the normal
- language mode, before it uses its built-in rules to parse an
- algebraic formula you have entered. Each syntax rule should go on
- its own line; it consists of a @dfn{pattern}, a @samp{:=} symbol,
- and a Calc formula with an optional @dfn{condition}. (Syntax rules
- resemble algebraic rewrite rules, but the notation for patterns is
- completely different.)
- A syntax pattern is a list of tokens, separated by spaces.
- Except for a few special symbols, tokens in syntax patterns are
- matched literally, from left to right. For example, the rule,
- @example
- foo ( ) := 2+3
- @end example
- @noindent
- would cause Calc to parse the formula @samp{4+foo()*5} as if it
- were @samp{4+(2+3)*5}. Notice that the parentheses were written
- as two separate tokens in the rule. As a result, the rule works
- for both @samp{foo()} and @w{@samp{foo ( )}}. If we had written
- the rule as @samp{foo () := 2+3}, then Calc would treat @samp{()}
- as a single, indivisible token, so that @w{@samp{foo( )}} would
- not be recognized by the rule. (It would be parsed as a regular
- zero-argument function call instead.) In fact, this rule would
- also make trouble for the rest of Calc's parser: An unrelated
- formula like @samp{bar()} would now be tokenized into @samp{bar ()}
- instead of @samp{bar ( )}, so that the standard parser for function
- calls would no longer recognize it!
- While it is possible to make a token with a mixture of letters
- and punctuation symbols, this is not recommended. It is better to
- break it into several tokens, as we did with @samp{foo()} above.
- The symbol @samp{#} in a syntax pattern matches any Calc expression.
- On the righthand side, the things that matched the @samp{#}s can
- be referred to as @samp{#1}, @samp{#2}, and so on (where @samp{#1}
- matches the leftmost @samp{#} in the pattern). For example, these
- rules match a user-defined function, prefix operator, infix operator,
- and postfix operator, respectively:
- @example
- foo ( # ) := myfunc(#1)
- foo # := myprefix(#1)
- # foo # := myinfix(#1,#2)
- # foo := mypostfix(#1)
- @end example
- Thus @samp{foo(3)} will parse as @samp{myfunc(3)}, and @samp{2+3 foo}
- will parse as @samp{mypostfix(2+3)}.
- It is important to write the first two rules in the order shown,
- because Calc tries rules in order from first to last. If the
- pattern @samp{foo #} came first, it would match anything that could
- match the @samp{foo ( # )} rule, since an expression in parentheses
- is itself a valid expression. Thus the @w{@samp{foo ( # )}} rule would
- never get to match anything. Likewise, the last two rules must be
- written in the order shown or else @samp{3 foo 4} will be parsed as
- @samp{mypostfix(3) * 4}. (Of course, the best way to avoid these
- ambiguities is not to use the same symbol in more than one way at
- the same time! In case you're not convinced, try the following
- exercise: How will the above rules parse the input @samp{foo(3,4)},
- if at all? Work it out for yourself, then try it in Calc and see.)
- Calc is quite flexible about what sorts of patterns are allowed.
- The only rule is that every pattern must begin with a literal
- token (like @samp{foo} in the first two patterns above), or with
- a @samp{#} followed by a literal token (as in the last two
- patterns). After that, any mixture is allowed, although putting
- two @samp{#}s in a row will not be very useful since two
- expressions with nothing between them will be parsed as one
- expression that uses implicit multiplication.
- As a more practical example, Maple uses the notation
- @samp{sum(a(i), i=1..10)} for sums, which Calc's Maple mode doesn't
- recognize at present. To handle this syntax, we simply add the
- rule,
- @example
- sum ( # , # = # .. # ) := sum(#1,#2,#3,#4)
- @end example
- @noindent
- to the Maple mode syntax table. As another example, C mode can't
- read assignment operators like @samp{++} and @samp{*=}. We can
- define these operators quite easily:
- @example
- # *= # := muleq(#1,#2)
- # ++ := postinc(#1)
- ++ # := preinc(#1)
- @end example
- @noindent
- To complete the job, we would use corresponding composition functions
- and @kbd{Z C} to cause these functions to display in their respective
- Maple and C notations. (Note that the C example ignores issues of
- operator precedence, which are discussed in the next section.)
- You can enclose any token in quotes to prevent its usual
- interpretation in syntax patterns:
- @example
- # ":=" # := becomes(#1,#2)
- @end example
- Quotes also allow you to include spaces in a token, although once
- again it is generally better to use two tokens than one token with
- an embedded space. To include an actual quotation mark in a quoted
- token, precede it with a backslash. (This also works to include
- backslashes in tokens.)
- @example
- # "bad token" # "/\"\\" # := silly(#1,#2,#3)
- @end example
- @noindent
- This will parse @samp{3 bad token 4 /"\ 5} to @samp{silly(3,4,5)}.
- The token @kbd{#} has a predefined meaning in Calc's formula parser;
- it is not legal to use @samp{"#"} in a syntax rule. However, longer
- tokens that include the @samp{#} character are allowed. Also, while
- @samp{"$"} and @samp{"\""} are allowed as tokens, their presence in
- the syntax table will prevent those characters from working in their
- usual ways (referring to stack entries and quoting strings,
- respectively).
- Finally, the notation @samp{%%} anywhere in a syntax table causes
- the rest of the line to be ignored as a comment.
- @node Precedence in Syntax Tables, Advanced Syntax Patterns, Syntax Table Basics, Syntax Tables
- @subsubsection Precedence
- @noindent
- Different operators are generally assigned different @dfn{precedences}.
- By default, an operator defined by a rule like
- @example
- # foo # := foo(#1,#2)
- @end example
- @noindent
- will have an extremely low precedence, so that @samp{2*3+4 foo 5 == 6}
- will be parsed as @samp{(2*3+4) foo (5 == 6)}. To change the
- precedence of an operator, use the notation @samp{#/@var{p}} in
- place of @samp{#}, where @var{p} is an integer precedence level.
- For example, 185 lies between the precedences for @samp{+} and
- @samp{*}, so if we change this rule to
- @example
- #/185 foo #/186 := foo(#1,#2)
- @end example
- @noindent
- then @samp{2+3 foo 4*5} will be parsed as @samp{2+(3 foo (4*5))}.
- Also, because we've given the righthand expression slightly higher
- precedence, our new operator will be left-associative:
- @samp{1 foo 2 foo 3} will be parsed as @samp{(1 foo 2) foo 3}.
- By raising the precedence of the lefthand expression instead, we
- can create a right-associative operator.
- @xref{Composition Basics}, for a table of precedences of the
- standard Calc operators. For the precedences of operators in other
- language modes, look in the Calc source file @file{calc-lang.el}.
- @node Advanced Syntax Patterns, Conditional Syntax Rules, Precedence in Syntax Tables, Syntax Tables
- @subsubsection Advanced Syntax Patterns
- @noindent
- To match a function with a variable number of arguments, you could
- write
- @example
- foo ( # ) := myfunc(#1)
- foo ( # , # ) := myfunc(#1,#2)
- foo ( # , # , # ) := myfunc(#1,#2,#3)
- @end example
- @noindent
- but this isn't very elegant. To match variable numbers of items,
- Calc uses some notations inspired regular expressions and the
- ``extended BNF'' style used by some language designers.
- @example
- foo ( @{ # @}*, ) := apply(myfunc,#1)
- @end example
- The token @samp{@{} introduces a repeated or optional portion.
- One of the three tokens @samp{@}*}, @samp{@}+}, or @samp{@}?}
- ends the portion. These will match zero or more, one or more,
- or zero or one copies of the enclosed pattern, respectively.
- In addition, @samp{@}*} and @samp{@}+} can be followed by a
- separator token (with no space in between, as shown above).
- Thus @samp{@{ # @}*,} matches nothing, or one expression, or
- several expressions separated by commas.
- A complete @samp{@{ ... @}} item matches as a vector of the
- items that matched inside it. For example, the above rule will
- match @samp{foo(1,2,3)} to get @samp{apply(myfunc,[1,2,3])}.
- The Calc @code{apply} function takes a function name and a vector
- of arguments and builds a call to the function with those
- arguments, so the net result is the formula @samp{myfunc(1,2,3)}.
- If the body of a @samp{@{ ... @}} contains several @samp{#}s
- (or nested @samp{@{ ... @}} constructs), then the items will be
- strung together into the resulting vector. If the body
- does not contain anything but literal tokens, the result will
- always be an empty vector.
- @example
- foo ( @{ # , # @}+, ) := bar(#1)
- foo ( @{ @{ # @}*, @}*; ) := matrix(#1)
- @end example
- @noindent
- will parse @samp{foo(1, 2, 3, 4)} as @samp{bar([1, 2, 3, 4])}, and
- @samp{foo(1, 2; 3, 4)} as @samp{matrix([[1, 2], [3, 4]])}. Also, after
- some thought it's easy to see how this pair of rules will parse
- @samp{foo(1, 2, 3)} as @samp{matrix([[1, 2, 3]])}, since the first
- rule will only match an even number of arguments. The rule
- @example
- foo ( # @{ , # , # @}? ) := bar(#1,#2)
- @end example
- @noindent
- will parse @samp{foo(2,3,4)} as @samp{bar(2,[3,4])}, and
- @samp{foo(2)} as @samp{bar(2,[])}.
- The notation @samp{@{ ... @}?.} (note the trailing period) works
- just the same as regular @samp{@{ ... @}?}, except that it does not
- count as an argument; the following two rules are equivalent:
- @example
- foo ( # , @{ also @}? # ) := bar(#1,#3)
- foo ( # , @{ also @}?. # ) := bar(#1,#2)
- @end example
- @noindent
- Note that in the first case the optional text counts as @samp{#2},
- which will always be an empty vector, but in the second case no
- empty vector is produced.
- Another variant is @samp{@{ ... @}?$}, which means the body is
- optional only at the end of the input formula. All built-in syntax
- rules in Calc use this for closing delimiters, so that during
- algebraic entry you can type @kbd{[sqrt(2), sqrt(3 @key{RET}}, omitting
- the closing parenthesis and bracket. Calc does this automatically
- for trailing @samp{)}, @samp{]}, and @samp{>} tokens in syntax
- rules, but you can use @samp{@{ ... @}?$} explicitly to get
- this effect with any token (such as @samp{"@}"} or @samp{end}).
- Like @samp{@{ ... @}?.}, this notation does not count as an
- argument. Conversely, you can use quotes, as in @samp{")"}, to
- prevent a closing-delimiter token from being automatically treated
- as optional.
- Calc's parser does not have full backtracking, which means some
- patterns will not work as you might expect:
- @example
- foo ( @{ # , @}? # , # ) := bar(#1,#2,#3)
- @end example
- @noindent
- Here we are trying to make the first argument optional, so that
- @samp{foo(2,3)} parses as @samp{bar([],2,3)}. Unfortunately, Calc
- first tries to match @samp{2,} against the optional part of the
- pattern, finds a match, and so goes ahead to match the rest of the
- pattern. Later on it will fail to match the second comma, but it
- doesn't know how to go back and try the other alternative at that
- point. One way to get around this would be to use two rules:
- @example
- foo ( # , # , # ) := bar([#1],#2,#3)
- foo ( # , # ) := bar([],#1,#2)
- @end example
- More precisely, when Calc wants to match an optional or repeated
- part of a pattern, it scans forward attempting to match that part.
- If it reaches the end of the optional part without failing, it
- ``finalizes'' its choice and proceeds. If it fails, though, it
- backs up and tries the other alternative. Thus Calc has ``partial''
- backtracking. A fully backtracking parser would go on to make sure
- the rest of the pattern matched before finalizing the choice.
- @node Conditional Syntax Rules, , Advanced Syntax Patterns, Syntax Tables
- @subsubsection Conditional Syntax Rules
- @noindent
- It is possible to attach a @dfn{condition} to a syntax rule. For
- example, the rules
- @example
- foo ( # ) := ifoo(#1) :: integer(#1)
- foo ( # ) := gfoo(#1)
- @end example
- @noindent
- will parse @samp{foo(3)} as @samp{ifoo(3)}, but will parse
- @samp{foo(3.5)} and @samp{foo(x)} as calls to @code{gfoo}. Any
- number of conditions may be attached; all must be true for the
- rule to succeed. A condition is ``true'' if it evaluates to a
- nonzero number. @xref{Logical Operations}, for a list of Calc
- functions like @code{integer} that perform logical tests.
- The exact sequence of events is as follows: When Calc tries a
- rule, it first matches the pattern as usual. It then substitutes
- @samp{#1}, @samp{#2}, etc., in the conditions, if any. Next, the
- conditions are simplified and evaluated in order from left to right,
- as if by the @w{@kbd{a s}} algebra command (@pxref{Simplifying Formulas}).
- Each result is true if it is a nonzero number, or an expression
- that can be proven to be nonzero (@pxref{Declarations}). If the
- results of all conditions are true, the expression (such as
- @samp{ifoo(#1)}) has its @samp{#}s substituted, and that is the
- result of the parse. If the result of any condition is false, Calc
- goes on to try the next rule in the syntax table.
- Syntax rules also support @code{let} conditions, which operate in
- exactly the same way as they do in algebraic rewrite rules.
- @xref{Other Features of Rewrite Rules}, for details. A @code{let}
- condition is always true, but as a side effect it defines a
- variable which can be used in later conditions, and also in the
- expression after the @samp{:=} sign:
- @example
- foo ( # ) := hifoo(x) :: let(x := #1 + 0.5) :: dnumint(x)
- @end example
- @noindent
- The @code{dnumint} function tests if a value is numerically an
- integer, i.e., either a true integer or an integer-valued float.
- This rule will parse @code{foo} with a half-integer argument,
- like @samp{foo(3.5)}, to a call like @samp{hifoo(4.)}.
- The lefthand side of a syntax rule @code{let} must be a simple
- variable, not the arbitrary pattern that is allowed in rewrite
- rules.
- The @code{matches} function is also treated specially in syntax
- rule conditions (again, in the same way as in rewrite rules).
- @xref{Matching Commands}. If the matching pattern contains
- meta-variables, then those meta-variables may be used in later
- conditions and in the result expression. The arguments to
- @code{matches} are not evaluated in this situation.
- @example
- sum ( # , # ) := sum(#1,a,b,c) :: matches(#2, a=[b..c])
- @end example
- @noindent
- This is another way to implement the Maple mode @code{sum} notation.
- In this approach, we allow @samp{#2} to equal the whole expression
- @samp{i=1..10}. Then, we use @code{matches} to break it apart into
- its components. If the expression turns out not to match the pattern,
- the syntax rule will fail. Note that @kbd{Z S} always uses Calc's
- normal language mode for editing expressions in syntax rules, so we
- must use regular Calc notation for the interval @samp{[b..c]} that
- will correspond to the Maple mode interval @samp{1..10}.
- @node Modes Variable, Calc Mode Line, Language Modes, Mode Settings
- @section The @code{Modes} Variable
- @noindent
- @kindex m g
- @pindex calc-get-modes
- The @kbd{m g} (@code{calc-get-modes}) command pushes onto the stack
- a vector of numbers that describes the various mode settings that
- are in effect. With a numeric prefix argument, it pushes only the
- @var{n}th mode, i.e., the @var{n}th element of this vector. Keyboard
- macros can use the @kbd{m g} command to modify their behavior based
- on the current mode settings.
- @cindex @code{Modes} variable
- @vindex Modes
- The modes vector is also available in the special variable
- @code{Modes}. In other words, @kbd{m g} is like @kbd{s r Modes @key{RET}}.
- It will not work to store into this variable; in fact, if you do,
- @code{Modes} will cease to track the current modes. (The @kbd{m g}
- command will continue to work, however.)
- In general, each number in this vector is suitable as a numeric
- prefix argument to the associated mode-setting command. (Recall
- that the @kbd{~} key takes a number from the stack and gives it as
- a numeric prefix to the next command.)
- The elements of the modes vector are as follows:
- @enumerate
- @item
- Current precision. Default is 12; associated command is @kbd{p}.
- @item
- Binary word size. Default is 32; associated command is @kbd{b w}.
- @item
- Stack size (not counting the value about to be pushed by @kbd{m g}).
- This is zero if @kbd{m g} is executed with an empty stack.
- @item
- Number radix. Default is 10; command is @kbd{d r}.
- @item
- Floating-point format. This is the number of digits, plus the
- constant 0 for normal notation, 10000 for scientific notation,
- 20000 for engineering notation, or 30000 for fixed-point notation.
- These codes are acceptable as prefix arguments to the @kbd{d n}
- command, but note that this may lose information: For example,
- @kbd{d s} and @kbd{C-u 12 d s} have similar (but not quite
- identical) effects if the current precision is 12, but they both
- produce a code of 10012, which will be treated by @kbd{d n} as
- @kbd{C-u 12 d s}. If the precision then changes, the float format
- will still be frozen at 12 significant figures.
- @item
- Angular mode. Default is 1 (degrees). Other values are 2 (radians)
- and 3 (HMS). The @kbd{m d} command accepts these prefixes.
- @item
- Symbolic mode. Value is 0 or 1; default is 0. Command is @kbd{m s}.
- @item
- Fraction mode. Value is 0 or 1; default is 0. Command is @kbd{m f}.
- @item
- Polar mode. Value is 0 (rectangular) or 1 (polar); default is 0.
- Command is @kbd{m p}.
- @item
- Matrix/scalar mode. Default value is @i{-1}. Value is 0 for scalar
- mode, @i{-2} for matrix mode, or @var{N} for @c{$N\times N$}
- @var{N}x@var{N} matrix mode. Command is @kbd{m v}.
- @item
- Simplification mode. Default is 1. Value is @i{-1} for off (@kbd{m O}),
- 0 for @kbd{m N}, 2 for @kbd{m B}, 3 for @kbd{m A}, 4 for @kbd{m E},
- or 5 for @w{@kbd{m U}}. The @kbd{m D} command accepts these prefixes.
- @item
- Infinite mode. Default is @i{-1} (off). Value is 1 if the mode is on,
- or 0 if the mode is on with positive zeros. Command is @kbd{m i}.
- @end enumerate
- For example, the sequence @kbd{M-1 m g @key{RET} 2 + ~ p} increases the
- precision by two, leaving a copy of the old precision on the stack.
- Later, @kbd{~ p} will restore the original precision using that
- stack value. (This sequence might be especially useful inside a
- keyboard macro.)
- As another example, @kbd{M-3 m g 1 - ~ @key{DEL}} deletes all but the
- oldest (bottommost) stack entry.
- Yet another example: The HP-48 ``round'' command rounds a number
- to the current displayed precision. You could roughly emulate this
- in Calc with the sequence @kbd{M-5 m g 10000 % ~ c c}. (This
- would not work for fixed-point mode, but it wouldn't be hard to
- do a full emulation with the help of the @kbd{Z [} and @kbd{Z ]}
- programming commands. @xref{Conditionals in Macros}.)
- @node Calc Mode Line, , Modes Variable, Mode Settings
- @section The Calc Mode Line
- @noindent
- @cindex Mode line indicators
- This section is a summary of all symbols that can appear on the
- Calc mode line, the highlighted bar that appears under the Calc
- stack window (or under an editing window in Embedded Mode).
- The basic mode line format is:
- @example
- --%%-Calc: 12 Deg @var{other modes} (Calculator)
- @end example
- The @samp{%%} is the Emacs symbol for ``read-only''; it shows that
- regular Emacs commands are not allowed to edit the stack buffer
- as if it were text.
- The word @samp{Calc:} changes to @samp{CalcEmbed:} if Embedded Mode
- is enabled. The words after this describe the various Calc modes
- that are in effect.
- The first mode is always the current precision, an integer.
- The second mode is always the angular mode, either @code{Deg},
- @code{Rad}, or @code{Hms}.
- Here is a complete list of the remaining symbols that can appear
- on the mode line:
- @table @code
- @item Alg
- Algebraic mode (@kbd{m a}; @pxref{Algebraic Entry}).
- @item Alg[(
- Incomplete algebraic mode (@kbd{C-u m a}).
- @item Alg*
- Total algebraic mode (@kbd{m t}).
- @item Symb
- Symbolic mode (@kbd{m s}; @pxref{Symbolic Mode}).
- @item Matrix
- Matrix mode (@kbd{m v}; @pxref{Matrix Mode}).
- @item Matrix@var{n}
- Dimensioned matrix mode (@kbd{C-u @var{n} m v}).
- @item Scalar
- Scalar mode (@kbd{m v}; @pxref{Matrix Mode}).
- @item Polar
- Polar complex mode (@kbd{m p}; @pxref{Polar Mode}).
- @item Frac
- Fraction mode (@kbd{m f}; @pxref{Fraction Mode}).
- @item Inf
- Infinite mode (@kbd{m i}; @pxref{Infinite Mode}).
- @item +Inf
- Positive infinite mode (@kbd{C-u 0 m i}).
- @item NoSimp
- Default simplifications off (@kbd{m O}; @pxref{Simplification Modes}).
- @item NumSimp
- Default simplifications for numeric arguments only (@kbd{m N}).
- @item BinSimp@var{w}
- Binary-integer simplification mode; word size @var{w} (@kbd{m B}, @kbd{b w}).
- @item AlgSimp
- Algebraic simplification mode (@kbd{m A}).
- @item ExtSimp
- Extended algebraic simplification mode (@kbd{m E}).
- @item UnitSimp
- Units simplification mode (@kbd{m U}).
- @item Bin
- Current radix is 2 (@kbd{d 2}; @pxref{Radix Modes}).
- @item Oct
- Current radix is 8 (@kbd{d 8}).
- @item Hex
- Current radix is 16 (@kbd{d 6}).
- @item Radix@var{n}
- Current radix is @var{n} (@kbd{d r}).
- @item Zero
- Leading zeros (@kbd{d z}; @pxref{Radix Modes}).
- @item Big
- Big language mode (@kbd{d B}; @pxref{Normal Language Modes}).
- @item Flat
- One-line normal language mode (@kbd{d O}).
- @item Unform
- Unformatted language mode (@kbd{d U}).
- @item C
- C language mode (@kbd{d C}; @pxref{C FORTRAN Pascal}).
- @item Pascal
- Pascal language mode (@kbd{d P}).
- @item Fortran
- FORTRAN language mode (@kbd{d F}).
- @item TeX
- @TeX{} language mode (@kbd{d T}; @pxref{TeX Language Mode}).
- @item Eqn
- @dfn{Eqn} language mode (@kbd{d E}; @pxref{Eqn Language Mode}).
- @item Math
- Mathematica language mode (@kbd{d M}; @pxref{Mathematica Language Mode}).
- @item Maple
- Maple language mode (@kbd{d W}; @pxref{Maple Language Mode}).
- @item Norm@var{n}
- Normal float mode with @var{n} digits (@kbd{d n}; @pxref{Float Formats}).
- @item Fix@var{n}
- Fixed point mode with @var{n} digits after the point (@kbd{d f}).
- @item Sci
- Scientific notation mode (@kbd{d s}).
- @item Sci@var{n}
- Scientific notation with @var{n} digits (@kbd{d s}).
- @item Eng
- Engineering notation mode (@kbd{d e}).
- @item Eng@var{n}
- Engineering notation with @var{n} digits (@kbd{d e}).
- @item Left@var{n}
- Left-justified display indented by @var{n} (@kbd{d <}; @pxref{Justification}).
- @item Right
- Right-justified display (@kbd{d >}).
- @item Right@var{n}
- Right-justified display with width @var{n} (@kbd{d >}).
- @item Center
- Centered display (@kbd{d =}).
- @item Center@var{n}
- Centered display with center column @var{n} (@kbd{d =}).
- @item Wid@var{n}
- Line breaking with width @var{n} (@kbd{d b}; @pxref{Normal Language Modes}).
- @item Wide
- No line breaking (@kbd{d b}).
- @item Break
- Selections show deep structure (@kbd{j b}; @pxref{Making Selections}).
- @item Save
- Record modes in @file{~/.emacs} (@kbd{m R}; @pxref{General Mode Commands}).
- @item Local
- Record modes in Embedded buffer (@kbd{m R}).
- @item LocEdit
- Record modes as editing-only in Embedded buffer (@kbd{m R}).
- @item LocPerm
- Record modes as permanent-only in Embedded buffer (@kbd{m R}).
- @item Global
- Record modes as global in Embedded buffer (@kbd{m R}).
- @item Manual
- Automatic recomputation turned off (@kbd{m C}; @pxref{Automatic
- Recomputation}).
- @item Graph
- GNUPLOT process is alive in background (@pxref{Graphics}).
- @item Sel
- Top-of-stack has a selection (Embedded only; @pxref{Making Selections}).
- @item Dirty
- The stack display may not be up-to-date (@pxref{Display Modes}).
- @item Inv
- ``Inverse'' prefix was pressed (@kbd{I}; @pxref{Inverse and Hyperbolic}).
- @item Hyp
- ``Hyperbolic'' prefix was pressed (@kbd{H}).
- @item Keep
- ``Keep-arguments'' prefix was pressed (@kbd{K}).
- @item Narrow
- Stack is truncated (@kbd{d t}; @pxref{Truncating the Stack}).
- @end table
- In addition, the symbols @code{Active} and @code{~Active} can appear
- as minor modes on an Embedded buffer's mode line. @xref{Embedded Mode}.
- @node Arithmetic, Scientific Functions, Mode Settings, Top
- @chapter Arithmetic Functions
- @noindent
- This chapter describes the Calc commands for doing simple calculations
- on numbers, such as addition, absolute value, and square roots. These
- commands work by removing the top one or two values from the stack,
- performing the desired operation, and pushing the result back onto the
- stack. If the operation cannot be performed, the result pushed is a
- formula instead of a number, such as @samp{2/0} (because division by zero
- is illegal) or @samp{sqrt(x)} (because the argument @samp{x} is a formula).
- Most of the commands described here can be invoked by a single keystroke.
- Some of the more obscure ones are two-letter sequences beginning with
- the @kbd{f} (``functions'') prefix key.
- @xref{Prefix Arguments}, for a discussion of the effect of numeric
- prefix arguments on commands in this chapter which do not otherwise
- interpret a prefix argument.
- @menu
- * Basic Arithmetic::
- * Integer Truncation::
- * Complex Number Functions::
- * Conversions::
- * Date Arithmetic::
- * Financial Functions::
- * Binary Functions::
- @end menu
- @node Basic Arithmetic, Integer Truncation, Arithmetic, Arithmetic
- @section Basic Arithmetic
- @noindent
- @kindex +
- @pindex calc-plus
- @ignore
- @mindex @null
- @end ignore
- @tindex +
- The @kbd{+} (@code{calc-plus}) command adds two numbers. The numbers may
- be any of the standard Calc data types. The resulting sum is pushed back
- onto the stack.
- If both arguments of @kbd{+} are vectors or matrices (of matching dimensions),
- the result is a vector or matrix sum. If one argument is a vector and the
- other a scalar (i.e., a non-vector), the scalar is added to each of the
- elements of the vector to form a new vector. If the scalar is not a
- number, the operation is left in symbolic form: Suppose you added @samp{x}
- to the vector @samp{[1,2]}. You may want the result @samp{[1+x,2+x]}, or
- you may plan to substitute a 2-vector for @samp{x} in the future. Since
- the Calculator can't tell which interpretation you want, it makes the
- safest assumption. @xref{Reducing and Mapping}, for a way to add @samp{x}
- to every element of a vector.
- If either argument of @kbd{+} is a complex number, the result will in general
- be complex. If one argument is in rectangular form and the other polar,
- the current Polar Mode determines the form of the result. If Symbolic
- Mode is enabled, the sum may be left as a formula if the necessary
- conversions for polar addition are non-trivial.
- If both arguments of @kbd{+} are HMS forms, the forms are added according to
- the usual conventions of hours-minutes-seconds notation. If one argument
- is an HMS form and the other is a number, that number is converted from
- degrees or radians (depending on the current Angular Mode) to HMS format
- and then the two HMS forms are added.
- If one argument of @kbd{+} is a date form, the other can be either a
- real number, which advances the date by a certain number of days, or
- an HMS form, which advances the date by a certain amount of time.
- Subtracting two date forms yields the number of days between them.
- Adding two date forms is meaningless, but Calc interprets it as the
- subtraction of one date form and the negative of the other. (The
- negative of a date form can be understood by remembering that dates
- are stored as the number of days before or after Jan 1, 1 AD.)
- If both arguments of @kbd{+} are error forms, the result is an error form
- with an appropriately computed standard deviation. If one argument is an
- error form and the other is a number, the number is taken to have zero error.
- Error forms may have symbolic formulas as their mean and/or error parts;
- adding these will produce a symbolic error form result. However, adding an
- error form to a plain symbolic formula (as in @samp{(a +/- b) + c}) will not
- work, for the same reasons just mentioned for vectors. Instead you must
- write @samp{(a +/- b) + (c +/- 0)}.
- If both arguments of @kbd{+} are modulo forms with equal values of @cite{M},
- or if one argument is a modulo form and the other a plain number, the
- result is a modulo form which represents the sum, modulo @cite{M}, of
- the two values.
- If both arguments of @kbd{+} are intervals, the result is an interval
- which describes all possible sums of the possible input values. If
- one argument is a plain number, it is treated as the interval
- @w{@samp{[x ..@: x]}}.
- If one argument of @kbd{+} is an infinity and the other is not, the
- result is that same infinity. If both arguments are infinite and in
- the same direction, the result is the same infinity, but if they are
- infinite in different directions the result is @code{nan}.
- @kindex -
- @pindex calc-minus
- @ignore
- @mindex @null
- @end ignore
- @tindex -
- The @kbd{-} (@code{calc-minus}) command subtracts two values. The top
- number on the stack is subtracted from the one behind it, so that the
- computation @kbd{5 @key{RET} 2 -} produces 3, not @i{-3}. All options
- available for @kbd{+} are available for @kbd{-} as well.
- @kindex *
- @pindex calc-times
- @ignore
- @mindex @null
- @end ignore
- @tindex *
- The @kbd{*} (@code{calc-times}) command multiplies two numbers. If one
- argument is a vector and the other a scalar, the scalar is multiplied by
- the elements of the vector to produce a new vector. If both arguments
- are vectors, the interpretation depends on the dimensions of the
- vectors: If both arguments are matrices, a matrix multiplication is
- done. If one argument is a matrix and the other a plain vector, the
- vector is interpreted as a row vector or column vector, whichever is
- dimensionally correct. If both arguments are plain vectors, the result
- is a single scalar number which is the dot product of the two vectors.
- If one argument of @kbd{*} is an HMS form and the other a number, the
- HMS form is multiplied by that amount. It is an error to multiply two
- HMS forms together, or to attempt any multiplication involving date
- forms. Error forms, modulo forms, and intervals can be multiplied;
- see the comments for addition of those forms. When two error forms
- or intervals are multiplied they are considered to be statistically
- independent; thus, @samp{[-2 ..@: 3] * [-2 ..@: 3]} is @samp{[-6 ..@: 9]},
- whereas @w{@samp{[-2 ..@: 3] ^ 2}} is @samp{[0 ..@: 9]}.
- @kindex /
- @pindex calc-divide
- @ignore
- @mindex @null
- @end ignore
- @tindex /
- The @kbd{/} (@code{calc-divide}) command divides two numbers. When
- dividing a scalar @cite{B} by a square matrix @cite{A}, the computation
- performed is @cite{B} times the inverse of @cite{A}. This also occurs
- if @cite{B} is itself a vector or matrix, in which case the effect is
- to solve the set of linear equations represented by @cite{B}. If @cite{B}
- is a matrix with the same number of rows as @cite{A}, or a plain vector
- (which is interpreted here as a column vector), then the equation
- @cite{A X = B} is solved for the vector or matrix @cite{X}. Otherwise,
- if @cite{B} is a non-square matrix with the same number of @emph{columns}
- as @cite{A}, the equation @cite{X A = B} is solved. If you wish a vector
- @cite{B} to be interpreted as a row vector to be solved as @cite{X A = B},
- make it into a one-row matrix with @kbd{C-u 1 v p} first. To force a
- left-handed solution with a square matrix @cite{B}, transpose @cite{A} and
- @cite{B} before dividing, then transpose the result.
- HMS forms can be divided by real numbers or by other HMS forms. Error
- forms can be divided in any combination of ways. Modulo forms where both
- values and the modulo are integers can be divided to get an integer modulo
- form result. Intervals can be divided; dividing by an interval that
- encompasses zero or has zero as a limit will result in an infinite
- interval.
- @kindex ^
- @pindex calc-power
- @ignore
- @mindex @null
- @end ignore
- @tindex ^
- The @kbd{^} (@code{calc-power}) command raises a number to a power. If
- the power is an integer, an exact result is computed using repeated
- multiplications. For non-integer powers, Calc uses Newton's method or
- logarithms and exponentials. Square matrices can be raised to integer
- powers. If either argument is an error (or interval or modulo) form,
- the result is also an error (or interval or modulo) form.
- @kindex I ^
- @tindex nroot
- If you press the @kbd{I} (inverse) key first, the @kbd{I ^} command
- computes an Nth root: @kbd{125 @key{RET} 3 I ^} computes the number 5.
- (This is entirely equivalent to @kbd{125 @key{RET} 1:3 ^}.)
- @kindex \
- @pindex calc-idiv
- @tindex idiv
- @ignore
- @mindex @null
- @end ignore
- @tindex \
- The @kbd{\} (@code{calc-idiv}) command divides two numbers on the stack
- to produce an integer result. It is equivalent to dividing with
- @key{/}, then rounding down with @kbd{F} (@code{calc-floor}), only a bit
- more convenient and efficient. Also, since it is an all-integer
- operation when the arguments are integers, it avoids problems that
- @kbd{/ F} would have with floating-point roundoff.
- @kindex %
- @pindex calc-mod
- @ignore
- @mindex @null
- @end ignore
- @tindex %
- The @kbd{%} (@code{calc-mod}) command performs a ``modulo'' (or ``remainder'')
- operation. Mathematically, @samp{a%b = a - (a\b)*b}, and is defined
- for all real numbers @cite{a} and @cite{b} (except @cite{b=0}). For
- positive @cite{b}, the result will always be between 0 (inclusive) and
- @cite{b} (exclusive). Modulo does not work for HMS forms and error forms.
- If @cite{a} is a modulo form, its modulo is changed to @cite{b}, which
- must be positive real number.
- @kindex :
- @pindex calc-fdiv
- @tindex fdiv
- The @kbd{:} (@code{calc-fdiv}) command [@code{fdiv} function in a formula]
- divides the two integers on the top of the stack to produce a fractional
- result. This is a convenient shorthand for enabling Fraction Mode (with
- @kbd{m f}) temporarily and using @samp{/}. Note that during numeric entry
- the @kbd{:} key is interpreted as a fraction separator, so to divide 8 by 6
- you would have to type @kbd{8 @key{RET} 6 @key{RET} :}. (Of course, in
- this case, it would be much easier simply to enter the fraction directly
- as @kbd{8:6 @key{RET}}!)
- @kindex n
- @pindex calc-change-sign
- The @kbd{n} (@code{calc-change-sign}) command negates the number on the top
- of the stack. It works on numbers, vectors and matrices, HMS forms, date
- forms, error forms, intervals, and modulo forms.
- @kindex A
- @pindex calc-abs
- @tindex abs
- The @kbd{A} (@code{calc-abs}) [@code{abs}] command computes the absolute
- value of a number. The result of @code{abs} is always a nonnegative
- real number: With a complex argument, it computes the complex magnitude.
- With a vector or matrix argument, it computes the Frobenius norm, i.e.,
- the square root of the sum of the squares of the absolute values of the
- elements. The absolute value of an error form is defined by replacing
- the mean part with its absolute value and leaving the error part the same.
- The absolute value of a modulo form is undefined. The absolute value of
- an interval is defined in the obvious way.
- @kindex f A
- @pindex calc-abssqr
- @tindex abssqr
- The @kbd{f A} (@code{calc-abssqr}) [@code{abssqr}] command computes the
- absolute value squared of a number, vector or matrix, or error form.
- @kindex f s
- @pindex calc-sign
- @tindex sign
- The @kbd{f s} (@code{calc-sign}) [@code{sign}] command returns 1 if its
- argument is positive, @i{-1} if its argument is negative, or 0 if its
- argument is zero. In algebraic form, you can also write @samp{sign(a,x)}
- which evaluates to @samp{x * sign(a)}, i.e., either @samp{x}, @samp{-x}, or
- zero depending on the sign of @samp{a}.
- @kindex &
- @pindex calc-inv
- @tindex inv
- @cindex Reciprocal
- The @kbd{&} (@code{calc-inv}) [@code{inv}] command computes the
- reciprocal of a number, i.e., @cite{1 / x}. Operating on a square
- matrix, it computes the inverse of that matrix.
- @kindex Q
- @pindex calc-sqrt
- @tindex sqrt
- The @kbd{Q} (@code{calc-sqrt}) [@code{sqrt}] command computes the square
- root of a number. For a negative real argument, the result will be a
- complex number whose form is determined by the current Polar Mode.
- @kindex f h
- @pindex calc-hypot
- @tindex hypot
- The @kbd{f h} (@code{calc-hypot}) [@code{hypot}] command computes the square
- root of the sum of the squares of two numbers. That is, @samp{hypot(a,b)}
- is the length of the hypotenuse of a right triangle with sides @cite{a}
- and @cite{b}. If the arguments are complex numbers, their squared
- magnitudes are used.
- @kindex f Q
- @pindex calc-isqrt
- @tindex isqrt
- The @kbd{f Q} (@code{calc-isqrt}) [@code{isqrt}] command computes the
- integer square root of an integer. This is the true square root of the
- number, rounded down to an integer. For example, @samp{isqrt(10)}
- produces 3. Note that, like @kbd{\} [@code{idiv}], this uses exact
- integer arithmetic throughout to avoid roundoff problems. If the input
- is a floating-point number or other non-integer value, this is exactly
- the same as @samp{floor(sqrt(x))}.
- @kindex f n
- @kindex f x
- @pindex calc-min
- @tindex min
- @pindex calc-max
- @tindex max
- The @kbd{f n} (@code{calc-min}) [@code{min}] and @kbd{f x} (@code{calc-max})
- [@code{max}] commands take the minimum or maximum of two real numbers,
- respectively. These commands also work on HMS forms, date forms,
- intervals, and infinities. (In algebraic expressions, these functions
- take any number of arguments and return the maximum or minimum among
- all the arguments.)@refill
- @kindex f M
- @kindex f X
- @pindex calc-mant-part
- @tindex mant
- @pindex calc-xpon-part
- @tindex xpon
- The @kbd{f M} (@code{calc-mant-part}) [@code{mant}] function extracts
- the ``mantissa'' part @cite{m} of its floating-point argument; @kbd{f X}
- (@code{calc-xpon-part}) [@code{xpon}] extracts the ``exponent'' part
- @cite{e}. The original number is equal to @c{$m \times 10^e$}
- @cite{m * 10^e},
- where @cite{m} is in the interval @samp{[1.0 ..@: 10.0)} except that
- @cite{m=e=0} if the original number is zero. For integers
- and fractions, @code{mant} returns the number unchanged and @code{xpon}
- returns zero. The @kbd{v u} (@code{calc-unpack}) command can also be
- used to ``unpack'' a floating-point number; this produces an integer
- mantissa and exponent, with the constraint that the mantissa is not
- a multiple of ten (again except for the @cite{m=e=0} case).@refill
- @kindex f S
- @pindex calc-scale-float
- @tindex scf
- The @kbd{f S} (@code{calc-scale-float}) [@code{scf}] function scales a number
- by a given power of ten. Thus, @samp{scf(mant(x), xpon(x)) = x} for any
- real @samp{x}. The second argument must be an integer, but the first
- may actually be any numeric value. For example, @samp{scf(5,-2) = 0.05}
- or @samp{1:20} depending on the current Fraction Mode.@refill
- @kindex f [
- @kindex f ]
- @pindex calc-decrement
- @pindex calc-increment
- @tindex decr
- @tindex incr
- The @kbd{f [} (@code{calc-decrement}) [@code{decr}] and @kbd{f ]}
- (@code{calc-increment}) [@code{incr}] functions decrease or increase
- a number by one unit. For integers, the effect is obvious. For
- floating-point numbers, the change is by one unit in the last place.
- For example, incrementing @samp{12.3456} when the current precision
- is 6 digits yields @samp{12.3457}. If the current precision had been
- 8 digits, the result would have been @samp{12.345601}. Incrementing
- @samp{0.0} produces @c{$10^{-p}$}
- @cite{10^-p}, where @cite{p} is the current
- precision. These operations are defined only on integers and floats.
- With numeric prefix arguments, they change the number by @cite{n} units.
- Note that incrementing followed by decrementing, or vice-versa, will
- almost but not quite always cancel out. Suppose the precision is
- 6 digits and the number @samp{9.99999} is on the stack. Incrementing
- will produce @samp{10.0000}; decrementing will produce @samp{9.9999}.
- One digit has been dropped. This is an unavoidable consequence of the
- way floating-point numbers work.
- Incrementing a date/time form adjusts it by a certain number of seconds.
- Incrementing a pure date form adjusts it by a certain number of days.
- @node Integer Truncation, Complex Number Functions, Basic Arithmetic, Arithmetic
- @section Integer Truncation
- @noindent
- There are four commands for truncating a real number to an integer,
- differing mainly in their treatment of negative numbers. All of these
- commands have the property that if the argument is an integer, the result
- is the same integer. An integer-valued floating-point argument is converted
- to integer form.
- If you press @kbd{H} (@code{calc-hyperbolic}) first, the result will be
- expressed as an integer-valued floating-point number.
- @cindex Integer part of a number
- @kindex F
- @pindex calc-floor
- @tindex floor
- @tindex ffloor
- @ignore
- @mindex @null
- @end ignore
- @kindex H F
- The @kbd{F} (@code{calc-floor}) [@code{floor} or @code{ffloor}] command
- truncates a real number to the next lower integer, i.e., toward minus
- infinity. Thus @kbd{3.6 F} produces 3, but @kbd{_3.6 F} produces
- @i{-4}.@refill
- @kindex I F
- @pindex calc-ceiling
- @tindex ceil
- @tindex fceil
- @ignore
- @mindex @null
- @end ignore
- @kindex H I F
- The @kbd{I F} (@code{calc-ceiling}) [@code{ceil} or @code{fceil}]
- command truncates toward positive infinity. Thus @kbd{3.6 I F} produces
- 4, and @kbd{_3.6 I F} produces @i{-3}.@refill
- @kindex R
- @pindex calc-round
- @tindex round
- @tindex fround
- @ignore
- @mindex @null
- @end ignore
- @kindex H R
- The @kbd{R} (@code{calc-round}) [@code{round} or @code{fround}] command
- rounds to the nearest integer. When the fractional part is .5 exactly,
- this command rounds away from zero. (All other rounding in the
- Calculator uses this convention as well.) Thus @kbd{3.5 R} produces 4
- but @kbd{3.4 R} produces 3; @kbd{_3.5 R} produces @i{-4}.@refill
- @kindex I R
- @pindex calc-trunc
- @tindex trunc
- @tindex ftrunc
- @ignore
- @mindex @null
- @end ignore
- @kindex H I R
- The @kbd{I R} (@code{calc-trunc}) [@code{trunc} or @code{ftrunc}]
- command truncates toward zero. In other words, it ``chops off''
- everything after the decimal point. Thus @kbd{3.6 I R} produces 3 and
- @kbd{_3.6 I R} produces @i{-3}.@refill
- These functions may not be applied meaningfully to error forms, but they
- do work for intervals. As a convenience, applying @code{floor} to a
- modulo form floors the value part of the form. Applied to a vector,
- these functions operate on all elements of the vector one by one.
- Applied to a date form, they operate on the internal numerical
- representation of dates, converting a date/time form into a pure date.
- @ignore
- @starindex
- @end ignore
- @tindex rounde
- @ignore
- @starindex
- @end ignore
- @tindex roundu
- @ignore
- @starindex
- @end ignore
- @tindex frounde
- @ignore
- @starindex
- @end ignore
- @tindex froundu
- There are two more rounding functions which can only be entered in
- algebraic notation. The @code{roundu} function is like @code{round}
- except that it rounds up, toward plus infinity, when the fractional
- part is .5. This distinction matters only for negative arguments.
- Also, @code{rounde} rounds to an even number in the case of a tie,
- rounding up or down as necessary. For example, @samp{rounde(3.5)} and
- @samp{rounde(4.5)} both return 4, but @samp{rounde(5.5)} returns 6.
- The advantage of round-to-even is that the net error due to rounding
- after a long calculation tends to cancel out to zero. An important
- subtle point here is that the number being fed to @code{rounde} will
- already have been rounded to the current precision before @code{rounde}
- begins. For example, @samp{rounde(2.500001)} with a current precision
- of 6 will incorrectly, or at least surprisingly, yield 2 because the
- argument will first have been rounded down to @cite{2.5} (which
- @code{rounde} sees as an exact tie between 2 and 3).
- Each of these functions, when written in algebraic formulas, allows
- a second argument which specifies the number of digits after the
- decimal point to keep. For example, @samp{round(123.4567, 2)} will
- produce the answer 123.46, and @samp{round(123.4567, -1)} will
- produce 120 (i.e., the cutoff is one digit to the @emph{left} of
- the decimal point). A second argument of zero is equivalent to
- no second argument at all.
- @cindex Fractional part of a number
- To compute the fractional part of a number (i.e., the amount which, when
- added to `@t{floor(}@var{n}@t{)}', will produce @var{n}) just take @var{n}
- modulo 1 using the @code{%} command.@refill
- Note also the @kbd{\} (integer quotient), @kbd{f I} (integer logarithm),
- and @kbd{f Q} (integer square root) commands, which are analogous to
- @kbd{/}, @kbd{B}, and @kbd{Q}, respectively, except that they take integer
- arguments and return the result rounded down to an integer.
- @node Complex Number Functions, Conversions, Integer Truncation, Arithmetic
- @section Complex Number Functions
- @noindent
- @kindex J
- @pindex calc-conj
- @tindex conj
- The @kbd{J} (@code{calc-conj}) [@code{conj}] command computes the
- complex conjugate of a number. For complex number @cite{a+bi}, the
- complex conjugate is @cite{a-bi}. If the argument is a real number,
- this command leaves it the same. If the argument is a vector or matrix,
- this command replaces each element by its complex conjugate.
- @kindex G
- @pindex calc-argument
- @tindex arg
- The @kbd{G} (@code{calc-argument}) [@code{arg}] command computes the
- ``argument'' or polar angle of a complex number. For a number in polar
- notation, this is simply the second component of the pair
- `@t{(}@var{r}@t{;}@c{$\theta$}
- @var{theta}@t{)}'.
- The result is expressed according to the current angular mode and will
- be in the range @i{-180} degrees (exclusive) to @i{+180} degrees
- (inclusive), or the equivalent range in radians.@refill
- @pindex calc-imaginary
- The @code{calc-imaginary} command multiplies the number on the
- top of the stack by the imaginary number @cite{i = (0,1)}. This
- command is not normally bound to a key in Calc, but it is available
- on the @key{IMAG} button in Keypad Mode.
- @kindex f r
- @pindex calc-re
- @tindex re
- The @kbd{f r} (@code{calc-re}) [@code{re}] command replaces a complex number
- by its real part. This command has no effect on real numbers. (As an
- added convenience, @code{re} applied to a modulo form extracts
- the value part.)@refill
- @kindex f i
- @pindex calc-im
- @tindex im
- The @kbd{f i} (@code{calc-im}) [@code{im}] command replaces a complex number
- by its imaginary part; real numbers are converted to zero. With a vector
- or matrix argument, these functions operate element-wise.@refill
- @ignore
- @mindex v p
- @end ignore
- @kindex v p (complex)
- @pindex calc-pack
- The @kbd{v p} (@code{calc-pack}) command can pack the top two numbers on
- the stack into a composite object such as a complex number. With
- a prefix argument of @i{-1}, it produces a rectangular complex number;
- with an argument of @i{-2}, it produces a polar complex number.
- (Also, @pxref{Building Vectors}.)
- @ignore
- @mindex v u
- @end ignore
- @kindex v u (complex)
- @pindex calc-unpack
- The @kbd{v u} (@code{calc-unpack}) command takes the complex number
- (or other composite object) on the top of the stack and unpacks it
- into its separate components.
- @node Conversions, Date Arithmetic, Complex Number Functions, Arithmetic
- @section Conversions
- @noindent
- The commands described in this section convert numbers from one form
- to another; they are two-key sequences beginning with the letter @kbd{c}.
- @kindex c f
- @pindex calc-float
- @tindex pfloat
- The @kbd{c f} (@code{calc-float}) [@code{pfloat}] command converts the
- number on the top of the stack to floating-point form. For example,
- @cite{23} is converted to @cite{23.0}, @cite{3:2} is converted to
- @cite{1.5}, and @cite{2.3} is left the same. If the value is a composite
- object such as a complex number or vector, each of the components is
- converted to floating-point. If the value is a formula, all numbers
- in the formula are converted to floating-point. Note that depending
- on the current floating-point precision, conversion to floating-point
- format may lose information.@refill
- As a special exception, integers which appear as powers or subscripts
- are not floated by @kbd{c f}. If you really want to float a power,
- you can use a @kbd{j s} command to select the power followed by @kbd{c f}.
- Because @kbd{c f} cannot examine the formula outside of the selection,
- it does not notice that the thing being floated is a power.
- @xref{Selecting Subformulas}.
- The normal @kbd{c f} command is ``pervasive'' in the sense that it
- applies to all numbers throughout the formula. The @code{pfloat}
- algebraic function never stays around in a formula; @samp{pfloat(a + 1)}
- changes to @samp{a + 1.0} as soon as it is evaluated.
- @kindex H c f
- @tindex float
- With the Hyperbolic flag, @kbd{H c f} [@code{float}] operates
- only on the number or vector of numbers at the top level of its
- argument. Thus, @samp{float(1)} is 1.0, but @samp{float(a + 1)}
- is left unevaluated because its argument is not a number.
- You should use @kbd{H c f} if you wish to guarantee that the final
- value, once all the variables have been assigned, is a float; you
- would use @kbd{c f} if you wish to do the conversion on the numbers
- that appear right now.
- @kindex c F
- @pindex calc-fraction
- @tindex pfrac
- The @kbd{c F} (@code{calc-fraction}) [@code{pfrac}] command converts a
- floating-point number into a fractional approximation. By default, it
- produces a fraction whose decimal representation is the same as the
- input number, to within the current precision. You can also give a
- numeric prefix argument to specify a tolerance, either directly, or,
- if the prefix argument is zero, by using the number on top of the stack
- as the tolerance. If the tolerance is a positive integer, the fraction
- is correct to within that many significant figures. If the tolerance is
- a non-positive integer, it specifies how many digits fewer than the current
- precision to use. If the tolerance is a floating-point number, the
- fraction is correct to within that absolute amount.
- @kindex H c F
- @tindex frac
- The @code{pfrac} function is pervasive, like @code{pfloat}.
- There is also a non-pervasive version, @kbd{H c F} [@code{frac}],
- which is analogous to @kbd{H c f} discussed above.
- @kindex c d
- @pindex calc-to-degrees
- @tindex deg
- The @kbd{c d} (@code{calc-to-degrees}) [@code{deg}] command converts a
- number into degrees form. The value on the top of the stack may be an
- HMS form (interpreted as degrees-minutes-seconds), or a real number which
- will be interpreted in radians regardless of the current angular mode.@refill
- @kindex c r
- @pindex calc-to-radians
- @tindex rad
- The @kbd{c r} (@code{calc-to-radians}) [@code{rad}] command converts an
- HMS form or angle in degrees into an angle in radians.
- @kindex c h
- @pindex calc-to-hms
- @tindex hms
- The @kbd{c h} (@code{calc-to-hms}) [@code{hms}] command converts a real
- number, interpreted according to the current angular mode, to an HMS
- form describing the same angle. In algebraic notation, the @code{hms}
- function also accepts three arguments: @samp{hms(@var{h}, @var{m}, @var{s})}.
- (The three-argument version is independent of the current angular mode.)
- @pindex calc-from-hms
- The @code{calc-from-hms} command converts the HMS form on the top of the
- stack into a real number according to the current angular mode.
- @kindex c p
- @kindex I c p
- @pindex calc-polar
- @tindex polar
- @tindex rect
- The @kbd{c p} (@code{calc-polar}) command converts the complex number on
- the top of the stack from polar to rectangular form, or from rectangular
- to polar form, whichever is appropriate. Real numbers are left the same.
- This command is equivalent to the @code{rect} or @code{polar}
- functions in algebraic formulas, depending on the direction of
- conversion. (It uses @code{polar}, except that if the argument is
- already a polar complex number, it uses @code{rect} instead. The
- @kbd{I c p} command always uses @code{rect}.)@refill
- @kindex c c
- @pindex calc-clean
- @tindex pclean
- The @kbd{c c} (@code{calc-clean}) [@code{pclean}] command ``cleans'' the
- number on the top of the stack. Floating point numbers are re-rounded
- according to the current precision. Polar numbers whose angular
- components have strayed from the @i{-180} to @i{+180} degree range
- are normalized. (Note that results will be undesirable if the current
- angular mode is different from the one under which the number was
- produced!) Integers and fractions are generally unaffected by this
- operation. Vectors and formulas are cleaned by cleaning each component
- number (i.e., pervasively).@refill
- If the simplification mode is set below the default level, it is raised
- to the default level for the purposes of this command. Thus, @kbd{c c}
- applies the default simplifications even if their automatic application
- is disabled. @xref{Simplification Modes}.
- @cindex Roundoff errors, correcting
- A numeric prefix argument to @kbd{c c} sets the floating-point precision
- to that value for the duration of the command. A positive prefix (of at
- least 3) sets the precision to the specified value; a negative or zero
- prefix decreases the precision by the specified amount.
- @kindex c 0-9
- @pindex calc-clean-num
- The keystroke sequences @kbd{c 0} through @kbd{c 9} are equivalent
- to @kbd{c c} with the corresponding negative prefix argument. If roundoff
- errors have changed 2.0 into 1.999999, typing @kbd{c 1} to clip off one
- decimal place often conveniently does the trick.
- The @kbd{c c} command with a numeric prefix argument, and the @kbd{c 0}
- through @kbd{c 9} commands, also ``clip'' very small floating-point
- numbers to zero. If the exponent is less than or equal to the negative
- of the specified precision, the number is changed to 0.0. For example,
- if the current precision is 12, then @kbd{c 2} changes the vector
- @samp{[1e-8, 1e-9, 1e-10, 1e-11]} to @samp{[1e-8, 1e-9, 0, 0]}.
- Numbers this small generally arise from roundoff noise.
- If the numbers you are using really are legitimately this small,
- you should avoid using the @kbd{c 0} through @kbd{c 9} commands.
- (The plain @kbd{c c} command rounds to the current precision but
- does not clip small numbers.)
- One more property of @kbd{c 0} through @kbd{c 9}, and of @kbd{c c} with
- a prefix argument, is that integer-valued floats are converted to
- plain integers, so that @kbd{c 1} on @samp{[1., 1.5, 2., 2.5, 3.]}
- produces @samp{[1, 1.5, 2, 2.5, 3]}. This is not done for huge
- numbers (@samp{1e100} is technically an integer-valued float, but
- you wouldn't want it automatically converted to a 100-digit integer).
- @kindex H c 0-9
- @kindex H c c
- @tindex clean
- With the Hyperbolic flag, @kbd{H c c} and @kbd{H c 0} through @kbd{H c 9}
- operate non-pervasively [@code{clean}].
- @node Date Arithmetic, Financial Functions, Conversions, Arithmetic
- @section Date Arithmetic
- @noindent
- @cindex Date arithmetic, additional functions
- The commands described in this section perform various conversions
- and calculations involving date forms (@pxref{Date Forms}). They
- use the @kbd{t} (for time/date) prefix key followed by shifted
- letters.
- The simplest date arithmetic is done using the regular @kbd{+} and @kbd{-}
- commands. In particular, adding a number to a date form advances the
- date form by a certain number of days; adding an HMS form to a date
- form advances the date by a certain amount of time; and subtracting two
- date forms produces a difference measured in days. The commands
- described here provide additional, more specialized operations on dates.
- Many of these commands accept a numeric prefix argument; if you give
- plain @kbd{C-u} as the prefix, these commands will instead take the
- additional argument from the top of the stack.
- @menu
- * Date Conversions::
- * Date Functions::
- * Time Zones::
- * Business Days::
- @end menu
- @node Date Conversions, Date Functions, Date Arithmetic, Date Arithmetic
- @subsection Date Conversions
- @noindent
- @kindex t D
- @pindex calc-date
- @tindex date
- The @kbd{t D} (@code{calc-date}) [@code{date}] command converts a
- date form into a number, measured in days since Jan 1, 1 AD. The
- result will be an integer if @var{date} is a pure date form, or a
- fraction or float if @var{date} is a date/time form. Or, if its
- argument is a number, it converts this number into a date form.
- With a numeric prefix argument, @kbd{t D} takes that many objects
- (up to six) from the top of the stack and interprets them in one
- of the following ways:
- The @samp{date(@var{year}, @var{month}, @var{day})} function
- builds a pure date form out of the specified year, month, and
- day, which must all be integers. @var{Year} is a year number,
- such as 1991 (@emph{not} the same as 91!). @var{Month} must be
- an integer in the range 1 to 12; @var{day} must be in the range
- 1 to 31. If the specified month has fewer than 31 days and
- @var{day} is too large, the equivalent day in the following
- month will be used.
- The @samp{date(@var{month}, @var{day})} function builds a
- pure date form using the current year, as determined by the
- real-time clock.
- The @samp{date(@var{year}, @var{month}, @var{day}, @var{hms})}
- function builds a date/time form using an @var{hms} form.
- The @samp{date(@var{year}, @var{month}, @var{day}, @var{hour},
- @var{minute}, @var{second})} function builds a date/time form.
- @var{hour} should be an integer in the range 0 to 23;
- @var{minute} should be an integer in the range 0 to 59;
- @var{second} should be any real number in the range @samp{[0 .. 60)}.
- The last two arguments default to zero if omitted.
- @kindex t J
- @pindex calc-julian
- @tindex julian
- @cindex Julian day counts, conversions
- The @kbd{t J} (@code{calc-julian}) [@code{julian}] command converts
- a date form into a Julian day count, which is the number of days
- since noon on Jan 1, 4713 BC. A pure date is converted to an integer
- Julian count representing noon of that day. A date/time form is
- converted to an exact floating-point Julian count, adjusted to
- interpret the date form in the current time zone but the Julian
- day count in Greenwich Mean Time. A numeric prefix argument allows
- you to specify the time zone; @pxref{Time Zones}. Use a prefix of
- zero to suppress the time zone adjustment. Note that pure date forms
- are never time-zone adjusted.
- This command can also do the opposite conversion, from a Julian day
- count (either an integer day, or a floating-point day and time in
- the GMT zone), into a pure date form or a date/time form in the
- current or specified time zone.
- @kindex t U
- @pindex calc-unix-time
- @tindex unixtime
- @cindex Unix time format, conversions
- The @kbd{t U} (@code{calc-unix-time}) [@code{unixtime}] command
- converts a date form into a Unix time value, which is the number of
- seconds since midnight on Jan 1, 1970, or vice-versa. The numeric result
- will be an integer if the current precision is 12 or less; for higher
- precisions, the result may be a float with (@var{precision}@minus{}12)
- digits after the decimal. Just as for @kbd{t J}, the numeric time
- is interpreted in the GMT time zone and the date form is interpreted
- in the current or specified zone. Some systems use Unix-like
- numbering but with the local time zone; give a prefix of zero to
- suppress the adjustment if so.
- @kindex t C
- @pindex calc-convert-time-zones
- @tindex tzconv
- @cindex Time Zones, converting between
- The @kbd{t C} (@code{calc-convert-time-zones}) [@code{tzconv}]
- command converts a date form from one time zone to another. You
- are prompted for each time zone name in turn; you can answer with
- any suitable Calc time zone expression (@pxref{Time Zones}).
- If you answer either prompt with a blank line, the local time
- zone is used for that prompt. You can also answer the first
- prompt with @kbd{$} to take the two time zone names from the
- stack (and the date to be converted from the third stack level).
- @node Date Functions, Business Days, Date Conversions, Date Arithmetic
- @subsection Date Functions
- @noindent
- @kindex t N
- @pindex calc-now
- @tindex now
- The @kbd{t N} (@code{calc-now}) [@code{now}] command pushes the
- current date and time on the stack as a date form. The time is
- reported in terms of the specified time zone; with no numeric prefix
- argument, @kbd{t N} reports for the current time zone.
- @kindex t P
- @pindex calc-date-part
- The @kbd{t P} (@code{calc-date-part}) command extracts one part
- of a date form. The prefix argument specifies the part; with no
- argument, this command prompts for a part code from 1 to 9.
- The various part codes are described in the following paragraphs.
- @tindex year
- The @kbd{M-1 t P} [@code{year}] function extracts the year number
- from a date form as an integer, e.g., 1991. This and the
- following functions will also accept a real number for an
- argument, which is interpreted as a standard Calc day number.
- Note that this function will never return zero, since the year
- 1 BC immediately precedes the year 1 AD.
- @tindex month
- The @kbd{M-2 t P} [@code{month}] function extracts the month number
- from a date form as an integer in the range 1 to 12.
- @tindex day
- The @kbd{M-3 t P} [@code{day}] function extracts the day number
- from a date form as an integer in the range 1 to 31.
- @tindex hour
- The @kbd{M-4 t P} [@code{hour}] function extracts the hour from
- a date form as an integer in the range 0 (midnight) to 23. Note
- that 24-hour time is always used. This returns zero for a pure
- date form. This function (and the following two) also accept
- HMS forms as input.
- @tindex minute
- The @kbd{M-5 t P} [@code{minute}] function extracts the minute
- from a date form as an integer in the range 0 to 59.
- @tindex second
- The @kbd{M-6 t P} [@code{second}] function extracts the second
- from a date form. If the current precision is 12 or less,
- the result is an integer in the range 0 to 59. For higher
- precisions, the result may instead be a floating-point number.
- @tindex weekday
- The @kbd{M-7 t P} [@code{weekday}] function extracts the weekday
- number from a date form as an integer in the range 0 (Sunday)
- to 6 (Saturday).
- @tindex yearday
- The @kbd{M-8 t P} [@code{yearday}] function extracts the day-of-year
- number from a date form as an integer in the range 1 (January 1)
- to 366 (December 31 of a leap year).
- @tindex time
- The @kbd{M-9 t P} [@code{time}] function extracts the time portion
- of a date form as an HMS form. This returns @samp{0@@ 0' 0"}
- for a pure date form.
- @kindex t M
- @pindex calc-new-month
- @tindex newmonth
- The @kbd{t M} (@code{calc-new-month}) [@code{newmonth}] command
- computes a new date form that represents the first day of the month
- specified by the input date. The result is always a pure date
- form; only the year and month numbers of the input are retained.
- With a numeric prefix argument @var{n} in the range from 1 to 31,
- @kbd{t M} computes the @var{n}th day of the month. (If @var{n}
- is greater than the actual number of days in the month, or if
- @var{n} is zero, the last day of the month is used.)
- @kindex t Y
- @pindex calc-new-year
- @tindex newyear
- The @kbd{t Y} (@code{calc-new-year}) [@code{newyear}] command
- computes a new pure date form that represents the first day of
- the year specified by the input. The month, day, and time
- of the input date form are lost. With a numeric prefix argument
- @var{n} in the range from 1 to 366, @kbd{t Y} computes the
- @var{n}th day of the year (366 is treated as 365 in non-leap
- years). A prefix argument of 0 computes the last day of the
- year (December 31). A negative prefix argument from @i{-1} to
- @i{-12} computes the first day of the @var{n}th month of the year.
- @kindex t W
- @pindex calc-new-week
- @tindex newweek
- The @kbd{t W} (@code{calc-new-week}) [@code{newweek}] command
- computes a new pure date form that represents the Sunday on or before
- the input date. With a numeric prefix argument, it can be made to
- use any day of the week as the starting day; the argument must be in
- the range from 0 (Sunday) to 6 (Saturday). This function always
- subtracts between 0 and 6 days from the input date.
- Here's an example use of @code{newweek}: Find the date of the next
- Wednesday after a given date. Using @kbd{M-3 t W} or @samp{newweek(d, 3)}
- will give you the @emph{preceding} Wednesday, so @samp{newweek(d+7, 3)}
- will give you the following Wednesday. A further look at the definition
- of @code{newweek} shows that if the input date is itself a Wednesday,
- this formula will return the Wednesday one week in the future. An
- exercise for the reader is to modify this formula to yield the same day
- if the input is already a Wednesday. Another interesting exercise is
- to preserve the time-of-day portion of the input (@code{newweek} resets
- the time to midnight; hint:@: how can @code{newweek} be defined in terms
- of the @code{weekday} function?).
- @ignore
- @starindex
- @end ignore
- @tindex pwday
- The @samp{pwday(@var{date})} function (not on any key) computes the
- day-of-month number of the Sunday on or before @var{date}. With
- two arguments, @samp{pwday(@var{date}, @var{day})} computes the day
- number of the Sunday on or before day number @var{day} of the month
- specified by @var{date}. The @var{day} must be in the range from
- 7 to 31; if the day number is greater than the actual number of days
- in the month, the true number of days is used instead. Thus
- @samp{pwday(@var{date}, 7)} finds the first Sunday of the month, and
- @samp{pwday(@var{date}, 31)} finds the last Sunday of the month.
- With a third @var{weekday} argument, @code{pwday} can be made to look
- for any day of the week instead of Sunday.
- @kindex t I
- @pindex calc-inc-month
- @tindex incmonth
- The @kbd{t I} (@code{calc-inc-month}) [@code{incmonth}] command
- increases a date form by one month, or by an arbitrary number of
- months specified by a numeric prefix argument. The time portion,
- if any, of the date form stays the same. The day also stays the
- same, except that if the new month has fewer days the day
- number may be reduced to lie in the valid range. For example,
- @samp{incmonth(<Jan 31, 1991>)} produces @samp{<Feb 28, 1991>}.
- Because of this, @kbd{t I t I} and @kbd{M-2 t I} do not always give
- the same results (@samp{<Mar 28, 1991>} versus @samp{<Mar 31, 1991>}
- in this case).
- @ignore
- @starindex
- @end ignore
- @tindex incyear
- The @samp{incyear(@var{date}, @var{step})} function increases
- a date form by the specified number of years, which may be
- any positive or negative integer. Note that @samp{incyear(d, n)}
- is equivalent to @w{@samp{incmonth(d, 12*n)}}, but these do not have
- simple equivalents in terms of day arithmetic because
- months and years have varying lengths. If the @var{step}
- argument is omitted, 1 year is assumed. There is no keyboard
- command for this function; use @kbd{C-u 12 t I} instead.
- There is no @code{newday} function at all because @kbd{F} [@code{floor}]
- serves this purpose. Similarly, instead of @code{incday} and
- @code{incweek} simply use @cite{d + n} or @cite{d + 7 n}.
- @xref{Basic Arithmetic}, for the @kbd{f ]} [@code{incr}] command
- which can adjust a date/time form by a certain number of seconds.
- @node Business Days, Time Zones, Date Functions, Date Arithmetic
- @subsection Business Days
- @noindent
- Often time is measured in ``business days'' or ``working days,''
- where weekends and holidays are skipped. Calc's normal date
- arithmetic functions use calendar days, so that subtracting two
- consecutive Mondays will yield a difference of 7 days. By contrast,
- subtracting two consecutive Mondays would yield 5 business days
- (assuming two-day weekends and the absence of holidays).
- @kindex t +
- @kindex t -
- @tindex badd
- @tindex bsub
- @pindex calc-business-days-plus
- @pindex calc-business-days-minus
- The @kbd{t +} (@code{calc-business-days-plus}) [@code{badd}]
- and @kbd{t -} (@code{calc-business-days-minus}) [@code{bsub}]
- commands perform arithmetic using business days. For @kbd{t +},
- one argument must be a date form and the other must be a real
- number (positive or negative). If the number is not an integer,
- then a certain amount of time is added as well as a number of
- days; for example, adding 0.5 business days to a time in Friday
- evening will produce a time in Monday morning. It is also
- possible to add an HMS form; adding @samp{12@@ 0' 0"} also adds
- half a business day. For @kbd{t -}, the arguments are either a
- date form and a number or HMS form, or two date forms, in which
- case the result is the number of business days between the two
- dates.
- @cindex @code{Holidays} variable
- @vindex Holidays
- By default, Calc considers any day that is not a Saturday or
- Sunday to be a business day. You can define any number of
- additional holidays by editing the variable @code{Holidays}.
- (There is an @w{@kbd{s H}} convenience command for editing this
- variable.) Initially, @code{Holidays} contains the vector
- @samp{[sat, sun]}. Entries in the @code{Holidays} vector may
- be any of the following kinds of objects:
- @itemize @bullet
- @item
- Date forms (pure dates, not date/time forms). These specify
- particular days which are to be treated as holidays.
- @item
- Intervals of date forms. These specify a range of days, all of
- which are holidays (e.g., Christmas week). @xref{Interval Forms}.
- @item
- Nested vectors of date forms. Each date form in the vector is
- considered to be a holiday.
- @item
- Any Calc formula which evaluates to one of the above three things.
- If the formula involves the variable @cite{y}, it stands for a
- yearly repeating holiday; @cite{y} will take on various year
- numbers like 1992. For example, @samp{date(y, 12, 25)} specifies
- Christmas day, and @samp{newweek(date(y, 11, 7), 4) + 21} specifies
- Thanksgiving (which is held on the fourth Thursday of November).
- If the formula involves the variable @cite{m}, that variable
- takes on month numbers from 1 to 12: @samp{date(y, m, 15)} is
- a holiday that takes place on the 15th of every month.
- @item
- A weekday name, such as @code{sat} or @code{sun}. This is really
- a variable whose name is a three-letter, lower-case day name.
- @item
- An interval of year numbers (integers). This specifies the span of
- years over which this holiday list is to be considered valid. Any
- business-day arithmetic that goes outside this range will result
- in an error message. Use this if you are including an explicit
- list of holidays, rather than a formula to generate them, and you
- want to make sure you don't accidentally go beyond the last point
- where the holidays you entered are complete. If there is no
- limiting interval in the @code{Holidays} vector, the default
- @samp{[1 .. 2737]} is used. (This is the absolute range of years
- for which Calc's business-day algorithms will operate.)
- @item
- An interval of HMS forms. This specifies the span of hours that
- are to be considered one business day. For example, if this
- range is @samp{[9@@ 0' 0" .. 17@@ 0' 0"]} (i.e., 9am to 5pm), then
- the business day is only eight hours long, so that @kbd{1.5 t +}
- on @samp{<4:00pm Fri Dec 13, 1991>} will add one business day and
- four business hours to produce @samp{<12:00pm Tue Dec 17, 1991>}.
- Likewise, @kbd{t -} will now express differences in time as
- fractions of an eight-hour day. Times before 9am will be treated
- as 9am by business date arithmetic, and times at or after 5pm will
- be treated as 4:59:59pm. If there is no HMS interval in @code{Holidays},
- the full 24-hour day @samp{[0@ 0' 0" .. 24@ 0' 0"]} is assumed.
- (Regardless of the type of bounds you specify, the interval is
- treated as inclusive on the low end and exclusive on the high end,
- so that the work day goes from 9am up to, but not including, 5pm.)
- @end itemize
- If the @code{Holidays} vector is empty, then @kbd{t +} and
- @kbd{t -} will act just like @kbd{+} and @kbd{-} because there will
- then be no difference between business days and calendar days.
- Calc expands the intervals and formulas you give into a complete
- list of holidays for internal use. This is done mainly to make
- sure it can detect multiple holidays. (For example,
- @samp{<Jan 1, 1989>} is both New Year's Day and a Sunday, but
- Calc's algorithms take care to count it only once when figuring
- the number of holidays between two dates.)
- Since the complete list of holidays for all the years from 1 to
- 2737 would be huge, Calc actually computes only the part of the
- list between the smallest and largest years that have been involved
- in business-day calculations so far. Normally, you won't have to
- worry about this. Keep in mind, however, that if you do one
- calculation for 1992, and another for 1792, even if both involve
- only a small range of years, Calc will still work out all the
- holidays that fall in that 200-year span.
- If you add a (positive) number of days to a date form that falls on a
- weekend or holiday, the date form is treated as if it were the most
- recent business day. (Thus adding one business day to a Friday,
- Saturday, or Sunday will all yield the following Monday.) If you
- subtract a number of days from a weekend or holiday, the date is
- effectively on the following business day. (So subtracting one business
- day from Saturday, Sunday, or Monday yields the preceding Friday.) The
- difference between two dates one or both of which fall on holidays
- equals the number of actual business days between them. These
- conventions are consistent in the sense that, if you add @var{n}
- business days to any date, the difference between the result and the
- original date will come out to @var{n} business days. (It can't be
- completely consistent though; a subtraction followed by an addition
- might come out a bit differently, since @kbd{t +} is incapable of
- producing a date that falls on a weekend or holiday.)
- @ignore
- @starindex
- @end ignore
- @tindex holiday
- There is a @code{holiday} function, not on any keys, that takes
- any date form and returns 1 if that date falls on a weekend or
- holiday, as defined in @code{Holidays}, or 0 if the date is a
- business day.
- @node Time Zones, , Business Days, Date Arithmetic
- @subsection Time Zones
- @noindent
- @cindex Time zones
- @cindex Daylight savings time
- Time zones and daylight savings time are a complicated business.
- The conversions to and from Julian and Unix-style dates automatically
- compute the correct time zone and daylight savings adjustment to use,
- provided they can figure out this information. This section describes
- Calc's time zone adjustment algorithm in detail, in case you want to
- do conversions in different time zones or in case Calc's algorithms
- can't determine the right correction to use.
- Adjustments for time zones and daylight savings time are done by
- @kbd{t U}, @kbd{t J}, @kbd{t N}, and @kbd{t C}, but not by any other
- commands. In particular, @samp{<may 1 1991> - <apr 1 1991>} evaluates
- to exactly 30 days even though there is a daylight-savings
- transition in between. This is also true for Julian pure dates:
- @samp{julian(<may 1 1991>) - julian(<apr 1 1991>)}. But Julian
- and Unix date/times will adjust for daylight savings time:
- @samp{julian(<12am may 1 1991>) - julian(<12am apr 1 1991>)}
- evaluates to @samp{29.95834} (that's 29 days and 23 hours)
- because one hour was lost when daylight savings commenced on
- April 7, 1991.
- In brief, the idiom @samp{julian(@var{date1}) - julian(@var{date2})}
- computes the actual number of 24-hour periods between two dates, whereas
- @samp{@var{date1} - @var{date2}} computes the number of calendar
- days between two dates without taking daylight savings into account.
- @pindex calc-time-zone
- @ignore
- @starindex
- @end ignore
- @tindex tzone
- The @code{calc-time-zone} [@code{tzone}] command converts the time
- zone specified by its numeric prefix argument into a number of
- seconds difference from Greenwich mean time (GMT). If the argument
- is a number, the result is simply that value multiplied by 3600.
- Typical arguments for North America are 5 (Eastern) or 8 (Pacific). If
- Daylight Savings time is in effect, one hour should be subtracted from
- the normal difference.
- If you give a prefix of plain @kbd{C-u}, @code{calc-time-zone} (like other
- date arithmetic commands that include a time zone argument) takes the
- zone argument from the top of the stack. (In the case of @kbd{t J}
- and @kbd{t U}, the normal argument is then taken from the second-to-top
- stack position.) This allows you to give a non-integer time zone
- adjustment. The time-zone argument can also be an HMS form, or
- it can be a variable which is a time zone name in upper- or lower-case.
- For example @samp{tzone(PST) = tzone(8)} and @samp{tzone(pdt) = tzone(7)}
- (for Pacific standard and daylight savings times, respectively).
- North American and European time zone names are defined as follows;
- note that for each time zone there is one name for standard time,
- another for daylight savings time, and a third for ``generalized'' time
- in which the daylight savings adjustment is computed from context.
- @smallexample
- @group
- YST PST MST CST EST AST NST GMT WET MET MEZ
- 9 8 7 6 5 4 3.5 0 -1 -2 -2
- YDT PDT MDT CDT EDT ADT NDT BST WETDST METDST MESZ
- 8 7 6 5 4 3 2.5 -1 -2 -3 -3
- YGT PGT MGT CGT EGT AGT NGT BGT WEGT MEGT MEGZ
- 9/8 8/7 7/6 6/5 5/4 4/3 3.5/2.5 0/-1 -1/-2 -2/-3 -2/-3
- @end group
- @end smallexample
- @vindex math-tzone-names
- To define time zone names that do not appear in the above table,
- you must modify the Lisp variable @code{math-tzone-names}. This
- is a list of lists describing the different time zone names; its
- structure is best explained by an example. The three entries for
- Pacific Time look like this:
- @smallexample
- @group
- ( ( "PST" 8 0 ) ; Name as an upper-case string, then standard
- ( "PDT" 8 -1 ) ; adjustment, then daylight savings adjustment.
- ( "PGT" 8 "PST" "PDT" ) ) ; Generalized time zone.
- @end group
- @end smallexample
- @cindex @code{TimeZone} variable
- @vindex TimeZone
- With no arguments, @code{calc-time-zone} or @samp{tzone()} obtains an
- argument from the Calc variable @code{TimeZone} if a value has been
- stored for that variable. If not, Calc runs the Unix @samp{date}
- command and looks for one of the above time zone names in the output;
- if this does not succeed, @samp{tzone()} leaves itself unevaluated.
- The time zone name in the @samp{date} output may be followed by a signed
- adjustment, e.g., @samp{GMT+5} or @samp{GMT+0500} which specifies a
- number of hours and minutes to be added to the base time zone.
- Calc stores the time zone it finds into @code{TimeZone} to speed
- later calls to @samp{tzone()}.
- The special time zone name @code{local} is equivalent to no argument,
- i.e., it uses the local time zone as obtained from the @code{date}
- command.
- If the time zone name found is one of the standard or daylight
- savings zone names from the above table, and Calc's internal
- daylight savings algorithm says that time and zone are consistent
- (e.g., @code{PDT} accompanies a date that Calc's algorithm would also
- consider to be daylight savings, or @code{PST} accompanies a date
- that Calc would consider to be standard time), then Calc substitutes
- the corresponding generalized time zone (like @code{PGT}).
- If your system does not have a suitable @samp{date} command, you
- may wish to put a @samp{(setq var-TimeZone ...)} in your Emacs
- initialization file to set the time zone. The easiest way to do
- this is to edit the @code{TimeZone} variable using Calc's @kbd{s T}
- command, then use the @kbd{s p} (@code{calc-permanent-variable})
- command to save the value of @code{TimeZone} permanently.
- The @kbd{t J} and @code{t U} commands with no numeric prefix
- arguments do the same thing as @samp{tzone()}. If the current
- time zone is a generalized time zone, e.g., @code{EGT}, Calc
- examines the date being converted to tell whether to use standard
- or daylight savings time. But if the current time zone is explicit,
- e.g., @code{EST} or @code{EDT}, then that adjustment is used exactly
- and Calc's daylight savings algorithm is not consulted.
- Some places don't follow the usual rules for daylight savings time.
- The state of Arizona, for example, does not observe daylight savings
- time. If you run Calc during the winter season in Arizona, the
- Unix @code{date} command will report @code{MST} time zone, which
- Calc will change to @code{MGT}. If you then convert a time that
- lies in the summer months, Calc will apply an incorrect daylight
- savings time adjustment. To avoid this, set your @code{TimeZone}
- variable explicitly to @code{MST} to force the use of standard,
- non-daylight-savings time.
- @vindex math-daylight-savings-hook
- @findex math-std-daylight-savings
- By default Calc always considers daylight savings time to begin at
- 2 a.m.@: on the first Sunday of April, and to end at 2 a.m.@: on the
- last Sunday of October. This is the rule that has been in effect
- in North America since 1987. If you are in a country that uses
- different rules for computing daylight savings time, you have two
- choices: Write your own daylight savings hook, or control time
- zones explicitly by setting the @code{TimeZone} variable and/or
- always giving a time-zone argument for the conversion functions.
- The Lisp variable @code{math-daylight-savings-hook} holds the
- name of a function that is used to compute the daylight savings
- adjustment for a given date. The default is
- @code{math-std-daylight-savings}, which computes an adjustment
- (either 0 or @i{-1}) using the North American rules given above.
- The daylight savings hook function is called with four arguments:
- The date, as a floating-point number in standard Calc format;
- a six-element list of the date decomposed into year, month, day,
- hour, minute, and second, respectively; a string which contains
- the generalized time zone name in upper-case, e.g., @code{"WEGT"};
- and a special adjustment to be applied to the hour value when
- converting into a generalized time zone (see below).
- @findex math-prev-weekday-in-month
- The Lisp function @code{math-prev-weekday-in-month} is useful for
- daylight savings computations. This is an internal version of
- the user-level @code{pwday} function described in the previous
- section. It takes four arguments: The floating-point date value,
- the corresponding six-element date list, the day-of-month number,
- and the weekday number (0-6).
- The default daylight savings hook ignores the time zone name, but a
- more sophisticated hook could use different algorithms for different
- time zones. It would also be possible to use different algorithms
- depending on the year number, but the default hook always uses the
- algorithm for 1987 and later. Here is a listing of the default
- daylight savings hook:
- @smallexample
- (defun math-std-daylight-savings (date dt zone bump)
- (cond ((< (nth 1 dt) 4) 0)
- ((= (nth 1 dt) 4)
- (let ((sunday (math-prev-weekday-in-month date dt 7 0)))
- (cond ((< (nth 2 dt) sunday) 0)
- ((= (nth 2 dt) sunday)
- (if (>= (nth 3 dt) (+ 3 bump)) -1 0))
- (t -1))))
- ((< (nth 1 dt) 10) -1)
- ((= (nth 1 dt) 10)
- (let ((sunday (math-prev-weekday-in-month date dt 31 0)))
- (cond ((< (nth 2 dt) sunday) -1)
- ((= (nth 2 dt) sunday)
- (if (>= (nth 3 dt) (+ 2 bump)) 0 -1))
- (t 0))))
- (t 0))
- )
- @end smallexample
- @noindent
- The @code{bump} parameter is equal to zero when Calc is converting
- from a date form in a generalized time zone into a GMT date value.
- It is @i{-1} when Calc is converting in the other direction. The
- adjustments shown above ensure that the conversion behaves correctly
- and reasonably around the 2 a.m.@: transition in each direction.
- There is a ``missing'' hour between 2 a.m.@: and 3 a.m.@: at the
- beginning of daylight savings time; converting a date/time form that
- falls in this hour results in a time value for the following hour,
- from 3 a.m.@: to 4 a.m. At the end of daylight savings time, the
- hour from 1 a.m.@: to 2 a.m.@: repeats itself; converting a date/time
- form that falls in in this hour results in a time value for the first
- manifestion of that time (@emph{not} the one that occurs one hour later).
- If @code{math-daylight-savings-hook} is @code{nil}, then the
- daylight savings adjustment is always taken to be zero.
- In algebraic formulas, @samp{tzone(@var{zone}, @var{date})}
- computes the time zone adjustment for a given zone name at a
- given date. The @var{date} is ignored unless @var{zone} is a
- generalized time zone. If @var{date} is a date form, the
- daylight savings computation is applied to it as it appears.
- If @var{date} is a numeric date value, it is adjusted for the
- daylight-savings version of @var{zone} before being given to
- the daylight savings hook. This odd-sounding rule ensures
- that the daylight-savings computation is always done in
- local time, not in the GMT time that a numeric @var{date}
- is typically represented in.
- @ignore
- @starindex
- @end ignore
- @tindex dsadj
- The @samp{dsadj(@var{date}, @var{zone})} function computes the
- daylight savings adjustment that is appropriate for @var{date} in
- time zone @var{zone}. If @var{zone} is explicitly in or not in
- daylight savings time (e.g., @code{PDT} or @code{PST}) the
- @var{date} is ignored. If @var{zone} is a generalized time zone,
- the algorithms described above are used. If @var{zone} is omitted,
- the computation is done for the current time zone.
- @xref{Reporting Bugs}, for the address of Calc's author, if you
- should wish to contribute your improved versions of
- @code{math-tzone-names} and @code{math-daylight-savings-hook}
- to the Calc distribution.
- @node Financial Functions, Binary Functions, Date Arithmetic, Arithmetic
- @section Financial Functions
- @noindent
- Calc's financial or business functions use the @kbd{b} prefix
- key followed by a shifted letter. (The @kbd{b} prefix followed by
- a lower-case letter is used for operations on binary numbers.)
- Note that the rate and the number of intervals given to these
- functions must be on the same time scale, e.g., both months or
- both years. Mixing an annual interest rate with a time expressed
- in months will give you very wrong answers!
- It is wise to compute these functions to a higher precision than
- you really need, just to make sure your answer is correct to the
- last penny; also, you may wish to check the definitions at the end
- of this section to make sure the functions have the meaning you expect.
- @menu
- * Percentages::
- * Future Value::
- * Present Value::
- * Related Financial Functions::
- * Depreciation Functions::
- * Definitions of Financial Functions::
- @end menu
- @node Percentages, Future Value, Financial Functions, Financial Functions
- @subsection Percentages
- @kindex M-%
- @pindex calc-percent
- @tindex %
- @tindex percent
- The @kbd{M-%} (@code{calc-percent}) command takes a percentage value,
- say 5.4, and converts it to an equivalent actual number. For example,
- @kbd{5.4 M-%} enters 0.054 on the stack. (That's the @key{META} or
- @key{ESC} key combined with @kbd{%}.)
- Actually, @kbd{M-%} creates a formula of the form @samp{5.4%}.
- You can enter @samp{5.4%} yourself during algebraic entry. The
- @samp{%} operator simply means, ``the preceding value divided by
- 100.'' The @samp{%} operator has very high precedence, so that
- @samp{1+8%} is interpreted as @samp{1+(8%)}, not as @samp{(1+8)%}.
- (The @samp{%} operator is just a postfix notation for the
- @code{percent} function, just like @samp{20!} is the notation for
- @samp{fact(20)}, or twenty-factorial.)
- The formula @samp{5.4%} would normally evaluate immediately to
- 0.054, but the @kbd{M-%} command suppresses evaluation as it puts
- the formula onto the stack. However, the next Calc command that
- uses the formula @samp{5.4%} will evaluate it as its first step.
- The net effect is that you get to look at @samp{5.4%} on the stack,
- but Calc commands see it as @samp{0.054}, which is what they expect.
- In particular, @samp{5.4%} and @samp{0.054} are suitable values
- for the @var{rate} arguments of the various financial functions,
- but the number @samp{5.4} is probably @emph{not} suitable---it
- represents a rate of 540 percent!
- The key sequence @kbd{M-% *} effectively means ``percent-of.''
- For example, @kbd{68 @key{RET} 25 M-% *} computes 17, which is 25% of
- 68 (and also 68% of 25, which comes out to the same thing).
- @kindex c %
- @pindex calc-convert-percent
- The @kbd{c %} (@code{calc-convert-percent}) command converts the
- value on the top of the stack from numeric to percentage form.
- For example, if 0.08 is on the stack, @kbd{c %} converts it to
- @samp{8%}. The quantity is the same, it's just represented
- differently. (Contrast this with @kbd{M-%}, which would convert
- this number to @samp{0.08%}.) The @kbd{=} key is a convenient way
- to convert a formula like @samp{8%} back to numeric form, 0.08.
- To compute what percentage one quantity is of another quantity,
- use @kbd{/ c %}. For example, @w{@kbd{17 @key{RET} 68 / c %}} displays
- @samp{25%}.
- @kindex b %
- @pindex calc-percent-change
- @tindex relch
- The @kbd{b %} (@code{calc-percent-change}) [@code{relch}] command
- calculates the percentage change from one number to another.
- For example, @kbd{40 @key{RET} 50 b %} produces the answer @samp{25%},
- since 50 is 25% larger than 40. A negative result represents a
- decrease: @kbd{50 @key{RET} 40 b %} produces @samp{-20%}, since 40 is
- 20% smaller than 50. (The answers are different in magnitude
- because, in the first case, we're increasing by 25% of 40, but
- in the second case, we're decreasing by 20% of 50.) The effect
- of @kbd{40 @key{RET} 50 b %} is to compute @cite{(50-40)/40}, converting
- the answer to percentage form as if by @kbd{c %}.
- @node Future Value, Present Value, Percentages, Financial Functions
- @subsection Future Value
- @noindent
- @kindex b F
- @pindex calc-fin-fv
- @tindex fv
- The @kbd{b F} (@code{calc-fin-fv}) [@code{fv}] command computes
- the future value of an investment. It takes three arguments
- from the stack: @samp{fv(@var{rate}, @var{n}, @var{payment})}.
- If you give payments of @var{payment} every year for @var{n}
- years, and the money you have paid earns interest at @var{rate} per
- year, then this function tells you what your investment would be
- worth at the end of the period. (The actual interval doesn't
- have to be years, as long as @var{n} and @var{rate} are expressed
- in terms of the same intervals.) This function assumes payments
- occur at the @emph{end} of each interval.
- @kindex I b F
- @tindex fvb
- The @kbd{I b F} [@code{fvb}] command does the same computation,
- but assuming your payments are at the beginning of each interval.
- Suppose you plan to deposit $1000 per year in a savings account
- earning 5.4% interest, starting right now. How much will be
- in the account after five years? @code{fvb(5.4%, 5, 1000) = 5870.73}.
- Thus you will have earned $870 worth of interest over the years.
- Using the stack, this calculation would have been
- @kbd{5.4 M-% 5 @key{RET} 1000 I b F}. Note that the rate is expressed
- as a number between 0 and 1, @emph{not} as a percentage.
- @kindex H b F
- @tindex fvl
- The @kbd{H b F} [@code{fvl}] command computes the future value
- of an initial lump sum investment. Suppose you could deposit
- those five thousand dollars in the bank right now; how much would
- they be worth in five years? @code{fvl(5.4%, 5, 5000) = 6503.89}.
- The algebraic functions @code{fv} and @code{fvb} accept an optional
- fourth argument, which is used as an initial lump sum in the sense
- of @code{fvl}. In other words, @code{fv(@var{rate}, @var{n},
- @var{payment}, @var{initial}) = fv(@var{rate}, @var{n}, @var{payment})
- + fvl(@var{rate}, @var{n}, @var{initial})}.@refill
- To illustrate the relationships between these functions, we could
- do the @code{fvb} calculation ``by hand'' using @code{fvl}. The
- final balance will be the sum of the contributions of our five
- deposits at various times. The first deposit earns interest for
- five years: @code{fvl(5.4%, 5, 1000) = 1300.78}. The second
- deposit only earns interest for four years: @code{fvl(5.4%, 4, 1000) =
- 1234.13}. And so on down to the last deposit, which earns one
- year's interest: @code{fvl(5.4%, 1, 1000) = 1054.00}. The sum of
- these five values is, sure enough, $5870.73, just as was computed
- by @code{fvb} directly.
- What does @code{fv(5.4%, 5, 1000) = 5569.96} mean? The payments
- are now at the ends of the periods. The end of one year is the same
- as the beginning of the next, so what this really means is that we've
- lost the payment at year zero (which contributed $1300.78), but we're
- now counting the payment at year five (which, since it didn't have
- a chance to earn interest, counts as $1000). Indeed, @cite{5569.96 =
- 5870.73 - 1300.78 + 1000} (give or take a bit of roundoff error).
- @node Present Value, Related Financial Functions, Future Value, Financial Functions
- @subsection Present Value
- @noindent
- @kindex b P
- @pindex calc-fin-pv
- @tindex pv
- The @kbd{b P} (@code{calc-fin-pv}) [@code{pv}] command computes
- the present value of an investment. Like @code{fv}, it takes
- three arguments: @code{pv(@var{rate}, @var{n}, @var{payment})}.
- It computes the present value of a series of regular payments.
- Suppose you have the chance to make an investment that will
- pay $2000 per year over the next four years; as you receive
- these payments you can put them in the bank at 9% interest.
- You want to know whether it is better to make the investment, or
- to keep the money in the bank where it earns 9% interest right
- from the start. The calculation @code{pv(9%, 4, 2000)} gives the
- result 6479.44. If your initial investment must be less than this,
- say, $6000, then the investment is worthwhile. But if you had to
- put up $7000, then it would be better just to leave it in the bank.
- Here is the interpretation of the result of @code{pv}: You are
- trying to compare the return from the investment you are
- considering, which is @code{fv(9%, 4, 2000) = 9146.26}, with
- the return from leaving the money in the bank, which is
- @code{fvl(9%, 4, @var{x})} where @var{x} is the amount of money
- you would have to put up in advance. The @code{pv} function
- finds the break-even point, @cite{x = 6479.44}, at which
- @code{fvl(9%, 4, 6479.44)} is also equal to 9146.26. This is
- the largest amount you should be willing to invest.
- @kindex I b P
- @tindex pvb
- The @kbd{I b P} [@code{pvb}] command solves the same problem,
- but with payments occurring at the beginning of each interval.
- It has the same relationship to @code{fvb} as @code{pv} has
- to @code{fv}. For example @code{pvb(9%, 4, 2000) = 7062.59},
- a larger number than @code{pv} produced because we get to start
- earning interest on the return from our investment sooner.
- @kindex H b P
- @tindex pvl
- The @kbd{H b P} [@code{pvl}] command computes the present value of
- an investment that will pay off in one lump sum at the end of the
- period. For example, if we get our $8000 all at the end of the
- four years, @code{pvl(9%, 4, 8000) = 5667.40}. This is much
- less than @code{pv} reported, because we don't earn any interest
- on the return from this investment. Note that @code{pvl} and
- @code{fvl} are simple inverses: @code{fvl(9%, 4, 5667.40) = 8000}.
- You can give an optional fourth lump-sum argument to @code{pv}
- and @code{pvb}; this is handled in exactly the same way as the
- fourth argument for @code{fv} and @code{fvb}.
- @kindex b N
- @pindex calc-fin-npv
- @tindex npv
- The @kbd{b N} (@code{calc-fin-npv}) [@code{npv}] command computes
- the net present value of a series of irregular investments.
- The first argument is the interest rate. The second argument is
- a vector which represents the expected return from the investment
- at the end of each interval. For example, if the rate represents
- a yearly interest rate, then the vector elements are the return
- from the first year, second year, and so on.
- Thus, @code{npv(9%, [2000,2000,2000,2000]) = pv(9%, 4, 2000) = 6479.44}.
- Obviously this function is more interesting when the payments are
- not all the same!
- The @code{npv} function can actually have two or more arguments.
- Multiple arguments are interpreted in the same way as for the
- vector statistical functions like @code{vsum}.
- @xref{Single-Variable Statistics}. Basically, if there are several
- payment arguments, each either a vector or a plain number, all these
- values are collected left-to-right into the complete list of payments.
- A numeric prefix argument on the @kbd{b N} command says how many
- payment values or vectors to take from the stack.@refill
- @kindex I b N
- @tindex npvb
- The @kbd{I b N} [@code{npvb}] command computes the net present
- value where payments occur at the beginning of each interval
- rather than at the end.
- @node Related Financial Functions, Depreciation Functions, Present Value, Financial Functions
- @subsection Related Financial Functions
- @noindent
- The functions in this section are basically inverses of the
- present value functions with respect to the various arguments.
- @kindex b M
- @pindex calc-fin-pmt
- @tindex pmt
- The @kbd{b M} (@code{calc-fin-pmt}) [@code{pmt}] command computes
- the amount of periodic payment necessary to amortize a loan.
- Thus @code{pmt(@var{rate}, @var{n}, @var{amount})} equals the
- value of @var{payment} such that @code{pv(@var{rate}, @var{n},
- @var{payment}) = @var{amount}}.@refill
- @kindex I b M
- @tindex pmtb
- The @kbd{I b M} [@code{pmtb}] command does the same computation
- but using @code{pvb} instead of @code{pv}. Like @code{pv} and
- @code{pvb}, these functions can also take a fourth argument which
- represents an initial lump-sum investment.
- @kindex H b M
- The @kbd{H b M} key just invokes the @code{fvl} function, which is
- the inverse of @code{pvl}. There is no explicit @code{pmtl} function.
- @kindex b #
- @pindex calc-fin-nper
- @tindex nper
- The @kbd{b #} (@code{calc-fin-nper}) [@code{nper}] command computes
- the number of regular payments necessary to amortize a loan.
- Thus @code{nper(@var{rate}, @var{payment}, @var{amount})} equals
- the value of @var{n} such that @code{pv(@var{rate}, @var{n},
- @var{payment}) = @var{amount}}. If @var{payment} is too small
- ever to amortize a loan for @var{amount} at interest rate @var{rate},
- the @code{nper} function is left in symbolic form.@refill
- @kindex I b #
- @tindex nperb
- The @kbd{I b #} [@code{nperb}] command does the same computation
- but using @code{pvb} instead of @code{pv}. You can give a fourth
- lump-sum argument to these functions, but the computation will be
- rather slow in the four-argument case.@refill
- @kindex H b #
- @tindex nperl
- The @kbd{H b #} [@code{nperl}] command does the same computation
- using @code{pvl}. By exchanging @var{payment} and @var{amount} you
- can also get the solution for @code{fvl}. For example,
- @code{nperl(8%, 2000, 1000) = 9.006}, so if you place $1000 in a
- bank account earning 8%, it will take nine years to grow to $2000.@refill
- @kindex b T
- @pindex calc-fin-rate
- @tindex rate
- The @kbd{b T} (@code{calc-fin-rate}) [@code{rate}] command computes
- the rate of return on an investment. This is also an inverse of @code{pv}:
- @code{rate(@var{n}, @var{payment}, @var{amount})} computes the value of
- @var{rate} such that @code{pv(@var{rate}, @var{n}, @var{payment}) =
- @var{amount}}. The result is expressed as a formula like @samp{6.3%}.@refill
- @kindex I b T
- @kindex H b T
- @tindex rateb
- @tindex ratel
- The @kbd{I b T} [@code{rateb}] and @kbd{H b T} [@code{ratel}]
- commands solve the analogous equations with @code{pvb} or @code{pvl}
- in place of @code{pv}. Also, @code{rate} and @code{rateb} can
- accept an optional fourth argument just like @code{pv} and @code{pvb}.
- To redo the above example from a different perspective,
- @code{ratel(9, 2000, 1000) = 8.00597%}, which says you will need an
- interest rate of 8% in order to double your account in nine years.@refill
- @kindex b I
- @pindex calc-fin-irr
- @tindex irr
- The @kbd{b I} (@code{calc-fin-irr}) [@code{irr}] command is the
- analogous function to @code{rate} but for net present value.
- Its argument is a vector of payments. Thus @code{irr(@var{payments})}
- computes the @var{rate} such that @code{npv(@var{rate}, @var{payments}) = 0};
- this rate is known as the @dfn{internal rate of return}.
- @kindex I b I
- @tindex irrb
- The @kbd{I b I} [@code{irrb}] command computes the internal rate of
- return assuming payments occur at the beginning of each period.
- @node Depreciation Functions, Definitions of Financial Functions, Related Financial Functions, Financial Functions
- @subsection Depreciation Functions
- @noindent
- The functions in this section calculate @dfn{depreciation}, which is
- the amount of value that a possession loses over time. These functions
- are characterized by three parameters: @var{cost}, the original cost
- of the asset; @var{salvage}, the value the asset will have at the end
- of its expected ``useful life''; and @var{life}, the number of years
- (or other periods) of the expected useful life.
- There are several methods for calculating depreciation that differ in
- the way they spread the depreciation over the lifetime of the asset.
- @kindex b S
- @pindex calc-fin-sln
- @tindex sln
- The @kbd{b S} (@code{calc-fin-sln}) [@code{sln}] command computes the
- ``straight-line'' depreciation. In this method, the asset depreciates
- by the same amount every year (or period). For example,
- @samp{sln(12000, 2000, 5)} returns 2000. The asset costs $12000
- initially and will be worth $2000 after five years; it loses $2000
- per year.
- @kindex b Y
- @pindex calc-fin-syd
- @tindex syd
- The @kbd{b Y} (@code{calc-fin-syd}) [@code{syd}] command computes the
- accelerated ``sum-of-years'-digits'' depreciation. Here the depreciation
- is higher during the early years of the asset's life. Since the
- depreciation is different each year, @kbd{b Y} takes a fourth @var{period}
- parameter which specifies which year is requested, from 1 to @var{life}.
- If @var{period} is outside this range, the @code{syd} function will
- return zero.
- @kindex b D
- @pindex calc-fin-ddb
- @tindex ddb
- The @kbd{b D} (@code{calc-fin-ddb}) [@code{ddb}] command computes an
- accelerated depreciation using the double-declining balance method.
- It also takes a fourth @var{period} parameter.
- For symmetry, the @code{sln} function will accept a @var{period}
- parameter as well, although it will ignore its value except that the
- return value will as usual be zero if @var{period} is out of range.
- For example, pushing the vector @cite{[1,2,3,4,5]} (perhaps with @kbd{v x 5})
- and then mapping @kbd{V M ' [sln(12000,2000,5,$), syd(12000,2000,5,$),
- ddb(12000,2000,5,$)] @key{RET}} produces a matrix that allows us to compare
- the three depreciation methods:
- @example
- @group
- [ [ 2000, 3333, 4800 ]
- [ 2000, 2667, 2880 ]
- [ 2000, 2000, 1728 ]
- [ 2000, 1333, 592 ]
- [ 2000, 667, 0 ] ]
- @end group
- @end example
- @noindent
- (Values have been rounded to nearest integers in this figure.)
- We see that @code{sln} depreciates by the same amount each year,
- @kbd{syd} depreciates more at the beginning and less at the end,
- and @kbd{ddb} weights the depreciation even more toward the beginning.
- Summing columns with @kbd{V R : +} yields @cite{[10000, 10000, 10000]};
- the total depreciation in any method is (by definition) the
- difference between the cost and the salvage value.
- @node Definitions of Financial Functions, , Depreciation Functions, Financial Functions
- @subsection Definitions
- @noindent
- For your reference, here are the actual formulas used to compute
- Calc's financial functions.
- Calc will not evaluate a financial function unless the @var{rate} or
- @var{n} argument is known. However, @var{payment} or @var{amount} can
- be a variable. Calc expands these functions according to the
- formulas below for symbolic arguments only when you use the @kbd{a "}
- (@code{calc-expand-formula}) command, or when taking derivatives or
- integrals or solving equations involving the functions.
- @ifinfo
- These formulas are shown using the conventions of ``Big'' display
- mode (@kbd{d B}); for example, the formula for @code{fv} written
- linearly is @samp{pmt * ((1 + rate)^n) - 1) / rate}.
- @example
- n
- (1 + rate) - 1
- fv(rate, n, pmt) = pmt * ---------------
- rate
- n
- ((1 + rate) - 1) (1 + rate)
- fvb(rate, n, pmt) = pmt * ----------------------------
- rate
- n
- fvl(rate, n, pmt) = pmt * (1 + rate)
- -n
- 1 - (1 + rate)
- pv(rate, n, pmt) = pmt * ----------------
- rate
- -n
- (1 - (1 + rate) ) (1 + rate)
- pvb(rate, n, pmt) = pmt * -----------------------------
- rate
- -n
- pvl(rate, n, pmt) = pmt * (1 + rate)
- -1 -2 -3
- npv(rate, [a, b, c]) = a*(1 + rate) + b*(1 + rate) + c*(1 + rate)
- -1 -2
- npvb(rate, [a, b, c]) = a + b*(1 + rate) + c*(1 + rate)
- -n
- (amt - x * (1 + rate) ) * rate
- pmt(rate, n, amt, x) = -------------------------------
- -n
- 1 - (1 + rate)
- -n
- (amt - x * (1 + rate) ) * rate
- pmtb(rate, n, amt, x) = -------------------------------
- -n
- (1 - (1 + rate) ) (1 + rate)
- amt * rate
- nper(rate, pmt, amt) = - log(1 - ------------, 1 + rate)
- pmt
- amt * rate
- nperb(rate, pmt, amt) = - log(1 - ---------------, 1 + rate)
- pmt * (1 + rate)
- amt
- nperl(rate, pmt, amt) = - log(---, 1 + rate)
- pmt
- 1/n
- pmt
- ratel(n, pmt, amt) = ------ - 1
- 1/n
- amt
- cost - salv
- sln(cost, salv, life) = -----------
- life
- (cost - salv) * (life - per + 1)
- syd(cost, salv, life, per) = --------------------------------
- life * (life + 1) / 2
- book * 2
- ddb(cost, salv, life, per) = --------, book = cost - depreciation so far
- life
- @end example
- @end ifinfo
- @tex
- \turnoffactive
- $$ \code{fv}(r, n, p) = p { (1 + r)^n - 1 \over r } $$
- $$ \code{fvb}(r, n, p) = p { ((1 + r)^n - 1) (1 + r) \over r } $$
- $$ \code{fvl}(r, n, p) = p (1 + r)^n $$
- $$ \code{pv}(r, n, p) = p { 1 - (1 + r)^{-n} \over r } $$
- $$ \code{pvb}(r, n, p) = p { (1 - (1 + r)^{-n}) (1 + r) \over r } $$
- $$ \code{pvl}(r, n, p) = p (1 + r)^{-n} $$
- $$ \code{npv}(r, [a,b,c]) = a (1 + r)^{-1} + b (1 + r)^{-2} + c (1 + r)^{-3} $$
- $$ \code{npvb}(r, [a,b,c]) = a + b (1 + r)^{-1} + c (1 + r)^{-2} $$
- $$ \code{pmt}(r, n, a, x) = { (a - x (1 + r)^{-n}) r \over 1 - (1 + r)^{-n} }$$
- $$ \code{pmtb}(r, n, a, x) = { (a - x (1 + r)^{-n}) r \over
- (1 - (1 + r)^{-n}) (1 + r) } $$
- $$ \code{nper}(r, p, a) = -\code{log}(1 - { a r \over p }, 1 + r) $$
- $$ \code{nperb}(r, p, a) = -\code{log}(1 - { a r \over p (1 + r) }, 1 + r) $$
- $$ \code{nperl}(r, p, a) = -\code{log}({a \over p}, 1 + r) $$
- $$ \code{ratel}(n, p, a) = { p^{1/n} \over a^{1/n} } - 1 $$
- $$ \code{sln}(c, s, l) = { c - s \over l } $$
- $$ \code{syd}(c, s, l, p) = { (c - s) (l - p + 1) \over l (l+1) / 2 } $$
- $$ \code{ddb}(c, s, l, p) = { 2 (c - \hbox{depreciation so far}) \over l } $$
- @end tex
- @noindent
- In @code{pmt} and @code{pmtb}, @cite{x=0} if omitted.
- These functions accept any numeric objects, including error forms,
- intervals, and even (though not very usefully) complex numbers. The
- above formulas specify exactly the behavior of these functions with
- all sorts of inputs.
- Note that if the first argument to the @code{log} in @code{nper} is
- negative, @code{nper} leaves itself in symbolic form rather than
- returning a (financially meaningless) complex number.
- @samp{rate(num, pmt, amt)} solves the equation
- @samp{pv(rate, num, pmt) = amt} for @samp{rate} using @kbd{H a R}
- (@code{calc-find-root}), with the interval @samp{[.01% .. 100%]}
- for an initial guess. The @code{rateb} function is the same except
- that it uses @code{pvb}. Note that @code{ratel} can be solved
- directly; its formula is shown in the above list.
- Similarly, @samp{irr(pmts)} solves the equation @samp{npv(rate, pmts) = 0}
- for @samp{rate}.
- If you give a fourth argument to @code{nper} or @code{nperb}, Calc
- will also use @kbd{H a R} to solve the equation using an initial
- guess interval of @samp{[0 .. 100]}.
- A fourth argument to @code{fv} simply sums the two components
- calculated from the above formulas for @code{fv} and @code{fvl}.
- The same is true of @code{fvb}, @code{pv}, and @code{pvb}.
- The @kbd{ddb} function is computed iteratively; the ``book'' value
- starts out equal to @var{cost}, and decreases according to the above
- formula for the specified number of periods. If the book value
- would decrease below @var{salvage}, it only decreases to @var{salvage}
- and the depreciation is zero for all subsequent periods. The @code{ddb}
- function returns the amount the book value decreased in the specified
- period.
- The Calc financial function names were borrowed mostly from Microsoft
- Excel and Borland's Quattro. The @code{ratel} function corresponds to
- @samp{@@CGR} in Borland's Reflex. The @code{nper} and @code{nperl}
- functions correspond to @samp{@@TERM} and @samp{@@CTERM} in Quattro,
- respectively. Beware that the Calc functions may take their arguments
- in a different order than the corresponding functions in your favorite
- spreadsheet.
- @node Binary Functions, , Financial Functions, Arithmetic
- @section Binary Number Functions
- @noindent
- The commands in this chapter all use two-letter sequences beginning with
- the @kbd{b} prefix.
- @cindex Binary numbers
- The ``binary'' operations actually work regardless of the currently
- displayed radix, although their results make the most sense in a radix
- like 2, 8, or 16 (as obtained by the @kbd{d 2}, @kbd{d 8}, or @w{@kbd{d 6}}
- commands, respectively). You may also wish to enable display of leading
- zeros with @kbd{d z}. @xref{Radix Modes}.
- @cindex Word size for binary operations
- The Calculator maintains a current @dfn{word size} @cite{w}, an
- arbitrary positive or negative integer. For a positive word size, all
- of the binary operations described here operate modulo @cite{2^w}. In
- particular, negative arguments are converted to positive integers modulo
- @cite{2^w} by all binary functions.@refill
- If the word size is negative, binary operations produce 2's complement
- integers from @c{$-2^{-w-1}$}
- @cite{-(2^(-w-1))} to @c{$2^{-w-1}-1$}
- @cite{2^(-w-1)-1} inclusive. Either
- mode accepts inputs in any range; the sign of @cite{w} affects only
- the results produced.
- @kindex b c
- @pindex calc-clip
- @tindex clip
- The @kbd{b c} (@code{calc-clip})
- [@code{clip}] command can be used to clip a number by reducing it modulo
- @cite{2^w}. The commands described in this chapter automatically clip
- their results to the current word size. Note that other operations like
- addition do not use the current word size, since integer addition
- generally is not ``binary.'' (However, @pxref{Simplification Modes},
- @code{calc-bin-simplify-mode}.) For example, with a word size of 8
- bits @kbd{b c} converts a number to the range 0 to 255; with a word
- size of @i{-8} @kbd{b c} converts to the range @i{-128} to 127.@refill
- @kindex b w
- @pindex calc-word-size
- The default word size is 32 bits. All operations except the shifts and
- rotates allow you to specify a different word size for that one
- operation by giving a numeric prefix argument: @kbd{C-u 8 b c} clips the
- top of stack to the range 0 to 255 regardless of the current word size.
- To set the word size permanently, use @kbd{b w} (@code{calc-word-size}).
- This command displays a prompt with the current word size; press @key{RET}
- immediately to keep this word size, or type a new word size at the prompt.
- When the binary operations are written in symbolic form, they take an
- optional second (or third) word-size parameter. When a formula like
- @samp{and(a,b)} is finally evaluated, the word size current at that time
- will be used, but when @samp{and(a,b,-8)} is evaluated, a word size of
- @i{-8} will always be used. A symbolic binary function will be left
- in symbolic form unless the all of its argument(s) are integers or
- integer-valued floats.
- If either or both arguments are modulo forms for which @cite{M} is a
- power of two, that power of two is taken as the word size unless a
- numeric prefix argument overrides it. The current word size is never
- consulted when modulo-power-of-two forms are involved.
- @kindex b a
- @pindex calc-and
- @tindex and
- The @kbd{b a} (@code{calc-and}) [@code{and}] command computes the bitwise
- AND of the two numbers on the top of the stack. In other words, for each
- of the @cite{w} binary digits of the two numbers (pairwise), the corresponding
- bit of the result is 1 if and only if both input bits are 1:
- @samp{and(2#1100, 2#1010) = 2#1000}.
- @kindex b o
- @pindex calc-or
- @tindex or
- The @kbd{b o} (@code{calc-or}) [@code{or}] command computes the bitwise
- inclusive OR of two numbers. A bit is 1 if either of the input bits, or
- both, are 1: @samp{or(2#1100, 2#1010) = 2#1110}.
- @kindex b x
- @pindex calc-xor
- @tindex xor
- The @kbd{b x} (@code{calc-xor}) [@code{xor}] command computes the bitwise
- exclusive OR of two numbers. A bit is 1 if exactly one of the input bits
- is 1: @samp{xor(2#1100, 2#1010) = 2#0110}.
- @kindex b d
- @pindex calc-diff
- @tindex diff
- The @kbd{b d} (@code{calc-diff}) [@code{diff}] command computes the bitwise
- difference of two numbers; this is defined by @samp{diff(a,b) = and(a,not(b))},
- so that @samp{diff(2#1100, 2#1010) = 2#0100}.
- @kindex b n
- @pindex calc-not
- @tindex not
- The @kbd{b n} (@code{calc-not}) [@code{not}] command computes the bitwise
- NOT of a number. A bit is 1 if the input bit is 0 and vice-versa.
- @kindex b l
- @pindex calc-lshift-binary
- @tindex lsh
- The @kbd{b l} (@code{calc-lshift-binary}) [@code{lsh}] command shifts a
- number left by one bit, or by the number of bits specified in the numeric
- prefix argument. A negative prefix argument performs a logical right shift,
- in which zeros are shifted in on the left. In symbolic form, @samp{lsh(a)}
- is short for @samp{lsh(a,1)}, which in turn is short for @samp{lsh(a,n,w)}.
- Bits shifted ``off the end,'' according to the current word size, are lost.
- @kindex H b l
- @kindex H b r
- @ignore
- @mindex @idots
- @end ignore
- @kindex H b L
- @ignore
- @mindex @null
- @end ignore
- @kindex H b R
- @ignore
- @mindex @null
- @end ignore
- @kindex H b t
- The @kbd{H b l} command also does a left shift, but it takes two arguments
- from the stack (the value to shift, and, at top-of-stack, the number of
- bits to shift). This version interprets the prefix argument just like
- the regular binary operations, i.e., as a word size. The Hyperbolic flag
- has a similar effect on the rest of the binary shift and rotate commands.
- @kindex b r
- @pindex calc-rshift-binary
- @tindex rsh
- The @kbd{b r} (@code{calc-rshift-binary}) [@code{rsh}] command shifts a
- number right by one bit, or by the number of bits specified in the numeric
- prefix argument: @samp{rsh(a,n) = lsh(a,-n)}.
- @kindex b L
- @pindex calc-lshift-arith
- @tindex ash
- The @kbd{b L} (@code{calc-lshift-arith}) [@code{ash}] command shifts a
- number left. It is analogous to @code{lsh}, except that if the shift
- is rightward (the prefix argument is negative), an arithmetic shift
- is performed as described below.
- @kindex b R
- @pindex calc-rshift-arith
- @tindex rash
- The @kbd{b R} (@code{calc-rshift-arith}) [@code{rash}] command performs
- an ``arithmetic'' shift to the right, in which the leftmost bit (according
- to the current word size) is duplicated rather than shifting in zeros.
- This corresponds to dividing by a power of two where the input is interpreted
- as a signed, twos-complement number. (The distinction between the @samp{rsh}
- and @samp{rash} operations is totally independent from whether the word
- size is positive or negative.) With a negative prefix argument, this
- performs a standard left shift.
- @kindex b t
- @pindex calc-rotate-binary
- @tindex rot
- The @kbd{b t} (@code{calc-rotate-binary}) [@code{rot}] command rotates a
- number one bit to the left. The leftmost bit (according to the current
- word size) is dropped off the left and shifted in on the right. With a
- numeric prefix argument, the number is rotated that many bits to the left
- or right.
- @xref{Set Operations}, for the @kbd{b p} and @kbd{b u} commands that
- pack and unpack binary integers into sets. (For example, @kbd{b u}
- unpacks the number @samp{2#11001} to the set of bit-numbers
- @samp{[0, 3, 4]}.) Type @kbd{b u V #} to count the number of ``1''
- bits in a binary integer.
- Another interesting use of the set representation of binary integers
- is to reverse the bits in, say, a 32-bit integer. Type @kbd{b u} to
- unpack; type @kbd{31 @key{TAB} -} to replace each bit-number in the set
- with 31 minus that bit-number; type @kbd{b p} to pack the set back
- into a binary integer.
- @node Scientific Functions, Matrix Functions, Arithmetic, Top
- @chapter Scientific Functions
- @noindent
- The functions described here perform trigonometric and other transcendental
- calculations. They generally produce floating-point answers correct to the
- full current precision. The @kbd{H} (Hyperbolic) and @kbd{I} (Inverse)
- flag keys must be used to get some of these functions from the keyboard.
- @kindex P
- @pindex calc-pi
- @cindex @code{pi} variable
- @vindex pi
- @kindex H P
- @cindex @code{e} variable
- @vindex e
- @kindex I P
- @cindex @code{gamma} variable
- @vindex gamma
- @cindex Gamma constant, Euler's
- @cindex Euler's gamma constant
- @kindex H I P
- @cindex @code{phi} variable
- @cindex Phi, golden ratio
- @cindex Golden ratio
- One miscellanous command is shift-@kbd{P} (@code{calc-pi}), which pushes
- the value of @c{$\pi$}
- @cite{pi} (at the current precision) onto the stack. With the
- Hyperbolic flag, it pushes the value @cite{e}, the base of natural logarithms.
- With the Inverse flag, it pushes Euler's constant @c{$\gamma$}
- @cite{gamma} (about 0.5772). With both Inverse and Hyperbolic, it
- pushes the ``golden ratio'' @c{$\phi$}
- @cite{phi} (about 1.618). (At present, Euler's constant is not available
- to unlimited precision; Calc knows only the first 100 digits.)
- In Symbolic mode, these commands push the
- actual variables @samp{pi}, @samp{e}, @samp{gamma}, and @samp{phi},
- respectively, instead of their values; @pxref{Symbolic Mode}.@refill
- @ignore
- @mindex Q
- @end ignore
- @ignore
- @mindex I Q
- @end ignore
- @kindex I Q
- @tindex sqr
- The @kbd{Q} (@code{calc-sqrt}) [@code{sqrt}] function is described elsewhere;
- @pxref{Basic Arithmetic}. With the Inverse flag [@code{sqr}], this command
- computes the square of the argument.
- @xref{Prefix Arguments}, for a discussion of the effect of numeric
- prefix arguments on commands in this chapter which do not otherwise
- interpret a prefix argument.
- @menu
- * Logarithmic Functions::
- * Trigonometric and Hyperbolic Functions::
- * Advanced Math Functions::
- * Branch Cuts::
- * Random Numbers::
- * Combinatorial Functions::
- * Probability Distribution Functions::
- @end menu
- @node Logarithmic Functions, Trigonometric and Hyperbolic Functions, Scientific Functions, Scientific Functions
- @section Logarithmic Functions
- @noindent
- @kindex L
- @pindex calc-ln
- @tindex ln
- @ignore
- @mindex @null
- @end ignore
- @kindex I E
- The shift-@kbd{L} (@code{calc-ln}) [@code{ln}] command computes the natural
- logarithm of the real or complex number on the top of the stack. With
- the Inverse flag it computes the exponential function instead, although
- this is redundant with the @kbd{E} command.
- @kindex E
- @pindex calc-exp
- @tindex exp
- @ignore
- @mindex @null
- @end ignore
- @kindex I L
- The shift-@kbd{E} (@code{calc-exp}) [@code{exp}] command computes the
- exponential, i.e., @cite{e} raised to the power of the number on the stack.
- The meanings of the Inverse and Hyperbolic flags follow from those for
- the @code{calc-ln} command.
- @kindex H L
- @kindex H E
- @pindex calc-log10
- @tindex log10
- @tindex exp10
- @ignore
- @mindex @null
- @end ignore
- @kindex H I L
- @ignore
- @mindex @null
- @end ignore
- @kindex H I E
- The @kbd{H L} (@code{calc-log10}) [@code{log10}] command computes the common
- (base-10) logarithm of a number. (With the Inverse flag [@code{exp10}],
- it raises ten to a given power.) Note that the common logarithm of a
- complex number is computed by taking the natural logarithm and dividing
- by @c{$\ln10$}
- @cite{ln(10)}.
- @kindex B
- @kindex I B
- @pindex calc-log
- @tindex log
- @tindex alog
- The @kbd{B} (@code{calc-log}) [@code{log}] command computes a logarithm
- to any base. For example, @kbd{1024 @key{RET} 2 B} produces 10, since
- @c{$2^{10} = 1024$}
- @cite{2^10 = 1024}. In certain cases like @samp{log(3,9)}, the result
- will be either @cite{1:2} or @cite{0.5} depending on the current Fraction
- Mode setting. With the Inverse flag [@code{alog}], this command is
- similar to @kbd{^} except that the order of the arguments is reversed.
- @kindex f I
- @pindex calc-ilog
- @tindex ilog
- The @kbd{f I} (@code{calc-ilog}) [@code{ilog}] command computes the
- integer logarithm of a number to any base. The number and the base must
- themselves be positive integers. This is the true logarithm, rounded
- down to an integer. Thus @kbd{ilog(x,10)} is 3 for all @cite{x} in the
- range from 1000 to 9999. If both arguments are positive integers, exact
- integer arithmetic is used; otherwise, this is equivalent to
- @samp{floor(log(x,b))}.
- @kindex f E
- @pindex calc-expm1
- @tindex expm1
- The @kbd{f E} (@code{calc-expm1}) [@code{expm1}] command computes
- @c{$e^x - 1$}
- @cite{exp(x)-1}, but using an algorithm that produces a more accurate
- answer when the result is close to zero, i.e., when @c{$e^x$}
- @cite{exp(x)} is close
- to one.
- @kindex f L
- @pindex calc-lnp1
- @tindex lnp1
- The @kbd{f L} (@code{calc-lnp1}) [@code{lnp1}] command computes
- @c{$\ln(x+1)$}
- @cite{ln(x+1)}, producing a more accurate answer when @cite{x} is close
- to zero.
- @node Trigonometric and Hyperbolic Functions, Advanced Math Functions, Logarithmic Functions, Scientific Functions
- @section Trigonometric/Hyperbolic Functions
- @noindent
- @kindex S
- @pindex calc-sin
- @tindex sin
- The shift-@kbd{S} (@code{calc-sin}) [@code{sin}] command computes the sine
- of an angle or complex number. If the input is an HMS form, it is interpreted
- as degrees-minutes-seconds; otherwise, the input is interpreted according
- to the current angular mode. It is best to use Radians mode when operating
- on complex numbers.@refill
- Calc's ``units'' mechanism includes angular units like @code{deg},
- @code{rad}, and @code{grad}. While @samp{sin(45 deg)} is not evaluated
- all the time, the @kbd{u s} (@code{calc-simplify-units}) command will
- simplify @samp{sin(45 deg)} by taking the sine of 45 degrees, regardless
- of the current angular mode. @xref{Basic Operations on Units}.
- Also, the symbolic variable @code{pi} is not ordinarily recognized in
- arguments to trigonometric functions, as in @samp{sin(3 pi / 4)}, but
- the @kbd{a s} (@code{calc-simplify}) command recognizes many such
- formulas when the current angular mode is radians @emph{and} symbolic
- mode is enabled; this example would be replaced by @samp{sqrt(2) / 2}.
- @xref{Symbolic Mode}. Beware, this simplification occurs even if you
- have stored a different value in the variable @samp{pi}; this is one
- reason why changing built-in variables is a bad idea. Arguments of
- the form @cite{x} plus a multiple of @c{$\pi/2$}
- @cite{pi/2} are also simplified.
- Calc includes similar formulas for @code{cos} and @code{tan}.@refill
- The @kbd{a s} command knows all angles which are integer multiples of
- @c{$\pi/12$}
- @cite{pi/12}, @c{$\pi/10$}
- @cite{pi/10}, or @c{$\pi/8$}
- @cite{pi/8} radians. In degrees mode,
- analogous simplifications occur for integer multiples of 15 or 18
- degrees, and for arguments plus multiples of 90 degrees.
- @kindex I S
- @pindex calc-arcsin
- @tindex arcsin
- With the Inverse flag, @code{calc-sin} computes an arcsine. This is also
- available as the @code{calc-arcsin} command or @code{arcsin} algebraic
- function. The returned argument is converted to degrees, radians, or HMS
- notation depending on the current angular mode.
- @kindex H S
- @pindex calc-sinh
- @tindex sinh
- @kindex H I S
- @pindex calc-arcsinh
- @tindex arcsinh
- With the Hyperbolic flag, @code{calc-sin} computes the hyperbolic
- sine, also available as @code{calc-sinh} [@code{sinh}]. With the
- Hyperbolic and Inverse flags, it computes the hyperbolic arcsine
- (@code{calc-arcsinh}) [@code{arcsinh}].
- @kindex C
- @pindex calc-cos
- @tindex cos
- @ignore
- @mindex @idots
- @end ignore
- @kindex I C
- @pindex calc-arccos
- @ignore
- @mindex @null
- @end ignore
- @tindex arccos
- @ignore
- @mindex @null
- @end ignore
- @kindex H C
- @pindex calc-cosh
- @ignore
- @mindex @null
- @end ignore
- @tindex cosh
- @ignore
- @mindex @null
- @end ignore
- @kindex H I C
- @pindex calc-arccosh
- @ignore
- @mindex @null
- @end ignore
- @tindex arccosh
- @ignore
- @mindex @null
- @end ignore
- @kindex T
- @pindex calc-tan
- @ignore
- @mindex @null
- @end ignore
- @tindex tan
- @ignore
- @mindex @null
- @end ignore
- @kindex I T
- @pindex calc-arctan
- @ignore
- @mindex @null
- @end ignore
- @tindex arctan
- @ignore
- @mindex @null
- @end ignore
- @kindex H T
- @pindex calc-tanh
- @ignore
- @mindex @null
- @end ignore
- @tindex tanh
- @ignore
- @mindex @null
- @end ignore
- @kindex H I T
- @pindex calc-arctanh
- @ignore
- @mindex @null
- @end ignore
- @tindex arctanh
- The shift-@kbd{C} (@code{calc-cos}) [@code{cos}] command computes the cosine
- of an angle or complex number, and shift-@kbd{T} (@code{calc-tan}) [@code{tan}]
- computes the tangent, along with all the various inverse and hyperbolic
- variants of these functions.
- @kindex f T
- @pindex calc-arctan2
- @tindex arctan2
- The @kbd{f T} (@code{calc-arctan2}) [@code{arctan2}] command takes two
- numbers from the stack and computes the arc tangent of their ratio. The
- result is in the full range from @i{-180} (exclusive) to @i{+180}
- (inclusive) degrees, or the analogous range in radians. A similar
- result would be obtained with @kbd{/} followed by @kbd{I T}, but the
- value would only be in the range from @i{-90} to @i{+90} degrees
- since the division loses information about the signs of the two
- components, and an error might result from an explicit division by zero
- which @code{arctan2} would avoid. By (arbitrary) definition,
- @samp{arctan2(0,0)=0}.
- @pindex calc-sincos
- @ignore
- @starindex
- @end ignore
- @tindex sincos
- @ignore
- @starindex
- @end ignore
- @ignore
- @mindex arc@idots
- @end ignore
- @tindex arcsincos
- The @code{calc-sincos} [@code{sincos}] command computes the sine and
- cosine of a number, returning them as a vector of the form
- @samp{[@var{cos}, @var{sin}]}.
- With the Inverse flag [@code{arcsincos}], this command takes a two-element
- vector as an argument and computes @code{arctan2} of the elements.
- (This command does not accept the Hyperbolic flag.)@refill
- @node Advanced Math Functions, Branch Cuts, Trigonometric and Hyperbolic Functions, Scientific Functions
- @section Advanced Mathematical Functions
- @noindent
- Calc can compute a variety of less common functions that arise in
- various branches of mathematics. All of the functions described in
- this section allow arbitrary complex arguments and, except as noted,
- will work to arbitrarily large precisions. They can not at present
- handle error forms or intervals as arguments.
- NOTE: These functions are still experimental. In particular, their
- accuracy is not guaranteed in all domains. It is advisable to set the
- current precision comfortably higher than you actually need when
- using these functions. Also, these functions may be impractically
- slow for some values of the arguments.
- @kindex f g
- @pindex calc-gamma
- @tindex gamma
- The @kbd{f g} (@code{calc-gamma}) [@code{gamma}] command computes the Euler
- gamma function. For positive integer arguments, this is related to the
- factorial function: @samp{gamma(n+1) = fact(n)}. For general complex
- arguments the gamma function can be defined by the following definite
- integral: @c{$\Gamma(a) = \int_0^\infty t^{a-1} e^t dt$}
- @cite{gamma(a) = integ(t^(a-1) exp(t), t, 0, inf)}.
- (The actual implementation uses far more efficient computational methods.)
- @kindex f G
- @tindex gammaP
- @ignore
- @mindex @idots
- @end ignore
- @kindex I f G
- @ignore
- @mindex @null
- @end ignore
- @kindex H f G
- @ignore
- @mindex @null
- @end ignore
- @kindex H I f G
- @pindex calc-inc-gamma
- @ignore
- @mindex @null
- @end ignore
- @tindex gammaQ
- @ignore
- @mindex @null
- @end ignore
- @tindex gammag
- @ignore
- @mindex @null
- @end ignore
- @tindex gammaG
- The @kbd{f G} (@code{calc-inc-gamma}) [@code{gammaP}] command computes
- the incomplete gamma function, denoted @samp{P(a,x)}. This is defined by
- the integral, @c{$P(a,x) = \left( \int_0^x t^{a-1} e^t dt \right) / \Gamma(a)$}
- @cite{gammaP(a,x) = integ(t^(a-1) exp(t), t, 0, x) / gamma(a)}.
- This implies that @samp{gammaP(a,inf) = 1} for any @cite{a} (see the
- definition of the normal gamma function).
- Several other varieties of incomplete gamma function are defined.
- The complement of @cite{P(a,x)}, called @cite{Q(a,x) = 1-P(a,x)} by
- some authors, is computed by the @kbd{I f G} [@code{gammaQ}] command.
- You can think of this as taking the other half of the integral, from
- @cite{x} to infinity.
- @ifinfo
- The functions corresponding to the integrals that define @cite{P(a,x)}
- and @cite{Q(a,x)} but without the normalizing @cite{1/gamma(a)}
- factor are called @cite{g(a,x)} and @cite{G(a,x)}, respectively
- (where @cite{g} and @cite{G} represent the lower- and upper-case Greek
- letter gamma). You can obtain these using the @kbd{H f G} [@code{gammag}]
- and @kbd{H I f G} [@code{gammaG}] commands.
- @end ifinfo
- @tex
- \turnoffactive
- The functions corresponding to the integrals that define $P(a,x)$
- and $Q(a,x)$ but without the normalizing $1/\Gamma(a)$
- factor are called $\gamma(a,x)$ and $\Gamma(a,x)$, respectively.
- You can obtain these using the \kbd{H f G} [\code{gammag}] and
- \kbd{I H f G} [\code{gammaG}] commands.
- @end tex
- @kindex f b
- @pindex calc-beta
- @tindex beta
- The @kbd{f b} (@code{calc-beta}) [@code{beta}] command computes the
- Euler beta function, which is defined in terms of the gamma function as
- @c{$B(a,b) = \Gamma(a) \Gamma(b) / \Gamma(a+b)$}
- @cite{beta(a,b) = gamma(a) gamma(b) / gamma(a+b)}, or by
- @c{$B(a,b) = \int_0^1 t^{a-1} (1-t)^{b-1} dt$}
- @cite{beta(a,b) = integ(t^(a-1) (1-t)^(b-1), t, 0, 1)}.
- @kindex f B
- @kindex H f B
- @pindex calc-inc-beta
- @tindex betaI
- @tindex betaB
- The @kbd{f B} (@code{calc-inc-beta}) [@code{betaI}] command computes
- the incomplete beta function @cite{I(x,a,b)}. It is defined by
- @c{$I(x,a,b) = \left( \int_0^x t^{a-1} (1-t)^{b-1} dt \right) / B(a,b)$}
- @cite{betaI(x,a,b) = integ(t^(a-1) (1-t)^(b-1), t, 0, x) / beta(a,b)}.
- Once again, the @kbd{H} (hyperbolic) prefix gives the corresponding
- un-normalized version [@code{betaB}].
- @kindex f e
- @kindex I f e
- @pindex calc-erf
- @tindex erf
- @tindex erfc
- The @kbd{f e} (@code{calc-erf}) [@code{erf}] command computes the
- error function @c{$\hbox{erf}(x) = {2 \over \sqrt{\pi}} \int_0^x e^{-t^2} dt$}
- @cite{erf(x) = 2 integ(exp(-(t^2)), t, 0, x) / sqrt(pi)}.
- The complementary error function @kbd{I f e} (@code{calc-erfc}) [@code{erfc}]
- is the corresponding integral from @samp{x} to infinity; the sum
- @c{$\hbox{erf}(x) + \hbox{erfc}(x) = 1$}
- @cite{erf(x) + erfc(x) = 1}.
- @kindex f j
- @kindex f y
- @pindex calc-bessel-J
- @pindex calc-bessel-Y
- @tindex besJ
- @tindex besY
- The @kbd{f j} (@code{calc-bessel-J}) [@code{besJ}] and @kbd{f y}
- (@code{calc-bessel-Y}) [@code{besY}] commands compute the Bessel
- functions of the first and second kinds, respectively.
- In @samp{besJ(n,x)} and @samp{besY(n,x)} the ``order'' parameter
- @cite{n} is often an integer, but is not required to be one.
- Calc's implementation of the Bessel functions currently limits the
- precision to 8 digits, and may not be exact even to that precision.
- Use with care!@refill
- @node Branch Cuts, Random Numbers, Advanced Math Functions, Scientific Functions
- @section Branch Cuts and Principal Values
- @noindent
- @cindex Branch cuts
- @cindex Principal values
- All of the logarithmic, trigonometric, and other scientific functions are
- defined for complex numbers as well as for reals.
- This section describes the values
- returned in cases where the general result is a family of possible values.
- Calc follows section 12.5.3 of Steele's @dfn{Common Lisp, the Language},
- second edition, in these matters. This section will describe each
- function briefly; for a more detailed discussion (including some nifty
- diagrams), consult Steele's book.
- Note that the branch cuts for @code{arctan} and @code{arctanh} were
- changed between the first and second editions of Steele. Versions of
- Calc starting with 2.00 follow the second edition.
- The new branch cuts exactly match those of the HP-28/48 calculators.
- They also match those of Mathematica 1.2, except that Mathematica's
- @code{arctan} cut is always in the right half of the complex plane,
- and its @code{arctanh} cut is always in the top half of the plane.
- Calc's cuts are continuous with quadrants I and III for @code{arctan},
- or II and IV for @code{arctanh}.
- Note: The current implementations of these functions with complex arguments
- are designed with proper behavior around the branch cuts in mind, @emph{not}
- efficiency or accuracy. You may need to increase the floating precision
- and wait a while to get suitable answers from them.
- For @samp{sqrt(a+bi)}: When @cite{a<0} and @cite{b} is small but positive
- or zero, the result is close to the @cite{+i} axis. For @cite{b} small and
- negative, the result is close to the @cite{-i} axis. The result always lies
- in the right half of the complex plane.
- For @samp{ln(a+bi)}: The real part is defined as @samp{ln(abs(a+bi))}.
- The imaginary part is defined as @samp{arg(a+bi) = arctan2(b,a)}.
- Thus the branch cuts for @code{sqrt} and @code{ln} both lie on the
- negative real axis.
- The following table describes these branch cuts in another way.
- If the real and imaginary parts of @cite{z} are as shown, then
- the real and imaginary parts of @cite{f(z)} will be as shown.
- Here @code{eps} stands for a small positive value; each
- occurrence of @code{eps} may stand for a different small value.
- @smallexample
- z sqrt(z) ln(z)
- ----------------------------------------
- +, 0 +, 0 any, 0
- -, 0 0, + any, pi
- -, +eps +eps, + +eps, +
- -, -eps +eps, - +eps, -
- @end smallexample
- For @samp{z1^z2}: This is defined by @samp{exp(ln(z1)*z2)}.
- One interesting consequence of this is that @samp{(-8)^1:3} does
- not evaluate to @i{-2} as you might expect, but to the complex
- number @cite{(1., 1.732)}. Both of these are valid cube roots
- of @i{-8} (as is @cite{(1., -1.732)}); Calc chooses a perhaps
- less-obvious root for the sake of mathematical consistency.
- For @samp{arcsin(z)}: This is defined by @samp{-i*ln(i*z + sqrt(1-z^2))}.
- The branch cuts are on the real axis, less than @i{-1} and greater than 1.
- For @samp{arccos(z)}: This is defined by @samp{-i*ln(z + i*sqrt(1-z^2))},
- or equivalently by @samp{pi/2 - arcsin(z)}. The branch cuts are on
- the real axis, less than @i{-1} and greater than 1.
- For @samp{arctan(z)}: This is defined by
- @samp{(ln(1+i*z) - ln(1-i*z)) / (2*i)}. The branch cuts are on the
- imaginary axis, below @cite{-i} and above @cite{i}.
- For @samp{arcsinh(z)}: This is defined by @samp{ln(z + sqrt(1+z^2))}.
- The branch cuts are on the imaginary axis, below @cite{-i} and
- above @cite{i}.
- For @samp{arccosh(z)}: This is defined by
- @samp{ln(z + (z+1)*sqrt((z-1)/(z+1)))}. The branch cut is on the
- real axis less than 1.
- For @samp{arctanh(z)}: This is defined by @samp{(ln(1+z) - ln(1-z)) / 2}.
- The branch cuts are on the real axis, less than @i{-1} and greater than 1.
- The following tables for @code{arcsin}, @code{arccos}, and
- @code{arctan} assume the current angular mode is radians. The
- hyperbolic functions operate independently of the angular mode.
- @smallexample
- z arcsin(z) arccos(z)
- -------------------------------------------------------
- (-1..1), 0 (-pi/2..pi/2), 0 (0..pi), 0
- (-1..1), +eps (-pi/2..pi/2), +eps (0..pi), -eps
- (-1..1), -eps (-pi/2..pi/2), -eps (0..pi), +eps
- <-1, 0 -pi/2, + pi, -
- <-1, +eps -pi/2 + eps, + pi - eps, -
- <-1, -eps -pi/2 + eps, - pi - eps, +
- >1, 0 pi/2, - 0, +
- >1, +eps pi/2 - eps, + +eps, -
- >1, -eps pi/2 - eps, - +eps, +
- @end smallexample
- @smallexample
- z arccosh(z) arctanh(z)
- -----------------------------------------------------
- (-1..1), 0 0, (0..pi) any, 0
- (-1..1), +eps +eps, (0..pi) any, +eps
- (-1..1), -eps +eps, (-pi..0) any, -eps
- <-1, 0 +, pi -, pi/2
- <-1, +eps +, pi - eps -, pi/2 - eps
- <-1, -eps +, -pi + eps -, -pi/2 + eps
- >1, 0 +, 0 +, -pi/2
- >1, +eps +, +eps +, pi/2 - eps
- >1, -eps +, -eps +, -pi/2 + eps
- @end smallexample
- @smallexample
- z arcsinh(z) arctan(z)
- -----------------------------------------------------
- 0, (-1..1) 0, (-pi/2..pi/2) 0, any
- 0, <-1 -, -pi/2 -pi/2, -
- +eps, <-1 +, -pi/2 + eps pi/2 - eps, -
- -eps, <-1 -, -pi/2 + eps -pi/2 + eps, -
- 0, >1 +, pi/2 pi/2, +
- +eps, >1 +, pi/2 - eps pi/2 - eps, +
- -eps, >1 -, pi/2 - eps -pi/2 + eps, +
- @end smallexample
- Finally, the following identities help to illustrate the relationship
- between the complex trigonometric and hyperbolic functions. They
- are valid everywhere, including on the branch cuts.
- @smallexample
- sin(i*z) = i*sinh(z) arcsin(i*z) = i*arcsinh(z)
- cos(i*z) = cosh(z) arcsinh(i*z) = i*arcsin(z)
- tan(i*z) = i*tanh(z) arctan(i*z) = i*arctanh(z)
- sinh(i*z) = i*sin(z) cosh(i*z) = cos(z)
- @end smallexample
- The ``advanced math'' functions (gamma, Bessel, etc.@:) are also defined
- for general complex arguments, but their branch cuts and principal values
- are not rigorously specified at present.
- @node Random Numbers, Combinatorial Functions, Branch Cuts, Scientific Functions
- @section Random Numbers
- @noindent
- @kindex k r
- @pindex calc-random
- @tindex random
- The @kbd{k r} (@code{calc-random}) [@code{random}] command produces
- random numbers of various sorts.
- Given a positive numeric prefix argument @cite{M}, it produces a random
- integer @cite{N} in the range @c{$0 \le N < M$}
- @cite{0 <= N < M}. Each of the @cite{M}
- values appears with equal probability.@refill
- With no numeric prefix argument, the @kbd{k r} command takes its argument
- from the stack instead. Once again, if this is a positive integer @cite{M}
- the result is a random integer less than @cite{M}. However, note that
- while numeric prefix arguments are limited to six digits or so, an @cite{M}
- taken from the stack can be arbitrarily large. If @cite{M} is negative,
- the result is a random integer in the range @c{$M < N \le 0$}
- @cite{M < N <= 0}.
- If the value on the stack is a floating-point number @cite{M}, the result
- is a random floating-point number @cite{N} in the range @c{$0 \le N < M$}
- @cite{0 <= N < M}
- or @c{$M < N \le 0$}
- @cite{M < N <= 0}, according to the sign of @cite{M}.
- If @cite{M} is zero, the result is a Gaussian-distributed random real
- number; the distribution has a mean of zero and a standard deviation
- of one. The algorithm used generates random numbers in pairs; thus,
- every other call to this function will be especially fast.
- If @cite{M} is an error form @c{$m$ @code{+/-} $\sigma$}
- @samp{m +/- s} where @var{m}
- and @c{$\sigma$}
- @var{s} are both real numbers, the result uses a Gaussian
- distribution with mean @var{m} and standard deviation @c{$\sigma$}
- @var{s}.
- If @cite{M} is an interval form, the lower and upper bounds specify the
- acceptable limits of the random numbers. If both bounds are integers,
- the result is a random integer in the specified range. If either bound
- is floating-point, the result is a random real number in the specified
- range. If the interval is open at either end, the result will be sure
- not to equal that end value. (This makes a big difference for integer
- intervals, but for floating-point intervals it's relatively minor:
- with a precision of 6, @samp{random([1.0..2.0))} will return any of one
- million numbers from 1.00000 to 1.99999; @samp{random([1.0..2.0])} may
- additionally return 2.00000, but the probability of this happening is
- extremely small.)
- If @cite{M} is a vector, the result is one element taken at random from
- the vector. All elements of the vector are given equal probabilities.
- @vindex RandSeed
- The sequence of numbers produced by @kbd{k r} is completely random by
- default, i.e., the sequence is seeded each time you start Calc using
- the current time and other information. You can get a reproducible
- sequence by storing a particular ``seed value'' in the Calc variable
- @code{RandSeed}. Any integer will do for a seed; integers of from 1
- to 12 digits are good. If you later store a different integer into
- @code{RandSeed}, Calc will switch to a different pseudo-random
- sequence. If you ``unstore'' @code{RandSeed}, Calc will re-seed itself
- from the current time. If you store the same integer that you used
- before back into @code{RandSeed}, you will get the exact same sequence
- of random numbers as before.
- @pindex calc-rrandom
- The @code{calc-rrandom} command (not on any key) produces a random real
- number between zero and one. It is equivalent to @samp{random(1.0)}.
- @kindex k a
- @pindex calc-random-again
- The @kbd{k a} (@code{calc-random-again}) command produces another random
- number, re-using the most recent value of @cite{M}. With a numeric
- prefix argument @var{n}, it produces @var{n} more random numbers using
- that value of @cite{M}.
- @kindex k h
- @pindex calc-shuffle
- @tindex shuffle
- The @kbd{k h} (@code{calc-shuffle}) command produces a vector of several
- random values with no duplicates. The value on the top of the stack
- specifies the set from which the random values are drawn, and may be any
- of the @cite{M} formats described above. The numeric prefix argument
- gives the length of the desired list. (If you do not provide a numeric
- prefix argument, the length of the list is taken from the top of the
- stack, and @cite{M} from second-to-top.)
- If @cite{M} is a floating-point number, zero, or an error form (so
- that the random values are being drawn from the set of real numbers)
- there is little practical difference between using @kbd{k h} and using
- @kbd{k r} several times. But if the set of possible values consists
- of just a few integers, or the elements of a vector, then there is
- a very real chance that multiple @kbd{k r}'s will produce the same
- number more than once. The @kbd{k h} command produces a vector whose
- elements are always distinct. (Actually, there is a slight exception:
- If @cite{M} is a vector, no given vector element will be drawn more
- than once, but if several elements of @cite{M} are equal, they may
- each make it into the result vector.)
- One use of @kbd{k h} is to rearrange a list at random. This happens
- if the prefix argument is equal to the number of values in the list:
- @kbd{[1, 1.5, 2, 2.5, 3] 5 k h} might produce the permuted list
- @samp{[2.5, 1, 1.5, 3, 2]}. As a convenient feature, if the argument
- @var{n} is negative it is replaced by the size of the set represented
- by @cite{M}. Naturally, this is allowed only when @cite{M} specifies
- a small discrete set of possibilities.
- To do the equivalent of @kbd{k h} but with duplications allowed,
- given @cite{M} on the stack and with @var{n} just entered as a numeric
- prefix, use @kbd{v b} to build a vector of copies of @cite{M}, then use
- @kbd{V M k r} to ``map'' the normal @kbd{k r} function over the
- elements of this vector. @xref{Matrix Functions}.
- @menu
- * Random Number Generator:: (Complete description of Calc's algorithm)
- @end menu
- @node Random Number Generator, , Random Numbers, Random Numbers
- @subsection Random Number Generator
- Calc's random number generator uses several methods to ensure that
- the numbers it produces are highly random. Knuth's @emph{Art of
- Computer Programming}, Volume II, contains a thorough description
- of the theory of random number generators and their measurement and
- characterization.
- If @code{RandSeed} has no stored value, Calc calls Emacs' built-in
- @code{random} function to get a stream of random numbers, which it
- then treats in various ways to avoid problems inherent in the simple
- random number generators that many systems use to implement @code{random}.
- When Calc's random number generator is first invoked, it ``seeds''
- the low-level random sequence using the time of day, so that the
- random number sequence will be different every time you use Calc.
- Since Emacs Lisp doesn't specify the range of values that will be
- returned by its @code{random} function, Calc exercises the function
- several times to estimate the range. When Calc subsequently uses
- the @code{random} function, it takes only 10 bits of the result
- near the most-significant end. (It avoids at least the bottom
- four bits, preferably more, and also tries to avoid the top two
- bits.) This strategy works well with the linear congruential
- generators that are typically used to implement @code{random}.
- If @code{RandSeed} contains an integer, Calc uses this integer to
- seed an ``additive congruential'' method (Knuth's algorithm 3.2.2A,
- computing @c{$X_{n-55} - X_{n-24}$}
- @cite{X_n-55 - X_n-24}). This method expands the seed
- value into a large table which is maintained internally; the variable
- @code{RandSeed} is changed from, e.g., 42 to the vector @cite{[42]}
- to indicate that the seed has been absorbed into this table. When
- @code{RandSeed} contains a vector, @kbd{k r} and related commands
- continue to use the same internal table as last time. There is no
- way to extract the complete state of the random number generator
- so that you can restart it from any point; you can only restart it
- from the same initial seed value. A simple way to restart from the
- same seed is to type @kbd{s r RandSeed} to get the seed vector,
- @kbd{v u} to unpack it back into a number, then @kbd{s t RandSeed}
- to reseed the generator with that number.
- Calc uses a ``shuffling'' method as described in algorithm 3.2.2B
- of Knuth. It fills a table with 13 random 10-bit numbers. Then,
- to generate a new random number, it uses the previous number to
- index into the table, picks the value it finds there as the new
- random number, then replaces that table entry with a new value
- obtained from a call to the base random number generator (either
- the additive congruential generator or the @code{random} function
- supplied by the system). If there are any flaws in the base
- generator, shuffling will tend to even them out. But if the system
- provides an excellent @code{random} function, shuffling will not
- damage its randomness.
- To create a random integer of a certain number of digits, Calc
- builds the integer three decimal digits at a time. For each group
- of three digits, Calc calls its 10-bit shuffling random number generator
- (which returns a value from 0 to 1023); if the random value is 1000
- or more, Calc throws it out and tries again until it gets a suitable
- value.
- To create a random floating-point number with precision @var{p}, Calc
- simply creates a random @var{p}-digit integer and multiplies by
- @c{$10^{-p}$}
- @cite{10^-p}. The resulting random numbers should be very clean, but note
- that relatively small numbers will have few significant random digits.
- In other words, with a precision of 12, you will occasionally get
- numbers on the order of @c{$10^{-9}$}
- @cite{10^-9} or @c{$10^{-10}$}
- @cite{10^-10}, but those numbers
- will only have two or three random digits since they correspond to small
- integers times @c{$10^{-12}$}
- @cite{10^-12}.
- To create a random integer in the interval @samp{[0 .. @var{m})}, Calc
- counts the digits in @var{m}, creates a random integer with three
- additional digits, then reduces modulo @var{m}. Unless @var{m} is a
- power of ten the resulting values will be very slightly biased toward
- the lower numbers, but this bias will be less than 0.1%. (For example,
- if @var{m} is 42, Calc will reduce a random integer less than 100000
- modulo 42 to get a result less than 42. It is easy to show that the
- numbers 40 and 41 will be only 2380/2381 as likely to result from this
- modulo operation as numbers 39 and below.) If @var{m} is a power of
- ten, however, the numbers should be completely unbiased.
- The Gaussian random numbers generated by @samp{random(0.0)} use the
- ``polar'' method described in Knuth section 3.4.1C. This method
- generates a pair of Gaussian random numbers at a time, so only every
- other call to @samp{random(0.0)} will require significant calculations.
- @node Combinatorial Functions, Probability Distribution Functions, Random Numbers, Scientific Functions
- @section Combinatorial Functions
- @noindent
- Commands relating to combinatorics and number theory begin with the
- @kbd{k} key prefix.
- @kindex k g
- @pindex calc-gcd
- @tindex gcd
- The @kbd{k g} (@code{calc-gcd}) [@code{gcd}] command computes the
- Greatest Common Divisor of two integers. It also accepts fractions;
- the GCD of two fractions is defined by taking the GCD of the
- numerators, and the LCM of the denominators. This definition is
- consistent with the idea that @samp{a / gcd(a,x)} should yield an
- integer for any @samp{a} and @samp{x}. For other types of arguments,
- the operation is left in symbolic form.@refill
- @kindex k l
- @pindex calc-lcm
- @tindex lcm
- The @kbd{k l} (@code{calc-lcm}) [@code{lcm}] command computes the
- Least Common Multiple of two integers or fractions. The product of
- the LCM and GCD of two numbers is equal to the product of the
- numbers.@refill
- @kindex k E
- @pindex calc-extended-gcd
- @tindex egcd
- The @kbd{k E} (@code{calc-extended-gcd}) [@code{egcd}] command computes
- the GCD of two integers @cite{x} and @cite{y} and returns a vector
- @cite{[g, a, b]} where @c{$g = \gcd(x,y) = a x + b y$}
- @cite{g = gcd(x,y) = a x + b y}.
- @kindex !
- @pindex calc-factorial
- @tindex fact
- @ignore
- @mindex @null
- @end ignore
- @tindex !
- The @kbd{!} (@code{calc-factorial}) [@code{fact}] command computes the
- factorial of the number at the top of the stack. If the number is an
- integer, the result is an exact integer. If the number is an
- integer-valued float, the result is a floating-point approximation. If
- the number is a non-integral real number, the generalized factorial is used,
- as defined by the Euler Gamma function. Please note that computation of
- large factorials can be slow; using floating-point format will help
- since fewer digits must be maintained. The same is true of many of
- the commands in this section.@refill
- @kindex k d
- @pindex calc-double-factorial
- @tindex dfact
- @ignore
- @mindex @null
- @end ignore
- @tindex !!
- The @kbd{k d} (@code{calc-double-factorial}) [@code{dfact}] command
- computes the ``double factorial'' of an integer. For an even integer,
- this is the product of even integers from 2 to @cite{N}. For an odd
- integer, this is the product of odd integers from 3 to @cite{N}. If
- the argument is an integer-valued float, the result is a floating-point
- approximation. This function is undefined for negative even integers.
- The notation @cite{N!!} is also recognized for double factorials.@refill
- @kindex k c
- @pindex calc-choose
- @tindex choose
- The @kbd{k c} (@code{calc-choose}) [@code{choose}] command computes the
- binomial coefficient @cite{N}-choose-@cite{M}, where @cite{M} is the number
- on the top of the stack and @cite{N} is second-to-top. If both arguments
- are integers, the result is an exact integer. Otherwise, the result is a
- floating-point approximation. The binomial coefficient is defined for all
- real numbers by @c{$N! \over M! (N-M)!\,$}
- @cite{N! / M! (N-M)!}.
- @kindex H k c
- @pindex calc-perm
- @tindex perm
- @ifinfo
- The @kbd{H k c} (@code{calc-perm}) [@code{perm}] command computes the
- number-of-permutations function @cite{N! / (N-M)!}.
- @end ifinfo
- @tex
- The \kbd{H k c} (\code{calc-perm}) [\code{perm}] command computes the
- number-of-perm\-utations function $N! \over (N-M)!\,$.
- @end tex
- @kindex k b
- @kindex H k b
- @pindex calc-bernoulli-number
- @tindex bern
- The @kbd{k b} (@code{calc-bernoulli-number}) [@code{bern}] command
- computes a given Bernoulli number. The value at the top of the stack
- is a nonnegative integer @cite{n} that specifies which Bernoulli number
- is desired. The @kbd{H k b} command computes a Bernoulli polynomial,
- taking @cite{n} from the second-to-top position and @cite{x} from the
- top of the stack. If @cite{x} is a variable or formula the result is
- a polynomial in @cite{x}; if @cite{x} is a number the result is a number.
- @kindex k e
- @kindex H k e
- @pindex calc-euler-number
- @tindex euler
- The @kbd{k e} (@code{calc-euler-number}) [@code{euler}] command similarly
- computes an Euler number, and @w{@kbd{H k e}} computes an Euler polynomial.
- Bernoulli and Euler numbers occur in the Taylor expansions of several
- functions.
- @kindex k s
- @kindex H k s
- @pindex calc-stirling-number
- @tindex stir1
- @tindex stir2
- The @kbd{k s} (@code{calc-stirling-number}) [@code{stir1}] command
- computes a Stirling number of the first kind@c{ $n \brack m$}
- @asis{}, given two integers
- @cite{n} and @cite{m} on the stack. The @kbd{H k s} [@code{stir2}]
- command computes a Stirling number of the second kind@c{ $n \brace m$}
- @asis{}. These are
- the number of @cite{m}-cycle permutations of @cite{n} objects, and
- the number of ways to partition @cite{n} objects into @cite{m}
- non-empty sets, respectively.
- @kindex k p
- @pindex calc-prime-test
- @cindex Primes
- The @kbd{k p} (@code{calc-prime-test}) command checks if the integer on
- the top of the stack is prime. For integers less than eight million, the
- answer is always exact and reasonably fast. For larger integers, a
- probabilistic method is used (see Knuth vol. II, section 4.5.4, algorithm P).
- The number is first checked against small prime factors (up to 13). Then,
- any number of iterations of the algorithm are performed. Each step either
- discovers that the number is non-prime, or substantially increases the
- certainty that the number is prime. After a few steps, the chance that
- a number was mistakenly described as prime will be less than one percent.
- (Indeed, this is a worst-case estimate of the probability; in practice
- even a single iteration is quite reliable.) After the @kbd{k p} command,
- the number will be reported as definitely prime or non-prime if possible,
- or otherwise ``probably'' prime with a certain probability of error.
- @ignore
- @starindex
- @end ignore
- @tindex prime
- The normal @kbd{k p} command performs one iteration of the primality
- test. Pressing @kbd{k p} repeatedly for the same integer will perform
- additional iterations. Also, @kbd{k p} with a numeric prefix performs
- the specified number of iterations. There is also an algebraic function
- @samp{prime(n)} or @samp{prime(n,iters)} which returns 1 if @cite{n}
- is (probably) prime and 0 if not.
- @kindex k f
- @pindex calc-prime-factors
- @tindex prfac
- The @kbd{k f} (@code{calc-prime-factors}) [@code{prfac}] command
- attempts to decompose an integer into its prime factors. For numbers up
- to 25 million, the answer is exact although it may take some time. The
- result is a vector of the prime factors in increasing order. For larger
- inputs, prime factors above 5000 may not be found, in which case the
- last number in the vector will be an unfactored integer greater than 25
- million (with a warning message). For negative integers, the first
- element of the list will be @i{-1}. For inputs @i{-1}, @i{0}, and
- @i{1}, the result is a list of the same number.
- @kindex k n
- @pindex calc-next-prime
- @ignore
- @mindex nextpr@idots
- @end ignore
- @tindex nextprime
- The @kbd{k n} (@code{calc-next-prime}) [@code{nextprime}] command finds
- the next prime above a given number. Essentially, it searches by calling
- @code{calc-prime-test} on successive integers until it finds one that
- passes the test. This is quite fast for integers less than eight million,
- but once the probabilistic test comes into play the search may be rather
- slow. Ordinarily this command stops for any prime that passes one iteration
- of the primality test. With a numeric prefix argument, a number must pass
- the specified number of iterations before the search stops. (This only
- matters when searching above eight million.) You can always use additional
- @kbd{k p} commands to increase your certainty that the number is indeed
- prime.
- @kindex I k n
- @pindex calc-prev-prime
- @ignore
- @mindex prevpr@idots
- @end ignore
- @tindex prevprime
- The @kbd{I k n} (@code{calc-prev-prime}) [@code{prevprime}] command
- analogously finds the next prime less than a given number.
- @kindex k t
- @pindex calc-totient
- @tindex totient
- The @kbd{k t} (@code{calc-totient}) [@code{totient}] command computes the
- Euler ``totient'' function@c{ $\phi(n)$}
- @asis{}, the number of integers less than @cite{n} which
- are relatively prime to @cite{n}.
- @kindex k m
- @pindex calc-moebius
- @tindex moebius
- The @kbd{k m} (@code{calc-moebius}) [@code{moebius}] command computes the
- @c{M\"obius $\mu$}
- @asis{Moebius ``mu''} function. If the input number is a product of @cite{k}
- distinct factors, this is @cite{(-1)^k}. If the input number has any
- duplicate factors (i.e., can be divided by the same prime more than once),
- the result is zero.
- @node Probability Distribution Functions, , Combinatorial Functions, Scientific Functions
- @section Probability Distribution Functions
- @noindent
- The functions in this section compute various probability distributions.
- For continuous distributions, this is the integral of the probability
- density function from @cite{x} to infinity. (These are the ``upper
- tail'' distribution functions; there are also corresponding ``lower
- tail'' functions which integrate from minus infinity to @cite{x}.)
- For discrete distributions, the upper tail function gives the sum
- from @cite{x} to infinity; the lower tail function gives the sum
- from minus infinity up to, but not including,@w{ }@cite{x}.
- To integrate from @cite{x} to @cite{y}, just use the distribution
- function twice and subtract. For example, the probability that a
- Gaussian random variable with mean 2 and standard deviation 1 will
- lie in the range from 2.5 to 2.8 is @samp{utpn(2.5,2,1) - utpn(2.8,2,1)}
- (``the probability that it is greater than 2.5, but not greater than 2.8''),
- or equivalently @samp{ltpn(2.8,2,1) - ltpn(2.5,2,1)}.
- @kindex k B
- @kindex I k B
- @pindex calc-utpb
- @tindex utpb
- @tindex ltpb
- The @kbd{k B} (@code{calc-utpb}) [@code{utpb}] function uses the
- binomial distribution. Push the parameters @var{n}, @var{p}, and
- then @var{x} onto the stack; the result (@samp{utpb(x,n,p)}) is the
- probability that an event will occur @var{x} or more times out
- of @var{n} trials, if its probability of occurring in any given
- trial is @var{p}. The @kbd{I k B} [@code{ltpb}] function is
- the probability that the event will occur fewer than @var{x} times.
- The other probability distribution functions similarly take the
- form @kbd{k @var{X}} (@code{calc-utp@var{x}}) [@code{utp@var{x}}]
- and @kbd{I k @var{X}} [@code{ltp@var{x}}], for various letters
- @var{x}. The arguments to the algebraic functions are the value of
- the random variable first, then whatever other parameters define the
- distribution. Note these are among the few Calc functions where the
- order of the arguments in algebraic form differs from the order of
- arguments as found on the stack. (The random variable comes last on
- the stack, so that you can type, e.g., @kbd{2 @key{RET} 1 @key{RET} 2.5
- k N M-@key{RET} @key{DEL} 2.8 k N -}, using @kbd{M-@key{RET} @key{DEL}} to
- recover the original arguments but substitute a new value for @cite{x}.)
- @kindex k C
- @pindex calc-utpc
- @tindex utpc
- @ignore
- @mindex @idots
- @end ignore
- @kindex I k C
- @ignore
- @mindex @null
- @end ignore
- @tindex ltpc
- The @samp{utpc(x,v)} function uses the chi-square distribution with
- @c{$\nu$}
- @cite{v} degrees of freedom. It is the probability that a model is
- correct if its chi-square statistic is @cite{x}.
- @kindex k F
- @pindex calc-utpf
- @tindex utpf
- @ignore
- @mindex @idots
- @end ignore
- @kindex I k F
- @ignore
- @mindex @null
- @end ignore
- @tindex ltpf
- The @samp{utpf(F,v1,v2)} function uses the F distribution, used in
- various statistical tests. The parameters @c{$\nu_1$}
- @cite{v1} and @c{$\nu_2$}
- @cite{v2}
- are the degrees of freedom in the numerator and denominator,
- respectively, used in computing the statistic @cite{F}.
- @kindex k N
- @pindex calc-utpn
- @tindex utpn
- @ignore
- @mindex @idots
- @end ignore
- @kindex I k N
- @ignore
- @mindex @null
- @end ignore
- @tindex ltpn
- The @samp{utpn(x,m,s)} function uses a normal (Gaussian) distribution
- with mean @cite{m} and standard deviation @c{$\sigma$}
- @cite{s}. It is the
- probability that such a normal-distributed random variable would
- exceed @cite{x}.
- @kindex k P
- @pindex calc-utpp
- @tindex utpp
- @ignore
- @mindex @idots
- @end ignore
- @kindex I k P
- @ignore
- @mindex @null
- @end ignore
- @tindex ltpp
- The @samp{utpp(n,x)} function uses a Poisson distribution with
- mean @cite{x}. It is the probability that @cite{n} or more such
- Poisson random events will occur.
- @kindex k T
- @pindex calc-ltpt
- @tindex utpt
- @ignore
- @mindex @idots
- @end ignore
- @kindex I k T
- @ignore
- @mindex @null
- @end ignore
- @tindex ltpt
- The @samp{utpt(t,v)} function uses the Student's ``t'' distribution
- with @c{$\nu$}
- @cite{v} degrees of freedom. It is the probability that a
- t-distributed random variable will be greater than @cite{t}.
- (Note: This computes the distribution function @c{$A(t|\nu)$}
- @cite{A(t|v)}
- where @c{$A(0|\nu) = 1$}
- @cite{A(0|v) = 1} and @c{$A(\infty|\nu) \to 0$}
- @cite{A(inf|v) -> 0}. The
- @code{UTPT} operation on the HP-48 uses a different definition
- which returns half of Calc's value: @samp{UTPT(t,v) = .5*utpt(t,v)}.)
- While Calc does not provide inverses of the probability distribution
- functions, the @kbd{a R} command can be used to solve for the inverse.
- Since the distribution functions are monotonic, @kbd{a R} is guaranteed
- to be able to find a solution given any initial guess.
- @xref{Numerical Solutions}.
- @node Matrix Functions, Algebra, Scientific Functions, Top
- @chapter Vector/Matrix Functions
- @noindent
- Many of the commands described here begin with the @kbd{v} prefix.
- (For convenience, the shift-@kbd{V} prefix is equivalent to @kbd{v}.)
- The commands usually apply to both plain vectors and matrices; some
- apply only to matrices or only to square matrices. If the argument
- has the wrong dimensions the operation is left in symbolic form.
- Vectors are entered and displayed using @samp{[a,b,c]} notation.
- Matrices are vectors of which all elements are vectors of equal length.
- (Though none of the standard Calc commands use this concept, a
- three-dimensional matrix or rank-3 tensor could be defined as a
- vector of matrices, and so on.)
- @menu
- * Packing and Unpacking::
- * Building Vectors::
- * Extracting Elements::
- * Manipulating Vectors::
- * Vector and Matrix Arithmetic::
- * Set Operations::
- * Statistical Operations::
- * Reducing and Mapping::
- * Vector and Matrix Formats::
- @end menu
- @node Packing and Unpacking, Building Vectors, Matrix Functions, Matrix Functions
- @section Packing and Unpacking
- @noindent
- Calc's ``pack'' and ``unpack'' commands collect stack entries to build
- composite objects such as vectors and complex numbers. They are
- described in this chapter because they are most often used to build
- vectors.
- @kindex v p
- @pindex calc-pack
- The @kbd{v p} (@code{calc-pack}) [@code{pack}] command collects several
- elements from the stack into a matrix, complex number, HMS form, error
- form, etc. It uses a numeric prefix argument to specify the kind of
- object to be built; this argument is referred to as the ``packing mode.''
- If the packing mode is a nonnegative integer, a vector of that
- length is created. For example, @kbd{C-u 5 v p} will pop the top
- five stack elements and push back a single vector of those five
- elements. (@kbd{C-u 0 v p} simply creates an empty vector.)
- The same effect can be had by pressing @kbd{[} to push an incomplete
- vector on the stack, using @key{TAB} (@code{calc-roll-down}) to sneak
- the incomplete object up past a certain number of elements, and
- then pressing @kbd{]} to complete the vector.
- Negative packing modes create other kinds of composite objects:
- @table @cite
- @item -1
- Two values are collected to build a complex number. For example,
- @kbd{5 @key{RET} 7 C-u -1 v p} creates the complex number
- @cite{(5, 7)}. The result is always a rectangular complex
- number. The two input values must both be real numbers,
- i.e., integers, fractions, or floats. If they are not, Calc
- will instead build a formula like @samp{a + (0, 1) b}. (The
- other packing modes also create a symbolic answer if the
- components are not suitable.)
- @item -2
- Two values are collected to build a polar complex number.
- The first is the magnitude; the second is the phase expressed
- in either degrees or radians according to the current angular
- mode.
- @item -3
- Three values are collected into an HMS form. The first
- two values (hours and minutes) must be integers or
- integer-valued floats. The third value may be any real
- number.
- @item -4
- Two values are collected into an error form. The inputs
- may be real numbers or formulas.
- @item -5
- Two values are collected into a modulo form. The inputs
- must be real numbers.
- @item -6
- Two values are collected into the interval @samp{[a .. b]}.
- The inputs may be real numbers, HMS or date forms, or formulas.
- @item -7
- Two values are collected into the interval @samp{[a .. b)}.
- @item -8
- Two values are collected into the interval @samp{(a .. b]}.
- @item -9
- Two values are collected into the interval @samp{(a .. b)}.
- @item -10
- Two integer values are collected into a fraction.
- @item -11
- Two values are collected into a floating-point number.
- The first is the mantissa; the second, which must be an
- integer, is the exponent. The result is the mantissa
- times ten to the power of the exponent.
- @item -12
- This is treated the same as @i{-11} by the @kbd{v p} command.
- When unpacking, @i{-12} specifies that a floating-point mantissa
- is desired.
- @item -13
- A real number is converted into a date form.
- @item -14
- Three numbers (year, month, day) are packed into a pure date form.
- @item -15
- Six numbers are packed into a date/time form.
- @end table
- With any of the two-input negative packing modes, either or both
- of the inputs may be vectors. If both are vectors of the same
- length, the result is another vector made by packing corresponding
- elements of the input vectors. If one input is a vector and the
- other is a plain number, the number is packed along with each vector
- element to produce a new vector. For example, @kbd{C-u -4 v p}
- could be used to convert a vector of numbers and a vector of errors
- into a single vector of error forms; @kbd{C-u -5 v p} could convert
- a vector of numbers and a single number @var{M} into a vector of
- numbers modulo @var{M}.
- If you don't give a prefix argument to @kbd{v p}, it takes
- the packing mode from the top of the stack. The elements to
- be packed then begin at stack level 2. Thus
- @kbd{1 @key{RET} 2 @key{RET} 4 n v p} is another way to
- enter the error form @samp{1 +/- 2}.
- If the packing mode taken from the stack is a vector, the result is a
- matrix with the dimensions specified by the elements of the vector,
- which must each be integers. For example, if the packing mode is
- @samp{[2, 3]}, then six numbers will be taken from the stack and
- returned in the form @samp{[@w{[a, b, c]}, [d, e, f]]}.
- If any elements of the vector are negative, other kinds of
- packing are done at that level as described above. For
- example, @samp{[2, 3, -4]} takes 12 objects and creates a
- @c{$2\times3$}
- @asis{2x3} matrix of error forms: @samp{[[a +/- b, c +/- d ... ]]}.
- Also, @samp{[-4, -10]} will convert four integers into an
- error form consisting of two fractions: @samp{a:b +/- c:d}.
- @ignore
- @starindex
- @end ignore
- @tindex pack
- There is an equivalent algebraic function,
- @samp{pack(@var{mode}, @var{items})} where @var{mode} is a
- packing mode (an integer or a vector of integers) and @var{items}
- is a vector of objects to be packed (re-packed, really) according
- to that mode. For example, @samp{pack([3, -4], [a,b,c,d,e,f])}
- yields @samp{[a +/- b, @w{c +/- d}, e +/- f]}. The function is
- left in symbolic form if the packing mode is illegal, or if the
- number of data items does not match the number of items required
- by the mode.
- @kindex v u
- @pindex calc-unpack
- The @kbd{v u} (@code{calc-unpack}) command takes the vector, complex
- number, HMS form, or other composite object on the top of the stack and
- ``unpacks'' it, pushing each of its elements onto the stack as separate
- objects. Thus, it is the ``inverse'' of @kbd{v p}. If the value
- at the top of the stack is a formula, @kbd{v u} unpacks it by pushing
- each of the arguments of the top-level operator onto the stack.
- You can optionally give a numeric prefix argument to @kbd{v u}
- to specify an explicit (un)packing mode. If the packing mode is
- negative and the input is actually a vector or matrix, the result
- will be two or more similar vectors or matrices of the elements.
- For example, given the vector @samp{[@w{a +/- b}, c^2, d +/- 7]},
- the result of @kbd{C-u -4 v u} will be the two vectors
- @samp{[a, c^2, d]} and @w{@samp{[b, 0, 7]}}.
- Note that the prefix argument can have an effect even when the input is
- not a vector. For example, if the input is the number @i{-5}, then
- @kbd{c-u -1 v u} yields @i{-5} and 0 (the components of @i{-5}
- when viewed as a rectangular complex number); @kbd{C-u -2 v u} yields 5
- and 180 (assuming degrees mode); and @kbd{C-u -10 v u} yields @i{-5}
- and 1 (the numerator and denominator of @i{-5}, viewed as a rational
- number). Plain @kbd{v u} with this input would complain that the input
- is not a composite object.
- Unpacking mode @i{-11} converts a float into an integer mantissa and
- an integer exponent, where the mantissa is not divisible by 10
- (except that 0.0 is represented by a mantissa and exponent of 0).
- Unpacking mode @i{-12} converts a float into a floating-point mantissa
- and integer exponent, where the mantissa (for non-zero numbers)
- is guaranteed to lie in the range [1 .. 10). In both cases,
- the mantissa is shifted left or right (and the exponent adjusted
- to compensate) in order to satisfy these constraints.
- Positive unpacking modes are treated differently than for @kbd{v p}.
- A mode of 1 is much like plain @kbd{v u} with no prefix argument,
- except that in addition to the components of the input object,
- a suitable packing mode to re-pack the object is also pushed.
- Thus, @kbd{C-u 1 v u} followed by @kbd{v p} will re-build the
- original object.
- A mode of 2 unpacks two levels of the object; the resulting
- re-packing mode will be a vector of length 2. This might be used
- to unpack a matrix, say, or a vector of error forms. Higher
- unpacking modes unpack the input even more deeply.
- @ignore
- @starindex
- @end ignore
- @tindex unpack
- There are two algebraic functions analogous to @kbd{v u}.
- The @samp{unpack(@var{mode}, @var{item})} function unpacks the
- @var{item} using the given @var{mode}, returning the result as
- a vector of components. Here the @var{mode} must be an
- integer, not a vector. For example, @samp{unpack(-4, a +/- b)}
- returns @samp{[a, b]}, as does @samp{unpack(1, a +/- b)}.
- @ignore
- @starindex
- @end ignore
- @tindex unpackt
- The @code{unpackt} function is like @code{unpack} but instead
- of returning a simple vector of items, it returns a vector of
- two things: The mode, and the vector of items. For example,
- @samp{unpackt(1, 2:3 +/- 1:4)} returns @samp{[-4, [2:3, 1:4]]},
- and @samp{unpackt(2, 2:3 +/- 1:4)} returns @samp{[[-4, -10], [2, 3, 1, 4]]}.
- The identity for re-building the original object is
- @samp{apply(pack, unpackt(@var{n}, @var{x})) = @var{x}}. (The
- @code{apply} function builds a function call given the function
- name and a vector of arguments.)
- @cindex Numerator of a fraction, extracting
- Subscript notation is a useful way to extract a particular part
- of an object. For example, to get the numerator of a rational
- number, you can use @samp{unpack(-10, @var{x})_1}.
- @node Building Vectors, Extracting Elements, Packing and Unpacking, Matrix Functions
- @section Building Vectors
- @noindent
- Vectors and matrices can be added,
- subtracted, multiplied, and divided; @pxref{Basic Arithmetic}.@refill
- @kindex |
- @pindex calc-concat
- @ignore
- @mindex @null
- @end ignore
- @tindex |
- The @kbd{|} (@code{calc-concat}) command ``concatenates'' two vectors
- into one. For example, after @kbd{@w{[ 1 , 2 ]} [ 3 , 4 ] |}, the stack
- will contain the single vector @samp{[1, 2, 3, 4]}. If the arguments
- are matrices, the rows of the first matrix are concatenated with the
- rows of the second. (In other words, two matrices are just two vectors
- of row-vectors as far as @kbd{|} is concerned.)
- If either argument to @kbd{|} is a scalar (a non-vector), it is treated
- like a one-element vector for purposes of concatenation: @kbd{1 [ 2 , 3 ] |}
- produces the vector @samp{[1, 2, 3]}. Likewise, if one argument is a
- matrix and the other is a plain vector, the vector is treated as a
- one-row matrix.
- @kindex H |
- @tindex append
- The @kbd{H |} (@code{calc-append}) [@code{append}] command concatenates
- two vectors without any special cases. Both inputs must be vectors.
- Whether or not they are matrices is not taken into account. If either
- argument is a scalar, the @code{append} function is left in symbolic form.
- See also @code{cons} and @code{rcons} below.
- @kindex I |
- @kindex H I |
- The @kbd{I |} and @kbd{H I |} commands are similar, but they use their
- two stack arguments in the opposite order. Thus @kbd{I |} is equivalent
- to @kbd{@key{TAB} |}, but possibly more convenient and also a bit faster.
- @kindex v d
- @pindex calc-diag
- @tindex diag
- The @kbd{v d} (@code{calc-diag}) [@code{diag}] function builds a diagonal
- square matrix. The optional numeric prefix gives the number of rows
- and columns in the matrix. If the value at the top of the stack is a
- vector, the elements of the vector are used as the diagonal elements; the
- prefix, if specified, must match the size of the vector. If the value on
- the stack is a scalar, it is used for each element on the diagonal, and
- the prefix argument is required.
- To build a constant square matrix, e.g., a @c{$3\times3$}
- @asis{3x3} matrix filled with ones,
- use @kbd{0 M-3 v d 1 +}, i.e., build a zero matrix first and then add a
- constant value to that matrix. (Another alternative would be to use
- @kbd{v b} and @kbd{v a}; see below.)
- @kindex v i
- @pindex calc-ident
- @tindex idn
- The @kbd{v i} (@code{calc-ident}) [@code{idn}] function builds an identity
- matrix of the specified size. It is a convenient form of @kbd{v d}
- where the diagonal element is always one. If no prefix argument is given,
- this command prompts for one.
- In algebraic notation, @samp{idn(a,n)} acts much like @samp{diag(a,n)},
- except that @cite{a} is required to be a scalar (non-vector) quantity.
- If @cite{n} is omitted, @samp{idn(a)} represents @cite{a} times an
- identity matrix of unknown size. Calc can operate algebraically on
- such generic identity matrices, and if one is combined with a matrix
- whose size is known, it is converted automatically to an identity
- matrix of a suitable matching size. The @kbd{v i} command with an
- argument of zero creates a generic identity matrix, @samp{idn(1)}.
- Note that in dimensioned matrix mode (@pxref{Matrix Mode}), generic
- identity matrices are immediately expanded to the current default
- dimensions.
- @kindex v x
- @pindex calc-index
- @tindex index
- The @kbd{v x} (@code{calc-index}) [@code{index}] function builds a vector
- of consecutive integers from 1 to @var{n}, where @var{n} is the numeric
- prefix argument. If you do not provide a prefix argument, you will be
- prompted to enter a suitable number. If @var{n} is negative, the result
- is a vector of negative integers from @var{n} to @i{-1}.
- With a prefix argument of just @kbd{C-u}, the @kbd{v x} command takes
- three values from the stack: @var{n}, @var{start}, and @var{incr} (with
- @var{incr} at top-of-stack). Counting starts at @var{start} and increases
- by @var{incr} for successive vector elements. If @var{start} or @var{n}
- is in floating-point format, the resulting vector elements will also be
- floats. Note that @var{start} and @var{incr} may in fact be any kind
- of numbers or formulas.
- When @var{start} and @var{incr} are specified, a negative @var{n} has a
- different interpretation: It causes a geometric instead of arithmetic
- sequence to be generated. For example, @samp{index(-3, a, b)} produces
- @samp{[a, a b, a b^2]}. If you omit @var{incr} in the algebraic form,
- @samp{index(@var{n}, @var{start})}, the default value for @var{incr}
- is one for positive @var{n} or two for negative @var{n}.
- @kindex v b
- @pindex calc-build-vector
- @tindex cvec
- The @kbd{v b} (@code{calc-build-vector}) [@code{cvec}] function builds a
- vector of @var{n} copies of the value on the top of the stack, where @var{n}
- is the numeric prefix argument. In algebraic formulas, @samp{cvec(x,n,m)}
- can also be used to build an @var{n}-by-@var{m} matrix of copies of @var{x}.
- (Interactively, just use @kbd{v b} twice: once to build a row, then again
- to build a matrix of copies of that row.)
- @kindex v h
- @kindex I v h
- @pindex calc-head
- @pindex calc-tail
- @tindex head
- @tindex tail
- The @kbd{v h} (@code{calc-head}) [@code{head}] function returns the first
- element of a vector. The @kbd{I v h} (@code{calc-tail}) [@code{tail}]
- function returns the vector with its first element removed. In both
- cases, the argument must be a non-empty vector.
- @kindex v k
- @pindex calc-cons
- @tindex cons
- The @kbd{v k} (@code{calc-cons}) [@code{cons}] function takes a value @var{h}
- and a vector @var{t} from the stack, and produces the vector whose head is
- @var{h} and whose tail is @var{t}. This is similar to @kbd{|}, except
- if @var{h} is itself a vector, @kbd{|} will concatenate the two vectors
- whereas @code{cons} will insert @var{h} at the front of the vector @var{t}.
- @kindex H v h
- @tindex rhead
- @ignore
- @mindex @idots
- @end ignore
- @kindex H I v h
- @ignore
- @mindex @null
- @end ignore
- @kindex H v k
- @ignore
- @mindex @null
- @end ignore
- @tindex rtail
- @ignore
- @mindex @null
- @end ignore
- @tindex rcons
- Each of these three functions also accepts the Hyperbolic flag [@code{rhead},
- @code{rtail}, @code{rcons}] in which case @var{t} instead represents
- the @emph{last} single element of the vector, with @var{h}
- representing the remainder of the vector. Thus the vector
- @samp{[a, b, c, d] = cons(a, [b, c, d]) = rcons([a, b, c], d)}.
- Also, @samp{head([a, b, c, d]) = a}, @samp{tail([a, b, c, d]) = [b, c, d]},
- @samp{rhead([a, b, c, d]) = [a, b, c]}, and @samp{rtail([a, b, c, d]) = d}.
- @node Extracting Elements, Manipulating Vectors, Building Vectors, Matrix Functions
- @section Extracting Vector Elements
- @noindent
- @kindex v r
- @pindex calc-mrow
- @tindex mrow
- The @kbd{v r} (@code{calc-mrow}) [@code{mrow}] command extracts one row of
- the matrix on the top of the stack, or one element of the plain vector on
- the top of the stack. The row or element is specified by the numeric
- prefix argument; the default is to prompt for the row or element number.
- The matrix or vector is replaced by the specified row or element in the
- form of a vector or scalar, respectively.
- @cindex Permutations, applying
- With a prefix argument of @kbd{C-u} only, @kbd{v r} takes the index of
- the element or row from the top of the stack, and the vector or matrix
- from the second-to-top position. If the index is itself a vector of
- integers, the result is a vector of the corresponding elements of the
- input vector, or a matrix of the corresponding rows of the input matrix.
- This command can be used to obtain any permutation of a vector.
- With @kbd{C-u}, if the index is an interval form with integer components,
- it is interpreted as a range of indices and the corresponding subvector or
- submatrix is returned.
- @cindex Subscript notation
- @kindex a _
- @pindex calc-subscript
- @tindex subscr
- @tindex _
- Subscript notation in algebraic formulas (@samp{a_b}) stands for the
- Calc function @code{subscr}, which is synonymous with @code{mrow}.
- Thus, @samp{[x, y, z]_k} produces @cite{x}, @cite{y}, or @cite{z} if
- @cite{k} is one, two, or three, respectively. A double subscript
- (@samp{M_i_j}, equivalent to @samp{subscr(subscr(M, i), j)}) will
- access the element at row @cite{i}, column @cite{j} of a matrix.
- The @kbd{a _} (@code{calc-subscript}) command creates a subscript
- formula @samp{a_b} out of two stack entries. (It is on the @kbd{a}
- ``algebra'' prefix because subscripted variables are often used
- purely as an algebraic notation.)
- @tindex mrrow
- Given a negative prefix argument, @kbd{v r} instead deletes one row or
- element from the matrix or vector on the top of the stack. Thus
- @kbd{C-u 2 v r} replaces a matrix with its second row, but @kbd{C-u -2 v r}
- replaces the matrix with the same matrix with its second row removed.
- In algebraic form this function is called @code{mrrow}.
- @tindex getdiag
- Given a prefix argument of zero, @kbd{v r} extracts the diagonal elements
- of a square matrix in the form of a vector. In algebraic form this
- function is called @code{getdiag}.
- @kindex v c
- @pindex calc-mcol
- @tindex mcol
- @tindex mrcol
- The @kbd{v c} (@code{calc-mcol}) [@code{mcol} or @code{mrcol}] command is
- the analogous operation on columns of a matrix. Given a plain vector
- it extracts (or removes) one element, just like @kbd{v r}. If the
- index in @kbd{C-u v c} is an interval or vector and the argument is a
- matrix, the result is a submatrix with only the specified columns
- retained (and possibly permuted in the case of a vector index).@refill
- To extract a matrix element at a given row and column, use @kbd{v r} to
- extract the row as a vector, then @kbd{v c} to extract the column element
- from that vector. In algebraic formulas, it is often more convenient to
- use subscript notation: @samp{m_i_j} gives row @cite{i}, column @cite{j}
- of matrix @cite{m}.
- @kindex v s
- @pindex calc-subvector
- @tindex subvec
- The @kbd{v s} (@code{calc-subvector}) [@code{subvec}] command extracts
- a subvector of a vector. The arguments are the vector, the starting
- index, and the ending index, with the ending index in the top-of-stack
- position. The starting index indicates the first element of the vector
- to take. The ending index indicates the first element @emph{past} the
- range to be taken. Thus, @samp{subvec([a, b, c, d, e], 2, 4)} produces
- the subvector @samp{[b, c]}. You could get the same result using
- @samp{mrow([a, b, c, d, e], @w{[2 .. 4)})}.
- If either the start or the end index is zero or negative, it is
- interpreted as relative to the end of the vector. Thus
- @samp{subvec([a, b, c, d, e], 2, -2)} also produces @samp{[b, c]}. In
- the algebraic form, the end index can be omitted in which case it
- is taken as zero, i.e., elements from the starting element to the
- end of the vector are used. The infinity symbol, @code{inf}, also
- has this effect when used as the ending index.
- @kindex I v s
- @tindex rsubvec
- With the Inverse flag, @kbd{I v s} [@code{rsubvec}] removes a subvector
- from a vector. The arguments are interpreted the same as for the
- normal @kbd{v s} command. Thus, @samp{rsubvec([a, b, c, d, e], 2, 4)}
- produces @samp{[a, d, e]}. It is always true that @code{subvec} and
- @code{rsubvec} return complementary parts of the input vector.
- @xref{Selecting Subformulas}, for an alternative way to operate on
- vectors one element at a time.
- @node Manipulating Vectors, Vector and Matrix Arithmetic, Extracting Elements, Matrix Functions
- @section Manipulating Vectors
- @noindent
- @kindex v l
- @pindex calc-vlength
- @tindex vlen
- The @kbd{v l} (@code{calc-vlength}) [@code{vlen}] command computes the
- length of a vector. The length of a non-vector is considered to be zero.
- Note that matrices are just vectors of vectors for the purposes of this
- command.@refill
- @kindex H v l
- @tindex mdims
- With the Hyperbolic flag, @kbd{H v l} [@code{mdims}] computes a vector
- of the dimensions of a vector, matrix, or higher-order object. For
- example, @samp{mdims([[a,b,c],[d,e,f]])} returns @samp{[2, 3]} since
- its argument is a @c{$2\times3$}
- @asis{2x3} matrix.
- @kindex v f
- @pindex calc-vector-find
- @tindex find
- The @kbd{v f} (@code{calc-vector-find}) [@code{find}] command searches
- along a vector for the first element equal to a given target. The target
- is on the top of the stack; the vector is in the second-to-top position.
- If a match is found, the result is the index of the matching element.
- Otherwise, the result is zero. The numeric prefix argument, if given,
- allows you to select any starting index for the search.
- @kindex v a
- @pindex calc-arrange-vector
- @tindex arrange
- @cindex Arranging a matrix
- @cindex Reshaping a matrix
- @cindex Flattening a matrix
- The @kbd{v a} (@code{calc-arrange-vector}) [@code{arrange}] command
- rearranges a vector to have a certain number of columns and rows. The
- numeric prefix argument specifies the number of columns; if you do not
- provide an argument, you will be prompted for the number of columns.
- The vector or matrix on the top of the stack is @dfn{flattened} into a
- plain vector. If the number of columns is nonzero, this vector is
- then formed into a matrix by taking successive groups of @var{n} elements.
- If the number of columns does not evenly divide the number of elements
- in the vector, the last row will be short and the result will not be
- suitable for use as a matrix. For example, with the matrix
- @samp{[[1, 2], @w{[3, 4]}]} on the stack, @kbd{v a 4} produces
- @samp{[[1, 2, 3, 4]]} (a @c{$1\times4$}
- @asis{1x4} matrix), @kbd{v a 1} produces
- @samp{[[1], [2], [3], [4]]} (a @c{$4\times1$}
- @asis{4x1} matrix), @kbd{v a 2} produces
- @samp{[[1, 2], [3, 4]]} (the original @c{$2\times2$}
- @asis{2x2} matrix), @w{@kbd{v a 3}} produces
- @samp{[[1, 2, 3], [4]]} (not a matrix), and @kbd{v a 0} produces
- the flattened list @samp{[1, 2, @w{3, 4}]}.
- @cindex Sorting data
- @kindex V S
- @kindex I V S
- @pindex calc-sort
- @tindex sort
- @tindex rsort
- The @kbd{V S} (@code{calc-sort}) [@code{sort}] command sorts the elements of
- a vector into increasing order. Real numbers, real infinities, and
- constant interval forms come first in this ordering; next come other
- kinds of numbers, then variables (in alphabetical order), then finally
- come formulas and other kinds of objects; these are sorted according
- to a kind of lexicographic ordering with the useful property that
- one vector is less or greater than another if the first corresponding
- unequal elements are less or greater, respectively. Since quoted strings
- are stored by Calc internally as vectors of ASCII character codes
- (@pxref{Strings}), this means vectors of strings are also sorted into
- alphabetical order by this command.
- The @kbd{I V S} [@code{rsort}] command sorts a vector into decreasing order.
- @cindex Permutation, inverse of
- @cindex Inverse of permutation
- @cindex Index tables
- @cindex Rank tables
- @kindex V G
- @kindex I V G
- @pindex calc-grade
- @tindex grade
- @tindex rgrade
- The @kbd{V G} (@code{calc-grade}) [@code{grade}, @code{rgrade}] command
- produces an index table or permutation vector which, if applied to the
- input vector (as the index of @kbd{C-u v r}, say), would sort the vector.
- A permutation vector is just a vector of integers from 1 to @var{n}, where
- each integer occurs exactly once. One application of this is to sort a
- matrix of data rows using one column as the sort key; extract that column,
- grade it with @kbd{V G}, then use the result to reorder the original matrix
- with @kbd{C-u v r}. Another interesting property of the @code{V G} command
- is that, if the input is itself a permutation vector, the result will
- be the inverse of the permutation. The inverse of an index table is
- a rank table, whose @var{k}th element says where the @var{k}th original
- vector element will rest when the vector is sorted. To get a rank
- table, just use @kbd{V G V G}.
- With the Inverse flag, @kbd{I V G} produces an index table that would
- sort the input into decreasing order. Note that @kbd{V S} and @kbd{V G}
- use a ``stable'' sorting algorithm, i.e., any two elements which are equal
- will not be moved out of their original order. Generally there is no way
- to tell with @kbd{V S}, since two elements which are equal look the same,
- but with @kbd{V G} this can be an important issue. In the matrix-of-rows
- example, suppose you have names and telephone numbers as two columns and
- you wish to sort by phone number primarily, and by name when the numbers
- are equal. You can sort the data matrix by names first, and then again
- by phone numbers. Because the sort is stable, any two rows with equal
- phone numbers will remain sorted by name even after the second sort.
- @cindex Histograms
- @kindex V H
- @pindex calc-histogram
- @ignore
- @mindex histo@idots
- @end ignore
- @tindex histogram
- The @kbd{V H} (@code{calc-histogram}) [@code{histogram}] command builds a
- histogram of a vector of numbers. Vector elements are assumed to be
- integers or real numbers in the range [0..@var{n}) for some ``number of
- bins'' @var{n}, which is the numeric prefix argument given to the
- command. The result is a vector of @var{n} counts of how many times
- each value appeared in the original vector. Non-integers in the input
- are rounded down to integers. Any vector elements outside the specified
- range are ignored. (You can tell if elements have been ignored by noting
- that the counts in the result vector don't add up to the length of the
- input vector.)
- @kindex H V H
- With the Hyperbolic flag, @kbd{H V H} pulls two vectors from the stack.
- The second-to-top vector is the list of numbers as before. The top
- vector is an equal-sized list of ``weights'' to attach to the elements
- of the data vector. For example, if the first data element is 4.2 and
- the first weight is 10, then 10 will be added to bin 4 of the result
- vector. Without the hyperbolic flag, every element has a weight of one.
- @kindex v t
- @pindex calc-transpose
- @tindex trn
- The @kbd{v t} (@code{calc-transpose}) [@code{trn}] command computes
- the transpose of the matrix at the top of the stack. If the argument
- is a plain vector, it is treated as a row vector and transposed into
- a one-column matrix.
- @kindex v v
- @pindex calc-reverse-vector
- @tindex rev
- The @kbd{v v} (@code{calc-reverse-vector}) [@code{vec}] command reverses
- a vector end-for-end. Given a matrix, it reverses the order of the rows.
- (To reverse the columns instead, just use @kbd{v t v v v t}. The same
- principle can be used to apply other vector commands to the columns of
- a matrix.)
- @kindex v m
- @pindex calc-mask-vector
- @tindex vmask
- The @kbd{v m} (@code{calc-mask-vector}) [@code{vmask}] command uses
- one vector as a mask to extract elements of another vector. The mask
- is in the second-to-top position; the target vector is on the top of
- the stack. These vectors must have the same length. The result is
- the same as the target vector, but with all elements which correspond
- to zeros in the mask vector deleted. Thus, for example,
- @samp{vmask([1, 0, 1, 0, 1], [a, b, c, d, e])} produces @samp{[a, c, e]}.
- @xref{Logical Operations}.
- @kindex v e
- @pindex calc-expand-vector
- @tindex vexp
- The @kbd{v e} (@code{calc-expand-vector}) [@code{vexp}] command
- expands a vector according to another mask vector. The result is a
- vector the same length as the mask, but with nonzero elements replaced
- by successive elements from the target vector. The length of the target
- vector is normally the number of nonzero elements in the mask. If the
- target vector is longer, its last few elements are lost. If the target
- vector is shorter, the last few nonzero mask elements are left
- unreplaced in the result. Thus @samp{vexp([2, 0, 3, 0, 7], [a, b])}
- produces @samp{[a, 0, b, 0, 7]}.
- @kindex H v e
- With the Hyperbolic flag, @kbd{H v e} takes a filler value from the
- top of the stack; the mask and target vectors come from the third and
- second elements of the stack. This filler is used where the mask is
- zero: @samp{vexp([2, 0, 3, 0, 7], [a, b], z)} produces
- @samp{[a, z, c, z, 7]}. If the filler value is itself a vector,
- then successive values are taken from it, so that the effect is to
- interleave two vectors according to the mask:
- @samp{vexp([2, 0, 3, 7, 0, 0], [a, b], [x, y])} produces
- @samp{[a, x, b, 7, y, 0]}.
- Another variation on the masking idea is to combine @samp{[a, b, c, d, e]}
- with the mask @samp{[1, 0, 1, 0, 1]} to produce @samp{[a, 0, c, 0, e]}.
- You can accomplish this with @kbd{V M a &}, mapping the logical ``and''
- operation across the two vectors. @xref{Logical Operations}. Note that
- the @code{? :} operation also discussed there allows other types of
- masking using vectors.
- @node Vector and Matrix Arithmetic, Set Operations, Manipulating Vectors, Matrix Functions
- @section Vector and Matrix Arithmetic
- @noindent
- Basic arithmetic operations like addition and multiplication are defined
- for vectors and matrices as well as for numbers. Division of matrices, in
- the sense of multiplying by the inverse, is supported. (Division by a
- matrix actually uses LU-decomposition for greater accuracy and speed.)
- @xref{Basic Arithmetic}.
- The following functions are applied element-wise if their arguments are
- vectors or matrices: @code{change-sign}, @code{conj}, @code{arg},
- @code{re}, @code{im}, @code{polar}, @code{rect}, @code{clean},
- @code{float}, @code{frac}. @xref{Function Index}.@refill
- @kindex V J
- @pindex calc-conj-transpose
- @tindex ctrn
- The @kbd{V J} (@code{calc-conj-transpose}) [@code{ctrn}] command computes
- the conjugate transpose of its argument, i.e., @samp{conj(trn(x))}.
- @ignore
- @mindex A
- @end ignore
- @kindex A (vectors)
- @pindex calc-abs (vectors)
- @ignore
- @mindex abs
- @end ignore
- @tindex abs (vectors)
- The @kbd{A} (@code{calc-abs}) [@code{abs}] command computes the
- Frobenius norm of a vector or matrix argument. This is the square
- root of the sum of the squares of the absolute values of the
- elements of the vector or matrix. If the vector is interpreted as
- a point in two- or three-dimensional space, this is the distance
- from that point to the origin.@refill
- @kindex v n
- @pindex calc-rnorm
- @tindex rnorm
- The @kbd{v n} (@code{calc-rnorm}) [@code{rnorm}] command computes
- the row norm, or infinity-norm, of a vector or matrix. For a plain
- vector, this is the maximum of the absolute values of the elements.
- For a matrix, this is the maximum of the row-absolute-value-sums,
- i.e., of the sums of the absolute values of the elements along the
- various rows.
- @kindex V N
- @pindex calc-cnorm
- @tindex cnorm
- The @kbd{V N} (@code{calc-cnorm}) [@code{cnorm}] command computes
- the column norm, or one-norm, of a vector or matrix. For a plain
- vector, this is the sum of the absolute values of the elements.
- For a matrix, this is the maximum of the column-absolute-value-sums.
- General @cite{k}-norms for @cite{k} other than one or infinity are
- not provided.
- @kindex V C
- @pindex calc-cross
- @tindex cross
- The @kbd{V C} (@code{calc-cross}) [@code{cross}] command computes the
- right-handed cross product of two vectors, each of which must have
- exactly three elements.
- @ignore
- @mindex &
- @end ignore
- @kindex & (matrices)
- @pindex calc-inv (matrices)
- @ignore
- @mindex inv
- @end ignore
- @tindex inv (matrices)
- The @kbd{&} (@code{calc-inv}) [@code{inv}] command computes the
- inverse of a square matrix. If the matrix is singular, the inverse
- operation is left in symbolic form. Matrix inverses are recorded so
- that once an inverse (or determinant) of a particular matrix has been
- computed, the inverse and determinant of the matrix can be recomputed
- quickly in the future.
- If the argument to @kbd{&} is a plain number @cite{x}, this
- command simply computes @cite{1/x}. This is okay, because the
- @samp{/} operator also does a matrix inversion when dividing one
- by a matrix.
- @kindex V D
- @pindex calc-mdet
- @tindex det
- The @kbd{V D} (@code{calc-mdet}) [@code{det}] command computes the
- determinant of a square matrix.
- @kindex V L
- @pindex calc-mlud
- @tindex lud
- The @kbd{V L} (@code{calc-mlud}) [@code{lud}] command computes the
- LU decomposition of a matrix. The result is a list of three matrices
- which, when multiplied together left-to-right, form the original matrix.
- The first is a permutation matrix that arises from pivoting in the
- algorithm, the second is lower-triangular with ones on the diagonal,
- and the third is upper-triangular.
- @kindex V T
- @pindex calc-mtrace
- @tindex tr
- The @kbd{V T} (@code{calc-mtrace}) [@code{tr}] command computes the
- trace of a square matrix. This is defined as the sum of the diagonal
- elements of the matrix.
- @node Set Operations, Statistical Operations, Vector and Matrix Arithmetic, Matrix Functions
- @section Set Operations using Vectors
- @noindent
- @cindex Sets, as vectors
- Calc includes several commands which interpret vectors as @dfn{sets} of
- objects. A set is a collection of objects; any given object can appear
- only once in the set. Calc stores sets as vectors of objects in
- sorted order. Objects in a Calc set can be any of the usual things,
- such as numbers, variables, or formulas. Two set elements are considered
- equal if they are identical, except that numerically equal numbers like
- the integer 4 and the float 4.0 are considered equal even though they
- are not ``identical.'' Variables are treated like plain symbols without
- attached values by the set operations; subtracting the set @samp{[b]}
- from @samp{[a, b]} always yields the set @samp{[a]} even though if
- the variables @samp{a} and @samp{b} both equalled 17, you might
- expect the answer @samp{[]}.
- If a set contains interval forms, then it is assumed to be a set of
- real numbers. In this case, all set operations require the elements
- of the set to be only things that are allowed in intervals: Real
- numbers, plus and minus infinity, HMS forms, and date forms. If
- there are variables or other non-real objects present in a real set,
- all set operations on it will be left in unevaluated form.
- If the input to a set operation is a plain number or interval form
- @var{a}, it is treated like the one-element vector @samp{[@var{a}]}.
- The result is always a vector, except that if the set consists of a
- single interval, the interval itself is returned instead.
- @xref{Logical Operations}, for the @code{in} function which tests if
- a certain value is a member of a given set. To test if the set @cite{A}
- is a subset of the set @cite{B}, use @samp{vdiff(A, B) = []}.
- @kindex V +
- @pindex calc-remove-duplicates
- @tindex rdup
- The @kbd{V +} (@code{calc-remove-duplicates}) [@code{rdup}] command
- converts an arbitrary vector into set notation. It works by sorting
- the vector as if by @kbd{V S}, then removing duplicates. (For example,
- @kbd{[a, 5, 4, a, 4.0]} is sorted to @samp{[4, 4.0, 5, a, a]} and then
- reduced to @samp{[4, 5, a]}). Overlapping intervals are merged as
- necessary. You rarely need to use @kbd{V +} explicitly, since all the
- other set-based commands apply @kbd{V +} to their inputs before using
- them.
- @kindex V V
- @pindex calc-set-union
- @tindex vunion
- The @kbd{V V} (@code{calc-set-union}) [@code{vunion}] command computes
- the union of two sets. An object is in the union of two sets if and
- only if it is in either (or both) of the input sets. (You could
- accomplish the same thing by concatenating the sets with @kbd{|},
- then using @kbd{V +}.)
- @kindex V ^
- @pindex calc-set-intersect
- @tindex vint
- The @kbd{V ^} (@code{calc-set-intersect}) [@code{vint}] command computes
- the intersection of two sets. An object is in the intersection if
- and only if it is in both of the input sets. Thus if the input
- sets are disjoint, i.e., if they share no common elements, the result
- will be the empty vector @samp{[]}. Note that the characters @kbd{V}
- and @kbd{^} were chosen to be close to the conventional mathematical
- notation for set union@c{ ($A \cup B$)}
- @asis{} and intersection@c{ ($A \cap B$)}
- @asis{}.
- @kindex V -
- @pindex calc-set-difference
- @tindex vdiff
- The @kbd{V -} (@code{calc-set-difference}) [@code{vdiff}] command computes
- the difference between two sets. An object is in the difference
- @cite{A - B} if and only if it is in @cite{A} but not in @cite{B}.
- Thus subtracting @samp{[y,z]} from a set will remove the elements
- @samp{y} and @samp{z} if they are present. You can also think of this
- as a general @dfn{set complement} operator; if @cite{A} is the set of
- all possible values, then @cite{A - B} is the ``complement'' of @cite{B}.
- Obviously this is only practical if the set of all possible values in
- your problem is small enough to list in a Calc vector (or simple
- enough to express in a few intervals).
- @kindex V X
- @pindex calc-set-xor
- @tindex vxor
- The @kbd{V X} (@code{calc-set-xor}) [@code{vxor}] command computes
- the ``exclusive-or,'' or ``symmetric difference'' of two sets.
- An object is in the symmetric difference of two sets if and only
- if it is in one, but @emph{not} both, of the sets. Objects that
- occur in both sets ``cancel out.''
- @kindex V ~
- @pindex calc-set-complement
- @tindex vcompl
- The @kbd{V ~} (@code{calc-set-complement}) [@code{vcompl}] command
- computes the complement of a set with respect to the real numbers.
- Thus @samp{vcompl(x)} is equivalent to @samp{vdiff([-inf .. inf], x)}.
- For example, @samp{vcompl([2, (3 .. 4]])} evaluates to
- @samp{[[-inf .. 2), (2 .. 3], (4 .. inf]]}.
- @kindex V F
- @pindex calc-set-floor
- @tindex vfloor
- The @kbd{V F} (@code{calc-set-floor}) [@code{vfloor}] command
- reinterprets a set as a set of integers. Any non-integer values,
- and intervals that do not enclose any integers, are removed. Open
- intervals are converted to equivalent closed intervals. Successive
- integers are converted into intervals of integers. For example, the
- complement of the set @samp{[2, 6, 7, 8]} is messy, but if you wanted
- the complement with respect to the set of integers you could type
- @kbd{V ~ V F} to get @samp{[[-inf .. 1], [3 .. 5], [9 .. inf]]}.
- @kindex V E
- @pindex calc-set-enumerate
- @tindex venum
- The @kbd{V E} (@code{calc-set-enumerate}) [@code{venum}] command
- converts a set of integers into an explicit vector. Intervals in
- the set are expanded out to lists of all integers encompassed by
- the intervals. This only works for finite sets (i.e., sets which
- do not involve @samp{-inf} or @samp{inf}).
- @kindex V :
- @pindex calc-set-span
- @tindex vspan
- The @kbd{V :} (@code{calc-set-span}) [@code{vspan}] command converts any
- set of reals into an interval form that encompasses all its elements.
- The lower limit will be the smallest element in the set; the upper
- limit will be the largest element. For an empty set, @samp{vspan([])}
- returns the empty interval @w{@samp{[0 .. 0)}}.
- @kindex V #
- @pindex calc-set-cardinality
- @tindex vcard
- The @kbd{V #} (@code{calc-set-cardinality}) [@code{vcard}] command counts
- the number of integers in a set. The result is the length of the vector
- that would be produced by @kbd{V E}, although the computation is much
- more efficient than actually producing that vector.
- @cindex Sets, as binary numbers
- Another representation for sets that may be more appropriate in some
- cases is binary numbers. If you are dealing with sets of integers
- in the range 0 to 49, you can use a 50-bit binary number where a
- particular bit is 1 if the corresponding element is in the set.
- @xref{Binary Functions}, for a list of commands that operate on
- binary numbers. Note that many of the above set operations have
- direct equivalents in binary arithmetic: @kbd{b o} (@code{calc-or}),
- @kbd{b a} (@code{calc-and}), @kbd{b d} (@code{calc-diff}),
- @kbd{b x} (@code{calc-xor}), and @kbd{b n} (@code{calc-not}),
- respectively. You can use whatever representation for sets is most
- convenient to you.
- @kindex b p
- @kindex b u
- @pindex calc-pack-bits
- @pindex calc-unpack-bits
- @tindex vpack
- @tindex vunpack
- The @kbd{b u} (@code{calc-unpack-bits}) [@code{vunpack}] command
- converts an integer that represents a set in binary into a set
- in vector/interval notation. For example, @samp{vunpack(67)}
- returns @samp{[[0 .. 1], 6]}. If the input is negative, the set
- it represents is semi-infinite: @samp{vunpack(-4) = [2 .. inf)}.
- Use @kbd{V E} afterwards to expand intervals to individual
- values if you wish. Note that this command uses the @kbd{b}
- (binary) prefix key.
- The @kbd{b p} (@code{calc-pack-bits}) [@code{vpack}] command
- converts the other way, from a vector or interval representing
- a set of nonnegative integers into a binary integer describing
- the same set. The set may include positive infinity, but must
- not include any negative numbers. The input is interpreted as a
- set of integers in the sense of @kbd{V F} (@code{vfloor}). Beware
- that a simple input like @samp{[100]} can result in a huge integer
- representation (@c{$2^{100}$}
- @cite{2^100}, a 31-digit integer, in this case).
- @node Statistical Operations, Reducing and Mapping, Set Operations, Matrix Functions
- @section Statistical Operations on Vectors
- @noindent
- @cindex Statistical functions
- The commands in this section take vectors as arguments and compute
- various statistical measures on the data stored in the vectors. The
- references used in the definitions of these functions are Bevington's
- @emph{Data Reduction and Error Analysis for the Physical Sciences},
- and @emph{Numerical Recipes} by Press, Flannery, Teukolsky and
- Vetterling.
- The statistical commands use the @kbd{u} prefix key followed by
- a shifted letter or other character.
- @xref{Manipulating Vectors}, for a description of @kbd{V H}
- (@code{calc-histogram}).
- @xref{Curve Fitting}, for the @kbd{a F} command for doing
- least-squares fits to statistical data.
- @xref{Probability Distribution Functions}, for several common
- probability distribution functions.
- @menu
- * Single-Variable Statistics::
- * Paired-Sample Statistics::
- @end menu
- @node Single-Variable Statistics, Paired-Sample Statistics, Statistical Operations, Statistical Operations
- @subsection Single-Variable Statistics
- @noindent
- These functions do various statistical computations on single
- vectors. Given a numeric prefix argument, they actually pop
- @var{n} objects from the stack and combine them into a data
- vector. Each object may be either a number or a vector; if a
- vector, any sub-vectors inside it are ``flattened'' as if by
- @kbd{v a 0}; @pxref{Manipulating Vectors}. By default one object
- is popped, which (in order to be useful) is usually a vector.
- If an argument is a variable name, and the value stored in that
- variable is a vector, then the stored vector is used. This method
- has the advantage that if your data vector is large, you can avoid
- the slow process of manipulating it directly on the stack.
- These functions are left in symbolic form if any of their arguments
- are not numbers or vectors, e.g., if an argument is a formula, or
- a non-vector variable. However, formulas embedded within vector
- arguments are accepted; the result is a symbolic representation
- of the computation, based on the assumption that the formula does
- not itself represent a vector. All varieties of numbers such as
- error forms and interval forms are acceptable.
- Some of the functions in this section also accept a single error form
- or interval as an argument. They then describe a property of the
- normal or uniform (respectively) statistical distribution described
- by the argument. The arguments are interpreted in the same way as
- the @var{M} argument of the random number function @kbd{k r}. In
- particular, an interval with integer limits is considered an integer
- distribution, so that @samp{[2 .. 6)} is the same as @samp{[2 .. 5]}.
- An interval with at least one floating-point limit is a continuous
- distribution: @samp{[2.0 .. 6.0)} is @emph{not} the same as
- @samp{[2.0 .. 5.0]}!
- @kindex u #
- @pindex calc-vector-count
- @tindex vcount
- The @kbd{u #} (@code{calc-vector-count}) [@code{vcount}] command
- computes the number of data values represented by the inputs.
- For example, @samp{vcount(1, [2, 3], [[4, 5], [], x, y])} returns 7.
- If the argument is a single vector with no sub-vectors, this
- simply computes the length of the vector.
- @kindex u +
- @kindex u *
- @pindex calc-vector-sum
- @pindex calc-vector-prod
- @tindex vsum
- @tindex vprod
- @cindex Summations (statistical)
- The @kbd{u +} (@code{calc-vector-sum}) [@code{vsum}] command
- computes the sum of the data values. The @kbd{u *}
- (@code{calc-vector-prod}) [@code{vprod}] command computes the
- product of the data values. If the input is a single flat vector,
- these are the same as @kbd{V R +} and @kbd{V R *}
- (@pxref{Reducing and Mapping}).@refill
- @kindex u X
- @kindex u N
- @pindex calc-vector-max
- @pindex calc-vector-min
- @tindex vmax
- @tindex vmin
- The @kbd{u X} (@code{calc-vector-max}) [@code{vmax}] command
- computes the maximum of the data values, and the @kbd{u N}
- (@code{calc-vector-min}) [@code{vmin}] command computes the minimum.
- If the argument is an interval, this finds the minimum or maximum
- value in the interval. (Note that @samp{vmax([2..6)) = 5} as
- described above.) If the argument is an error form, this returns
- plus or minus infinity.
- @kindex u M
- @pindex calc-vector-mean
- @tindex vmean
- @cindex Mean of data values
- The @kbd{u M} (@code{calc-vector-mean}) [@code{vmean}] command
- computes the average (arithmetic mean) of the data values.
- If the inputs are error forms @c{$x$ @code{+/-} $\sigma$}
- @samp{x +/- s}, this is the weighted
- mean of the @cite{x} values with weights @c{$1 / \sigma^2$}
- @cite{1 / s^2}.
- @tex
- \turnoffactive
- $$ \mu = { \displaystyle \sum { x_i \over \sigma_i^2 } \over
- \displaystyle \sum { 1 \over \sigma_i^2 } } $$
- @end tex
- If the inputs are not error forms, this is simply the sum of the
- values divided by the count of the values.@refill
- Note that a plain number can be considered an error form with
- error @c{$\sigma = 0$}
- @cite{s = 0}. If the input to @kbd{u M} is a mixture of
- plain numbers and error forms, the result is the mean of the
- plain numbers, ignoring all values with non-zero errors. (By the
- above definitions it's clear that a plain number effectively
- has an infinite weight, next to which an error form with a finite
- weight is completely negligible.)
- This function also works for distributions (error forms or
- intervals). The mean of an error form `@var{a} @t{+/-} @var{b}' is simply
- @cite{a}. The mean of an interval is the mean of the minimum
- and maximum values of the interval.
- @kindex I u M
- @pindex calc-vector-mean-error
- @tindex vmeane
- The @kbd{I u M} (@code{calc-vector-mean-error}) [@code{vmeane}]
- command computes the mean of the data points expressed as an
- error form. This includes the estimated error associated with
- the mean. If the inputs are error forms, the error is the square
- root of the reciprocal of the sum of the reciprocals of the squares
- of the input errors. (I.e., the variance is the reciprocal of the
- sum of the reciprocals of the variances.)
- @tex
- \turnoffactive
- $$ \sigma_\mu^2 = {1 \over \displaystyle \sum {1 \over \sigma_i^2}} $$
- @end tex
- If the inputs are plain
- numbers, the error is equal to the standard deviation of the values
- divided by the square root of the number of values. (This works
- out to be equivalent to calculating the standard deviation and
- then assuming each value's error is equal to this standard
- deviation.)@refill
- @tex
- \turnoffactive
- $$ \sigma_\mu^2 = {\sigma^2 \over N} $$
- @end tex
- @kindex H u M
- @pindex calc-vector-median
- @tindex vmedian
- @cindex Median of data values
- The @kbd{H u M} (@code{calc-vector-median}) [@code{vmedian}]
- command computes the median of the data values. The values are
- first sorted into numerical order; the median is the middle
- value after sorting. (If the number of data values is even,
- the median is taken to be the average of the two middle values.)
- The median function is different from the other functions in
- this section in that the arguments must all be real numbers;
- variables are not accepted even when nested inside vectors.
- (Otherwise it is not possible to sort the data values.) If
- any of the input values are error forms, their error parts are
- ignored.
- The median function also accepts distributions. For both normal
- (error form) and uniform (interval) distributions, the median is
- the same as the mean.
- @kindex H I u M
- @pindex calc-vector-harmonic-mean
- @tindex vhmean
- @cindex Harmonic mean
- The @kbd{H I u M} (@code{calc-vector-harmonic-mean}) [@code{vhmean}]
- command computes the harmonic mean of the data values. This is
- defined as the reciprocal of the arithmetic mean of the reciprocals
- of the values.
- @tex
- \turnoffactive
- $$ { N \over \displaystyle \sum {1 \over x_i} } $$
- @end tex
- @kindex u G
- @pindex calc-vector-geometric-mean
- @tindex vgmean
- @cindex Geometric mean
- The @kbd{u G} (@code{calc-vector-geometric-mean}) [@code{vgmean}]
- command computes the geometric mean of the data values. This
- is the @var{n}th root of the product of the values. This is also
- equal to the @code{exp} of the arithmetic mean of the logarithms
- of the data values.
- @tex
- \turnoffactive
- $$ \exp \left ( \sum { \ln x_i } \right ) =
- \left ( \prod { x_i } \right)^{1 / N} $$
- @end tex
- @kindex H u G
- @tindex agmean
- The @kbd{H u G} [@code{agmean}] command computes the ``arithmetic-geometric
- mean'' of two numbers taken from the stack. This is computed by
- replacing the two numbers with their arithmetic mean and geometric
- mean, then repeating until the two values converge.
- @tex
- \turnoffactive
- $$ a_{i+1} = { a_i + b_i \over 2 } , \qquad b_{i+1} = \sqrt{a_i b_i} $$
- @end tex
- @cindex Root-mean-square
- Another commonly used mean, the RMS (root-mean-square), can be computed
- for a vector of numbers simply by using the @kbd{A} command.
- @kindex u S
- @pindex calc-vector-sdev
- @tindex vsdev
- @cindex Standard deviation
- @cindex Sample statistics
- The @kbd{u S} (@code{calc-vector-sdev}) [@code{vsdev}] command
- computes the standard deviation@c{ $\sigma$}
- @asis{} of the data values. If the
- values are error forms, the errors are used as weights just
- as for @kbd{u M}. This is the @emph{sample} standard deviation,
- whose value is the square root of the sum of the squares of the
- differences between the values and the mean of the @cite{N} values,
- divided by @cite{N-1}.
- @tex
- \turnoffactive
- $$ \sigma^2 = {1 \over N - 1} \sum (x_i - \mu)^2 $$
- @end tex
- This function also applies to distributions. The standard deviation
- of a single error form is simply the error part. The standard deviation
- of a continuous interval happens to equal the difference between the
- limits, divided by @c{$\sqrt{12}$}
- @cite{sqrt(12)}. The standard deviation of an
- integer interval is the same as the standard deviation of a vector
- of those integers.
- @kindex I u S
- @pindex calc-vector-pop-sdev
- @tindex vpsdev
- @cindex Population statistics
- The @kbd{I u S} (@code{calc-vector-pop-sdev}) [@code{vpsdev}]
- command computes the @emph{population} standard deviation.
- It is defined by the same formula as above but dividing
- by @cite{N} instead of by @cite{N-1}. The population standard
- deviation is used when the input represents the entire set of
- data values in the distribution; the sample standard deviation
- is used when the input represents a sample of the set of all
- data values, so that the mean computed from the input is itself
- only an estimate of the true mean.
- @tex
- \turnoffactive
- $$ \sigma^2 = {1 \over N} \sum (x_i - \mu)^2 $$
- @end tex
- For error forms and continuous intervals, @code{vpsdev} works
- exactly like @code{vsdev}. For integer intervals, it computes the
- population standard deviation of the equivalent vector of integers.
- @kindex H u S
- @kindex H I u S
- @pindex calc-vector-variance
- @pindex calc-vector-pop-variance
- @tindex vvar
- @tindex vpvar
- @cindex Variance of data values
- The @kbd{H u S} (@code{calc-vector-variance}) [@code{vvar}] and
- @kbd{H I u S} (@code{calc-vector-pop-variance}) [@code{vpvar}]
- commands compute the variance of the data values. The variance
- is the square@c{ $\sigma^2$}
- @asis{} of the standard deviation, i.e., the sum of the
- squares of the deviations of the data values from the mean.
- (This definition also applies when the argument is a distribution.)
- @ignore
- @starindex
- @end ignore
- @tindex vflat
- The @code{vflat} algebraic function returns a vector of its
- arguments, interpreted in the same way as the other functions
- in this section. For example, @samp{vflat(1, [2, [3, 4]], 5)}
- returns @samp{[1, 2, 3, 4, 5]}.
- @node Paired-Sample Statistics, , Single-Variable Statistics, Statistical Operations
- @subsection Paired-Sample Statistics
- @noindent
- The functions in this section take two arguments, which must be
- vectors of equal size. The vectors are each flattened in the same
- way as by the single-variable statistical functions. Given a numeric
- prefix argument of 1, these functions instead take one object from
- the stack, which must be an @c{$N\times2$}
- @asis{Nx2} matrix of data values. Once
- again, variable names can be used in place of actual vectors and
- matrices.
- @kindex u C
- @pindex calc-vector-covariance
- @tindex vcov
- @cindex Covariance
- The @kbd{u C} (@code{calc-vector-covariance}) [@code{vcov}] command
- computes the sample covariance of two vectors. The covariance
- of vectors @var{x} and @var{y} is the sum of the products of the
- differences between the elements of @var{x} and the mean of @var{x}
- times the differences between the corresponding elements of @var{y}
- and the mean of @var{y}, all divided by @cite{N-1}. Note that
- the variance of a vector is just the covariance of the vector
- with itself. Once again, if the inputs are error forms the
- errors are used as weight factors. If both @var{x} and @var{y}
- are composed of error forms, the error for a given data point
- is taken as the square root of the sum of the squares of the two
- input errors.
- @tex
- \turnoffactive
- $$ \sigma_{x\!y}^2 = {1 \over N-1} \sum (x_i - \mu_x) (y_i - \mu_y) $$
- $$ \sigma_{x\!y}^2 =
- {\displaystyle {1 \over N-1}
- \sum {(x_i - \mu_x) (y_i - \mu_y) \over \sigma_i^2}
- \over \displaystyle {1 \over N} \sum {1 \over \sigma_i^2}}
- $$
- @end tex
- @kindex I u C
- @pindex calc-vector-pop-covariance
- @tindex vpcov
- The @kbd{I u C} (@code{calc-vector-pop-covariance}) [@code{vpcov}]
- command computes the population covariance, which is the same as the
- sample covariance computed by @kbd{u C} except dividing by @cite{N}
- instead of @cite{N-1}.
- @kindex H u C
- @pindex calc-vector-correlation
- @tindex vcorr
- @cindex Correlation coefficient
- @cindex Linear correlation
- The @kbd{H u C} (@code{calc-vector-correlation}) [@code{vcorr}]
- command computes the linear correlation coefficient of two vectors.
- This is defined by the covariance of the vectors divided by the
- product of their standard deviations. (There is no difference
- between sample or population statistics here.)
- @tex
- \turnoffactive
- $$ r_{x\!y} = { \sigma_{x\!y}^2 \over \sigma_x^2 \sigma_y^2 } $$
- @end tex
- @node Reducing and Mapping, Vector and Matrix Formats, Statistical Operations, Matrix Functions
- @section Reducing and Mapping Vectors
- @noindent
- The commands in this section allow for more general operations on the
- elements of vectors.
- @kindex V A
- @pindex calc-apply
- @tindex apply
- The simplest of these operations is @kbd{V A} (@code{calc-apply})
- [@code{apply}], which applies a given operator to the elements of a vector.
- For example, applying the hypothetical function @code{f} to the vector
- @w{@samp{[1, 2, 3]}} would produce the function call @samp{f(1, 2, 3)}.
- Applying the @code{+} function to the vector @samp{[a, b]} gives
- @samp{a + b}. Applying @code{+} to the vector @samp{[a, b, c]} is an
- error, since the @code{+} function expects exactly two arguments.
- While @kbd{V A} is useful in some cases, you will usually find that either
- @kbd{V R} or @kbd{V M}, described below, is closer to what you want.
- @menu
- * Specifying Operators::
- * Mapping::
- * Reducing::
- * Nesting and Fixed Points::
- * Generalized Products::
- @end menu
- @node Specifying Operators, Mapping, Reducing and Mapping, Reducing and Mapping
- @subsection Specifying Operators
- @noindent
- Commands in this section (like @kbd{V A}) prompt you to press the key
- corresponding to the desired operator. Press @kbd{?} for a partial
- list of the available operators. Generally, an operator is any key or
- sequence of keys that would normally take one or more arguments from
- the stack and replace them with a result. For example, @kbd{V A H C}
- uses the hyperbolic cosine operator, @code{cosh}. (Since @code{cosh}
- expects one argument, @kbd{V A H C} requires a vector with a single
- element as its argument.)
- You can press @kbd{x} at the operator prompt to select any algebraic
- function by name to use as the operator. This includes functions you
- have defined yourself using the @kbd{Z F} command. (@xref{Algebraic
- Definitions}.) If you give a name for which no function has been
- defined, the result is left in symbolic form, as in @samp{f(1, 2, 3)}.
- Calc will prompt for the number of arguments the function takes if it
- can't figure it out on its own (say, because you named a function that
- is currently undefined). It is also possible to type a digit key before
- the function name to specify the number of arguments, e.g.,
- @kbd{V M 3 x f @key{RET}} calls @code{f} with three arguments even if it
- looks like it ought to have only two. This technique may be necessary
- if the function allows a variable number of arguments. For example,
- the @kbd{v e} [@code{vexp}] function accepts two or three arguments;
- if you want to map with the three-argument version, you will have to
- type @kbd{V M 3 v e}.
- It is also possible to apply any formula to a vector by treating that
- formula as a function. When prompted for the operator to use, press
- @kbd{'} (the apostrophe) and type your formula as an algebraic entry.
- You will then be prompted for the argument list, which defaults to a
- list of all variables that appear in the formula, sorted into alphabetic
- order. For example, suppose you enter the formula @w{@samp{x + 2y^x}}.
- The default argument list would be @samp{(x y)}, which means that if
- this function is applied to the arguments @samp{[3, 10]} the result will
- be @samp{3 + 2*10^3}. (If you plan to use a certain formula in this
- way often, you might consider defining it as a function with @kbd{Z F}.)
- Another way to specify the arguments to the formula you enter is with
- @kbd{$}, @kbd{$$}, and so on. For example, @kbd{V A ' $$ + 2$^$$}
- has the same effect as the previous example. The argument list is
- automatically taken to be @samp{($$ $)}. (The order of the arguments
- may seem backwards, but it is analogous to the way normal algebraic
- entry interacts with the stack.)
- If you press @kbd{$} at the operator prompt, the effect is similar to
- the apostrophe except that the relevant formula is taken from top-of-stack
- instead. The actual vector arguments of the @kbd{V A $} or related command
- then start at the second-to-top stack position. You will still be
- prompted for an argument list.
- @cindex Nameless functions
- @cindex Generic functions
- A function can be written without a name using the notation @samp{<#1 - #2>},
- which means ``a function of two arguments that computes the first
- argument minus the second argument.'' The symbols @samp{#1} and @samp{#2}
- are placeholders for the arguments. You can use any names for these
- placeholders if you wish, by including an argument list followed by a
- colon: @samp{<x, y : x - y>}. When you type @kbd{V A ' $$ + 2$^$$ @key{RET}},
- Calc builds the nameless function @samp{<#1 + 2 #2^#1>} as the function
- to map across the vectors. When you type @kbd{V A ' x + 2y^x @key{RET} @key{RET}},
- Calc builds the nameless function @w{@samp{<x, y : x + 2 y^x>}}. In both
- cases, Calc also writes the nameless function to the Trail so that you
- can get it back later if you wish.
- If there is only one argument, you can write @samp{#} in place of @samp{#1}.
- (Note that @samp{< >} notation is also used for date forms. Calc tells
- that @samp{<@var{stuff}>} is a nameless function by the presence of
- @samp{#} signs inside @var{stuff}, or by the fact that @var{stuff}
- begins with a list of variables followed by a colon.)
- You can type a nameless function directly to @kbd{V A '}, or put one on
- the stack and use it with @w{@kbd{V A $}}. Calc will not prompt for an
- argument list in this case, since the nameless function specifies the
- argument list as well as the function itself. In @kbd{V A '}, you can
- omit the @samp{< >} marks if you use @samp{#} notation for the arguments,
- so that @kbd{V A ' #1+#2 @key{RET}} is the same as @kbd{V A ' <#1+#2> @key{RET}},
- which in turn is the same as @kbd{V A ' $$+$ @key{RET}}.
- @cindex Lambda expressions
- @ignore
- @starindex
- @end ignore
- @tindex lambda
- The internal format for @samp{<x, y : x + y>} is @samp{lambda(x, y, x + y)}.
- (The word @code{lambda} derives from Lisp notation and the theory of
- functions.) The internal format for @samp{<#1 + #2>} is @samp{lambda(ArgA,
- ArgB, ArgA + ArgB)}. Note that there is no actual Calc function called
- @code{lambda}; the whole point is that the @code{lambda} expression is
- used in its symbolic form, not evaluated for an answer until it is applied
- to specific arguments by a command like @kbd{V A} or @kbd{V M}.
- (Actually, @code{lambda} does have one special property: Its arguments
- are never evaluated; for example, putting @samp{<(2/3) #>} on the stack
- will not simplify the @samp{2/3} until the nameless function is actually
- called.)
- @tindex add
- @tindex sub
- @ignore
- @mindex @idots
- @end ignore
- @tindex mul
- @ignore
- @mindex @null
- @end ignore
- @tindex div
- @ignore
- @mindex @null
- @end ignore
- @tindex pow
- @ignore
- @mindex @null
- @end ignore
- @tindex neg
- @ignore
- @mindex @null
- @end ignore
- @tindex mod
- @ignore
- @mindex @null
- @end ignore
- @tindex vconcat
- As usual, commands like @kbd{V A} have algebraic function name equivalents.
- For example, @kbd{V A k g} with an argument of @samp{v} is equivalent to
- @samp{apply(gcd, v)}. The first argument specifies the operator name,
- and is either a variable whose name is the same as the function name,
- or a nameless function like @samp{<#^3+1>}. Operators that are normally
- written as algebraic symbols have the names @code{add}, @code{sub},
- @code{mul}, @code{div}, @code{pow}, @code{neg}, @code{mod}, and
- @code{vconcat}.@refill
- @ignore
- @starindex
- @end ignore
- @tindex call
- The @code{call} function builds a function call out of several arguments:
- @samp{call(gcd, x, y)} is the same as @samp{apply(gcd, [x, y])}, which
- in turn is the same as @samp{gcd(x, y)}. The first argument of @code{call},
- like the other functions described here, may be either a variable naming a
- function, or a nameless function (@samp{call(<#1+2#2>, x, y)} is the same
- as @samp{x + 2y}).
- (Experts will notice that it's not quite proper to use a variable to name
- a function, since the name @code{gcd} corresponds to the Lisp variable
- @code{var-gcd} but to the Lisp function @code{calcFunc-gcd}. Calc
- automatically makes this translation, so you don't have to worry
- about it.)
- @node Mapping, Reducing, Specifying Operators, Reducing and Mapping
- @subsection Mapping
- @noindent
- @kindex V M
- @pindex calc-map
- @tindex map
- The @kbd{V M} (@code{calc-map}) [@code{map}] command applies a given
- operator elementwise to one or more vectors. For example, mapping
- @code{A} [@code{abs}] produces a vector of the absolute values of the
- elements in the input vector. Mapping @code{+} pops two vectors from
- the stack, which must be of equal length, and produces a vector of the
- pairwise sums of the elements. If either argument is a non-vector, it
- is duplicated for each element of the other vector. For example,
- @kbd{[1,2,3] 2 V M ^} squares the elements of the specified vector.
- With the 2 listed first, it would have computed a vector of powers of
- two. Mapping a user-defined function pops as many arguments from the
- stack as the function requires. If you give an undefined name, you will
- be prompted for the number of arguments to use.@refill
- If any argument to @kbd{V M} is a matrix, the operator is normally mapped
- across all elements of the matrix. For example, given the matrix
- @cite{[[1, -2, 3], [-4, 5, -6]]}, @kbd{V M A} takes six absolute values to
- produce another @c{$3\times2$}
- @asis{3x2} matrix, @cite{[[1, 2, 3], [4, 5, 6]]}.
- @tindex mapr
- The command @kbd{V M _} [@code{mapr}] (i.e., type an underscore at the
- operator prompt) maps by rows instead. For example, @kbd{V M _ A} views
- the above matrix as a vector of two 3-element row vectors. It produces
- a new vector which contains the absolute values of those row vectors,
- namely @cite{[3.74, 8.77]}. (Recall, the absolute value of a vector is
- defined as the square root of the sum of the squares of the elements.)
- Some operators accept vectors and return new vectors; for example,
- @kbd{v v} reverses a vector, so @kbd{V M _ v v} would reverse each row
- of the matrix to get a new matrix, @cite{[[3, -2, 1], [-6, 5, -4]]}.
- Sometimes a vector of vectors (representing, say, strings, sets, or lists)
- happens to look like a matrix. If so, remember to use @kbd{V M _} if you
- want to map a function across the whole strings or sets rather than across
- their individual elements.
- @tindex mapc
- The command @kbd{V M :} [@code{mapc}] maps by columns. Basically, it
- transposes the input matrix, maps by rows, and then, if the result is a
- matrix, transposes again. For example, @kbd{V M : A} takes the absolute
- values of the three columns of the matrix, treating each as a 2-vector,
- and @kbd{V M : v v} reverses the columns to get the matrix
- @cite{[[-4, 5, -6], [1, -2, 3]]}.
- (The symbols @kbd{_} and @kbd{:} were chosen because they had row-like
- and column-like appearances, and were not already taken by useful
- operators. Also, they appear shifted on most keyboards so they are easy
- to type after @kbd{V M}.)
- The @kbd{_} and @kbd{:} modifiers have no effect on arguments that are
- not matrices (so if none of the arguments are matrices, they have no
- effect at all). If some of the arguments are matrices and others are
- plain numbers, the plain numbers are held constant for all rows of the
- matrix (so that @kbd{2 V M _ ^} squares every row of a matrix; squaring
- a vector takes a dot product of the vector with itself).
- If some of the arguments are vectors with the same lengths as the
- rows (for @kbd{V M _}) or columns (for @kbd{V M :}) of the matrix
- arguments, those vectors are also held constant for every row or
- column.
- Sometimes it is useful to specify another mapping command as the operator
- to use with @kbd{V M}. For example, @kbd{V M _ V A +} applies @kbd{V A +}
- to each row of the input matrix, which in turn adds the two values on that
- row. If you give another vector-operator command as the operator for
- @kbd{V M}, it automatically uses map-by-rows mode if you don't specify
- otherwise; thus @kbd{V M V A +} is equivalent to @kbd{V M _ V A +}. (If
- you really want to map-by-elements another mapping command, you can use
- a triple-nested mapping command: @kbd{V M V M V A +} means to map
- @kbd{V M V A +} over the rows of the matrix; in turn, @kbd{V A +} is
- mapped over the elements of each row.)
- @tindex mapa
- @tindex mapd
- Previous versions of Calc had ``map across'' and ``map down'' modes
- that are now considered obsolete; the old ``map across'' is now simply
- @kbd{V M V A}, and ``map down'' is now @kbd{V M : V A}. The algebraic
- functions @code{mapa} and @code{mapd} are still supported, though.
- Note also that, while the old mapping modes were persistent (once you
- set the mode, it would apply to later mapping commands until you reset
- it), the new @kbd{:} and @kbd{_} modifiers apply only to the current
- mapping command. The default @kbd{V M} always means map-by-elements.
- @xref{Algebraic Manipulation}, for the @kbd{a M} command, which is like
- @kbd{V M} but for equations and inequalities instead of vectors.
- @xref{Storing Variables}, for the @kbd{s m} command which modifies a
- variable's stored value using a @kbd{V M}-like operator.
- @node Reducing, Nesting and Fixed Points, Mapping, Reducing and Mapping
- @subsection Reducing
- @noindent
- @kindex V R
- @pindex calc-reduce
- @tindex reduce
- The @kbd{V R} (@code{calc-reduce}) [@code{reduce}] command applies a given
- binary operator across all the elements of a vector. A binary operator is
- a function such as @code{+} or @code{max} which takes two arguments. For
- example, reducing @code{+} over a vector computes the sum of the elements
- of the vector. Reducing @code{-} computes the first element minus each of
- the remaining elements. Reducing @code{max} computes the maximum element
- and so on. In general, reducing @code{f} over the vector @samp{[a, b, c, d]}
- produces @samp{f(f(f(a, b), c), d)}.
- @kindex I V R
- @tindex rreduce
- The @kbd{I V R} [@code{rreduce}] command is similar to @kbd{V R} except
- that works from right to left through the vector. For example, plain
- @kbd{V R -} on the vector @samp{[a, b, c, d]} produces @samp{a - b - c - d}
- but @kbd{I V R -} on the same vector produces @samp{a - (b - (c - d))},
- or @samp{a - b + c - d}. This ``alternating sum'' occurs frequently
- in power series expansions.
- @kindex V U
- @tindex accum
- The @kbd{V U} (@code{calc-accumulate}) [@code{accum}] command does an
- accumulation operation. Here Calc does the corresponding reduction
- operation, but instead of producing only the final result, it produces
- a vector of all the intermediate results. Accumulating @code{+} over
- the vector @samp{[a, b, c, d]} produces the vector
- @samp{[a, a + b, a + b + c, a + b + c + d]}.
- @kindex I V U
- @tindex raccum
- The @kbd{I V U} [@code{raccum}] command does a right-to-left accumulation.
- For example, @kbd{I V U -} on the vector @samp{[a, b, c, d]} produces the
- vector @samp{[a - b + c - d, b - c + d, c - d, d]}.
- @tindex reducea
- @tindex rreducea
- @tindex reduced
- @tindex rreduced
- As for @kbd{V M}, @kbd{V R} normally reduces a matrix elementwise. For
- example, given the matrix @cite{[[a, b, c], [d, e, f]]}, @kbd{V R +} will
- compute @cite{a + b + c + d + e + f}. You can type @kbd{V R _} or
- @kbd{V R :} to modify this behavior. The @kbd{V R _} [@code{reducea}]
- command reduces ``across'' the matrix; it reduces each row of the matrix
- as a vector, then collects the results. Thus @kbd{V R _ +} of this
- matrix would produce @cite{[a + b + c, d + e + f]}. Similarly, @kbd{V R :}
- [@code{reduced}] reduces down; @kbd{V R : +} would produce @cite{[a + d,
- b + e, c + f]}.
- @tindex reducer
- @tindex rreducer
- There is a third ``by rows'' mode for reduction that is occasionally
- useful; @kbd{V R =} [@code{reducer}] simply reduces the operator over
- the rows of the matrix themselves. Thus @kbd{V R = +} on the above
- matrix would get the same result as @kbd{V R : +}, since adding two
- row vectors is equivalent to adding their elements. But @kbd{V R = *}
- would multiply the two rows (to get a single number, their dot product),
- while @kbd{V R : *} would produce a vector of the products of the columns.
- These three matrix reduction modes work with @kbd{V R} and @kbd{I V R},
- but they are not currently supported with @kbd{V U} or @kbd{I V U}.
- @tindex reducec
- @tindex rreducec
- The obsolete reduce-by-columns function, @code{reducec}, is still
- supported but there is no way to get it through the @kbd{V R} command.
- The commands @kbd{M-# :} and @kbd{M-# _} are equivalent to typing
- @kbd{M-# r} to grab a rectangle of data into Calc, and then typing
- @kbd{V R : +} or @kbd{V R _ +}, respectively, to sum the columns or
- rows of the matrix. @xref{Grabbing From Buffers}.
- @node Nesting and Fixed Points, Generalized Products, Reducing, Reducing and Mapping
- @subsection Nesting and Fixed Points
- @noindent
- @kindex H V R
- @tindex nest
- The @kbd{H V R} [@code{nest}] command applies a function to a given
- argument repeatedly. It takes two values, @samp{a} and @samp{n}, from
- the stack, where @samp{n} must be an integer. It then applies the
- function nested @samp{n} times; if the function is @samp{f} and @samp{n}
- is 3, the result is @samp{f(f(f(a)))}. The number @samp{n} may be
- negative if Calc knows an inverse for the function @samp{f}; for
- example, @samp{nest(sin, a, -2)} returns @samp{arcsin(arcsin(a))}.
- @kindex H V U
- @tindex anest
- The @kbd{H V U} [@code{anest}] command is an accumulating version of
- @code{nest}: It returns a vector of @samp{n+1} values, e.g.,
- @samp{[a, f(a), f(f(a)), f(f(f(a)))]}. If @samp{n} is negative and
- @samp{F} is the inverse of @samp{f}, then the result is of the
- form @samp{[a, F(a), F(F(a)), F(F(F(a)))]}.
- @kindex H I V R
- @tindex fixp
- @cindex Fixed points
- The @kbd{H I V R} [@code{fixp}] command is like @kbd{H V R}, except
- that it takes only an @samp{a} value from the stack; the function is
- applied until it reaches a ``fixed point,'' i.e., until the result
- no longer changes.
- @kindex H I V U
- @tindex afixp
- The @kbd{H I V U} [@code{afixp}] command is an accumulating @code{fixp}.
- The first element of the return vector will be the initial value @samp{a};
- the last element will be the final result that would have been returned
- by @code{fixp}.
- For example, 0.739085 is a fixed point of the cosine function (in radians):
- @samp{cos(0.739085) = 0.739085}. You can find this value by putting, say,
- 1.0 on the stack and typing @kbd{H I V U C}. (We use the accumulating
- version so we can see the intermediate results: @samp{[1, 0.540302, 0.857553,
- 0.65329, ...]}. With a precision of six, this command will take 36 steps
- to converge to 0.739085.)
- Newton's method for finding roots is a classic example of iteration
- to a fixed point. To find the square root of five starting with an
- initial guess, Newton's method would look for a fixed point of the
- function @samp{(x + 5/x) / 2}. Putting a guess of 1 on the stack
- and typing @kbd{H I V R ' ($ + 5/$)/2 @key{RET}} quickly yields the result
- 2.23607. This is equivalent to using the @kbd{a R} (@code{calc-find-root})
- command to find a root of the equation @samp{x^2 = 5}.
- These examples used numbers for @samp{a} values. Calc keeps applying
- the function until two successive results are equal to within the
- current precision. For complex numbers, both the real parts and the
- imaginary parts must be equal to within the current precision. If
- @samp{a} is a formula (say, a variable name), then the function is
- applied until two successive results are exactly the same formula.
- It is up to you to ensure that the function will eventually converge;
- if it doesn't, you may have to press @kbd{C-g} to stop the Calculator.
- The algebraic @code{fixp} function takes two optional arguments, @samp{n}
- and @samp{tol}. The first is the maximum number of steps to be allowed,
- and must be either an integer or the symbol @samp{inf} (infinity, the
- default). The second is a convergence tolerance. If a tolerance is
- specified, all results during the calculation must be numbers, not
- formulas, and the iteration stops when the magnitude of the difference
- between two successive results is less than or equal to the tolerance.
- (This implies that a tolerance of zero iterates until the results are
- exactly equal.)
- Putting it all together, @samp{fixp(<(# + A/#)/2>, B, 20, 1e-10)}
- computes the square root of @samp{A} given the initial guess @samp{B},
- stopping when the result is correct within the specified tolerance, or
- when 20 steps have been taken, whichever is sooner.
- @node Generalized Products, , Nesting and Fixed Points, Reducing and Mapping
- @subsection Generalized Products
- @kindex V O
- @pindex calc-outer-product
- @tindex outer
- The @kbd{V O} (@code{calc-outer-product}) [@code{outer}] command applies
- a given binary operator to all possible pairs of elements from two
- vectors, to produce a matrix. For example, @kbd{V O *} with @samp{[a, b]}
- and @samp{[x, y, z]} on the stack produces a multiplication table:
- @samp{[[a x, a y, a z], [b x, b y, b z]]}. Element @var{r},@var{c} of
- the result matrix is obtained by applying the operator to element @var{r}
- of the lefthand vector and element @var{c} of the righthand vector.
- @kindex V I
- @pindex calc-inner-product
- @tindex inner
- The @kbd{V I} (@code{calc-inner-product}) [@code{inner}] command computes
- the generalized inner product of two vectors or matrices, given a
- ``multiplicative'' operator and an ``additive'' operator. These can each
- actually be any binary operators; if they are @samp{*} and @samp{+},
- respectively, the result is a standard matrix multiplication. Element
- @var{r},@var{c} of the result matrix is obtained by mapping the
- multiplicative operator across row @var{r} of the lefthand matrix and
- column @var{c} of the righthand matrix, and then reducing with the additive
- operator. Just as for the standard @kbd{*} command, this can also do a
- vector-matrix or matrix-vector inner product, or a vector-vector
- generalized dot product.
- Since @kbd{V I} requires two operators, it prompts twice. In each case,
- you can use any of the usual methods for entering the operator. If you
- use @kbd{$} twice to take both operator formulas from the stack, the
- first (multiplicative) operator is taken from the top of the stack
- and the second (additive) operator is taken from second-to-top.
- @node Vector and Matrix Formats, , Reducing and Mapping, Matrix Functions
- @section Vector and Matrix Display Formats
- @noindent
- Commands for controlling vector and matrix display use the @kbd{v} prefix
- instead of the usual @kbd{d} prefix. But they are display modes; in
- particular, they are influenced by the @kbd{I} and @kbd{H} prefix keys
- in the same way (@pxref{Display Modes}). Matrix display is also
- influenced by the @kbd{d O} (@code{calc-flat-language}) mode;
- @pxref{Normal Language Modes}.
- @kindex V <
- @pindex calc-matrix-left-justify
- @kindex V =
- @pindex calc-matrix-center-justify
- @kindex V >
- @pindex calc-matrix-right-justify
- The commands @kbd{v <} (@code{calc-matrix-left-justify}), @kbd{v >}
- (@code{calc-matrix-right-justify}), and @w{@kbd{v =}}
- (@code{calc-matrix-center-justify}) control whether matrix elements
- are justified to the left, right, or center of their columns.@refill
- @kindex V [
- @pindex calc-vector-brackets
- @kindex V @{
- @pindex calc-vector-braces
- @kindex V (
- @pindex calc-vector-parens
- The @kbd{v [} (@code{calc-vector-brackets}) command turns the square
- brackets that surround vectors and matrices displayed in the stack on
- and off. The @kbd{v @{} (@code{calc-vector-braces}) and @kbd{v (}
- (@code{calc-vector-parens}) commands use curly braces or parentheses,
- respectively, instead of square brackets. For example, @kbd{v @{} might
- be used in preparation for yanking a matrix into a buffer running
- Mathematica. (In fact, the Mathematica language mode uses this mode;
- @pxref{Mathematica Language Mode}.) Note that, regardless of the
- display mode, either brackets or braces may be used to enter vectors,
- and parentheses may never be used for this purpose.@refill
- @kindex V ]
- @pindex calc-matrix-brackets
- The @kbd{v ]} (@code{calc-matrix-brackets}) command controls the
- ``big'' style display of matrices. It prompts for a string of code
- letters; currently implemented letters are @code{R}, which enables
- brackets on each row of the matrix; @code{O}, which enables outer
- brackets in opposite corners of the matrix; and @code{C}, which
- enables commas or semicolons at the ends of all rows but the last.
- The default format is @samp{RO}. (Before Calc 2.00, the format
- was fixed at @samp{ROC}.) Here are some example matrices:
- @example
- @group
- [ [ 123, 0, 0 ] [ [ 123, 0, 0 ],
- [ 0, 123, 0 ] [ 0, 123, 0 ],
- [ 0, 0, 123 ] ] [ 0, 0, 123 ] ]
- RO ROC
- @end group
- @end example
- @noindent
- @example
- @group
- [ 123, 0, 0 [ 123, 0, 0 ;
- 0, 123, 0 0, 123, 0 ;
- 0, 0, 123 ] 0, 0, 123 ]
- O OC
- @end group
- @end example
- @noindent
- @example
- @group
- [ 123, 0, 0 ] 123, 0, 0
- [ 0, 123, 0 ] 0, 123, 0
- [ 0, 0, 123 ] 0, 0, 123
- R @r{blank}
- @end group
- @end example
- @noindent
- Note that of the formats shown here, @samp{RO}, @samp{ROC}, and
- @samp{OC} are all recognized as matrices during reading, while
- the others are useful for display only.
- @kindex V ,
- @pindex calc-vector-commas
- The @kbd{v ,} (@code{calc-vector-commas}) command turns commas on and
- off in vector and matrix display.@refill
- In vectors of length one, and in all vectors when commas have been
- turned off, Calc adds extra parentheses around formulas that might
- otherwise be ambiguous. For example, @samp{[a b]} could be a vector
- of the one formula @samp{a b}, or it could be a vector of two
- variables with commas turned off. Calc will display the former
- case as @samp{[(a b)]}. You can disable these extra parentheses
- (to make the output less cluttered at the expense of allowing some
- ambiguity) by adding the letter @code{P} to the control string you
- give to @kbd{v ]} (as described above).
- @kindex V .
- @pindex calc-full-vectors
- The @kbd{v .} (@code{calc-full-vectors}) command turns abbreviated
- display of long vectors on and off. In this mode, vectors of six
- or more elements, or matrices of six or more rows or columns, will
- be displayed in an abbreviated form that displays only the first
- three elements and the last element: @samp{[a, b, c, ..., z]}.
- When very large vectors are involved this will substantially
- improve Calc's display speed.
- @kindex t .
- @pindex calc-full-trail-vectors
- The @kbd{t .} (@code{calc-full-trail-vectors}) command controls a
- similar mode for recording vectors in the Trail. If you turn on
- this mode, vectors of six or more elements and matrices of six or
- more rows or columns will be abbreviated when they are put in the
- Trail. The @kbd{t y} (@code{calc-trail-yank}) command will be
- unable to recover those vectors. If you are working with very
- large vectors, this mode will improve the speed of all operations
- that involve the trail.
- @kindex V /
- @pindex calc-break-vectors
- The @kbd{v /} (@code{calc-break-vectors}) command turns multi-line
- vector display on and off. Normally, matrices are displayed with one
- row per line but all other types of vectors are displayed in a single
- line. This mode causes all vectors, whether matrices or not, to be
- displayed with a single element per line. Sub-vectors within the
- vectors will still use the normal linear form.
- @node Algebra, Units, Matrix Functions, Top
- @chapter Algebra
- @noindent
- This section covers the Calc features that help you work with
- algebraic formulas. First, the general sub-formula selection
- mechanism is described; this works in conjunction with any Calc
- commands. Then, commands for specific algebraic operations are
- described. Finally, the flexible @dfn{rewrite rule} mechanism
- is discussed.
- The algebraic commands use the @kbd{a} key prefix; selection
- commands use the @kbd{j} (for ``just a letter that wasn't used
- for anything else'') prefix.
- @xref{Editing Stack Entries}, to see how to manipulate formulas
- using regular Emacs editing commands.@refill
- When doing algebraic work, you may find several of the Calculator's
- modes to be helpful, including algebraic-simplification mode (@kbd{m A})
- or no-simplification mode (@kbd{m O}),
- algebraic-entry mode (@kbd{m a}), fraction mode (@kbd{m f}), and
- symbolic mode (@kbd{m s}). @xref{Mode Settings}, for discussions
- of these modes. You may also wish to select ``big'' display mode (@kbd{d B}).
- @xref{Normal Language Modes}.@refill
- @menu
- * Selecting Subformulas::
- * Algebraic Manipulation::
- * Simplifying Formulas::
- * Polynomials::
- * Calculus::
- * Solving Equations::
- * Numerical Solutions::
- * Curve Fitting::
- * Summations::
- * Logical Operations::
- * Rewrite Rules::
- @end menu
- @node Selecting Subformulas, Algebraic Manipulation, Algebra, Algebra
- @section Selecting Sub-Formulas
- @noindent
- @cindex Selections
- @cindex Sub-formulas
- @cindex Parts of formulas
- When working with an algebraic formula it is often necessary to
- manipulate a portion of the formula rather than the formula as a
- whole. Calc allows you to ``select'' a portion of any formula on
- the stack. Commands which would normally operate on that stack
- entry will now operate only on the sub-formula, leaving the
- surrounding part of the stack entry alone.
- One common non-algebraic use for selection involves vectors. To work
- on one element of a vector in-place, simply select that element as a
- ``sub-formula'' of the vector.
- @menu
- * Making Selections::
- * Changing Selections::
- * Displaying Selections::
- * Operating on Selections::
- * Rearranging with Selections::
- @end menu
- @node Making Selections, Changing Selections, Selecting Subformulas, Selecting Subformulas
- @subsection Making Selections
- @noindent
- @kindex j s
- @pindex calc-select-here
- To select a sub-formula, move the Emacs cursor to any character in that
- sub-formula, and press @w{@kbd{j s}} (@code{calc-select-here}). Calc will
- highlight the smallest portion of the formula that contains that
- character. By default the sub-formula is highlighted by blanking out
- all of the rest of the formula with dots. Selection works in any
- display mode but is perhaps easiest in ``big'' (@kbd{d B}) mode.
- Suppose you enter the following formula:
- @smallexample
- @group
- 3 ___
- (a + b) + V c
- 1: ---------------
- 2 x + 1
- @end group
- @end smallexample
- @noindent
- (by typing @kbd{' ((a+b)^3 + sqrt(c)) / (2x+1)}). If you move the
- cursor to the letter @samp{b} and press @w{@kbd{j s}}, the display changes
- to
- @smallexample
- @group
- . ...
- .. . b. . . .
- 1* ...............
- . . . .
- @end group
- @end smallexample
- @noindent
- Every character not part of the sub-formula @samp{b} has been changed
- to a dot. The @samp{*} next to the line number is to remind you that
- the formula has a portion of it selected. (In this case, it's very
- obvious, but it might not always be. If Embedded Mode is enabled,
- the word @samp{Sel} also appears in the mode line because the stack
- may not be visible. @pxref{Embedded Mode}.)
- If you had instead placed the cursor on the parenthesis immediately to
- the right of the @samp{b}, the selection would have been:
- @smallexample
- @group
- . ...
- (a + b) . . .
- 1* ...............
- . . . .
- @end group
- @end smallexample
- @noindent
- The portion selected is always large enough to be considered a complete
- formula all by itself, so selecting the parenthesis selects the whole
- formula that it encloses. Putting the cursor on the @samp{+} sign
- would have had the same effect.
- (Strictly speaking, the Emacs cursor is really the manifestation of
- the Emacs ``point,'' which is a position @emph{between} two characters
- in the buffer. So purists would say that Calc selects the smallest
- sub-formula which contains the character to the right of ``point.'')
- If you supply a numeric prefix argument @var{n}, the selection is
- expanded to the @var{n}th enclosing sub-formula. Thus, positioning
- the cursor on the @samp{b} and typing @kbd{C-u 1 j s} will select
- @samp{a + b}; typing @kbd{C-u 2 j s} will select @samp{(a + b)^3},
- and so on.
- If the cursor is not on any part of the formula, or if you give a
- numeric prefix that is too large, the entire formula is selected.
- If the cursor is on the @samp{.} line that marks the top of the stack
- (i.e., its normal ``rest position''), this command selects the entire
- formula at stack level 1. Most selection commands similarly operate
- on the formula at the top of the stack if you haven't positioned the
- cursor on any stack entry.
- @kindex j a
- @pindex calc-select-additional
- The @kbd{j a} (@code{calc-select-additional}) command enlarges the
- current selection to encompass the cursor. To select the smallest
- sub-formula defined by two different points, move to the first and
- press @kbd{j s}, then move to the other and press @kbd{j a}. This
- is roughly analogous to using @kbd{C-@@} (@code{set-mark-command}) to
- select the two ends of a region of text during normal Emacs editing.
- @kindex j o
- @pindex calc-select-once
- The @kbd{j o} (@code{calc-select-once}) command selects a formula in
- exactly the same way as @kbd{j s}, except that the selection will
- last only as long as the next command that uses it. For example,
- @kbd{j o 1 +} is a handy way to add one to the sub-formula indicated
- by the cursor.
- (A somewhat more precise definition: The @kbd{j o} command sets a flag
- such that the next command involving selected stack entries will clear
- the selections on those stack entries afterwards. All other selection
- commands except @kbd{j a} and @kbd{j O} clear this flag.)
- @kindex j S
- @kindex j O
- @pindex calc-select-here-maybe
- @pindex calc-select-once-maybe
- The @kbd{j S} (@code{calc-select-here-maybe}) and @kbd{j O}
- (@code{calc-select-once-maybe}) commands are equivalent to @kbd{j s}
- and @kbd{j o}, respectively, except that if the formula already
- has a selection they have no effect. This is analogous to the
- behavior of some commands such as @kbd{j r} (@code{calc-rewrite-selection};
- @pxref{Selections with Rewrite Rules}) and is mainly intended to be
- used in keyboard macros that implement your own selection-oriented
- commands.@refill
- Selection of sub-formulas normally treats associative terms like
- @samp{a + b - c + d} and @samp{x * y * z} as single levels of the formula.
- If you place the cursor anywhere inside @samp{a + b - c + d} except
- on one of the variable names and use @kbd{j s}, you will select the
- entire four-term sum.
- @kindex j b
- @pindex calc-break-selections
- The @kbd{j b} (@code{calc-break-selections}) command controls a mode
- in which the ``deep structure'' of these associative formulas shows
- through. Calc actually stores the above formulas as @samp{((a + b) - c) + d}
- and @samp{x * (y * z)}. (Note that for certain obscure reasons, Calc
- treats multiplication as right-associative.) Once you have enabled
- @kbd{j b} mode, selecting with the cursor on the @samp{-} sign would
- only select the @samp{a + b - c} portion, which makes sense when the
- deep structure of the sum is considered. There is no way to select
- the @samp{b - c + d} portion; although this might initially look
- like just as legitimate a sub-formula as @samp{a + b - c}, the deep
- structure shows that it isn't. The @kbd{d U} command can be used
- to view the deep structure of any formula (@pxref{Normal Language Modes}).
- When @kbd{j b} mode has not been enabled, the deep structure is
- generally hidden by the selection commands---what you see is what
- you get.
- @kindex j u
- @pindex calc-unselect
- The @kbd{j u} (@code{calc-unselect}) command unselects the formula
- that the cursor is on. If there was no selection in the formula,
- this command has no effect. With a numeric prefix argument, it
- unselects the @var{n}th stack element rather than using the cursor
- position.
- @kindex j c
- @pindex calc-clear-selections
- The @kbd{j c} (@code{calc-clear-selections}) command unselects all
- stack elements.
- @node Changing Selections, Displaying Selections, Making Selections, Selecting Subformulas
- @subsection Changing Selections
- @noindent
- @kindex j m
- @pindex calc-select-more
- Once you have selected a sub-formula, you can expand it using the
- @w{@kbd{j m}} (@code{calc-select-more}) command. If @samp{a + b} is
- selected, pressing @w{@kbd{j m}} repeatedly works as follows:
- @smallexample
- @group
- 3 ... 3 ___ 3 ___
- (a + b) . . . (a + b) + V c (a + b) + V c
- 1* ............... 1* ............... 1* ---------------
- . . . . . . . . 2 x + 1
- @end group
- @end smallexample
- @noindent
- In the last example, the entire formula is selected. This is roughly
- the same as having no selection at all, but because there are subtle
- differences the @samp{*} character is still there on the line number.
- With a numeric prefix argument @var{n}, @kbd{j m} expands @var{n}
- times (or until the entire formula is selected). Note that @kbd{j s}
- with argument @var{n} is equivalent to plain @kbd{j s} followed by
- @kbd{j m} with argument @var{n}. If @w{@kbd{j m}} is used when there
- is no current selection, it is equivalent to @w{@kbd{j s}}.
- Even though @kbd{j m} does not explicitly use the location of the
- cursor within the formula, it nevertheless uses the cursor to determine
- which stack element to operate on. As usual, @kbd{j m} when the cursor
- is not on any stack element operates on the top stack element.
- @kindex j l
- @pindex calc-select-less
- The @kbd{j l} (@code{calc-select-less}) command reduces the current
- selection around the cursor position. That is, it selects the
- immediate sub-formula of the current selection which contains the
- cursor, the opposite of @kbd{j m}. If the cursor is not inside the
- current selection, the command de-selects the formula.
- @kindex j 1-9
- @pindex calc-select-part
- The @kbd{j 1} through @kbd{j 9} (@code{calc-select-part}) commands
- select the @var{n}th sub-formula of the current selection. They are
- like @kbd{j l} (@code{calc-select-less}) except they use counting
- rather than the cursor position to decide which sub-formula to select.
- For example, if the current selection is @kbd{a + b + c} or
- @kbd{f(a, b, c)} or @kbd{[a, b, c]}, then @kbd{j 1} selects @samp{a},
- @kbd{j 2} selects @samp{b}, and @kbd{j 3} selects @samp{c}; in each of
- these cases, @kbd{j 4} through @kbd{j 9} would be errors.
- If there is no current selection, @kbd{j 1} through @kbd{j 9} select
- the @var{n}th top-level sub-formula. (In other words, they act as if
- the entire stack entry were selected first.) To select the @var{n}th
- sub-formula where @var{n} is greater than nine, you must instead invoke
- @w{@kbd{j 1}} with @var{n} as a numeric prefix argument.@refill
- @kindex j n
- @kindex j p
- @pindex calc-select-next
- @pindex calc-select-previous
- The @kbd{j n} (@code{calc-select-next}) and @kbd{j p}
- (@code{calc-select-previous}) commands change the current selection
- to the next or previous sub-formula at the same level. For example,
- if @samp{b} is selected in @w{@samp{2 + a*b*c + x}}, then @kbd{j n}
- selects @samp{c}. Further @kbd{j n} commands would be in error because,
- even though there is something to the right of @samp{c} (namely, @samp{x}),
- it is not at the same level; in this case, it is not a term of the
- same product as @samp{b} and @samp{c}. However, @kbd{j m} (to select
- the whole product @samp{a*b*c} as a term of the sum) followed by
- @w{@kbd{j n}} would successfully select the @samp{x}.
- Similarly, @kbd{j p} moves the selection from the @samp{b} in this
- sample formula to the @samp{a}. Both commands accept numeric prefix
- arguments to move several steps at a time.
- It is interesting to compare Calc's selection commands with the
- Emacs Info system's commands for navigating through hierarchically
- organized documentation. Calc's @kbd{j n} command is completely
- analogous to Info's @kbd{n} command. Likewise, @kbd{j p} maps to
- @kbd{p}, @kbd{j 2} maps to @kbd{2}, and Info's @kbd{u} is like @kbd{j m}.
- (Note that @kbd{j u} stands for @code{calc-unselect}, not ``up''.)
- The Info @kbd{m} command is somewhat similar to Calc's @kbd{j s} and
- @kbd{j l}; in each case, you can jump directly to a sub-component
- of the hierarchy simply by pointing to it with the cursor.
- @node Displaying Selections, Operating on Selections, Changing Selections, Selecting Subformulas
- @subsection Displaying Selections
- @noindent
- @kindex j d
- @pindex calc-show-selections
- The @kbd{j d} (@code{calc-show-selections}) command controls how
- selected sub-formulas are displayed. One of the alternatives is
- illustrated in the above examples; if we press @kbd{j d} we switch
- to the other style in which the selected portion itself is obscured
- by @samp{#} signs:
- @smallexample
- @group
- 3 ... # ___
- (a + b) . . . ## # ## + V c
- 1* ............... 1* ---------------
- . . . . 2 x + 1
- @end group
- @end smallexample
- @node Operating on Selections, Rearranging with Selections, Displaying Selections, Selecting Subformulas
- @subsection Operating on Selections
- @noindent
- Once a selection is made, all Calc commands that manipulate items
- on the stack will operate on the selected portions of the items
- instead. (Note that several stack elements may have selections
- at once, though there can be only one selection at a time in any
- given stack element.)
- @kindex j e
- @pindex calc-enable-selections
- The @kbd{j e} (@code{calc-enable-selections}) command disables the
- effect that selections have on Calc commands. The current selections
- still exist, but Calc commands operate on whole stack elements anyway.
- This mode can be identified by the fact that the @samp{*} markers on
- the line numbers are gone, even though selections are visible. To
- reactivate the selections, press @kbd{j e} again.
- To extract a sub-formula as a new formula, simply select the
- sub-formula and press @key{RET}. This normally duplicates the top
- stack element; here it duplicates only the selected portion of that
- element.
- To replace a sub-formula with something different, you can enter the
- new value onto the stack and press @key{TAB}. This normally exchanges
- the top two stack elements; here it swaps the value you entered into
- the selected portion of the formula, returning the old selected
- portion to the top of the stack.
- @smallexample
- @group
- 3 ... ... ___
- (a + b) . . . 17 x y . . . 17 x y + V c
- 2* ............... 2* ............. 2: -------------
- . . . . . . . . 2 x + 1
- 3 3
- 1: 17 x y 1: (a + b) 1: (a + b)
- @end group
- @end smallexample
- In this example we select a sub-formula of our original example,
- enter a new formula, @key{TAB} it into place, then deselect to see
- the complete, edited formula.
- If you want to swap whole formulas around even though they contain
- selections, just use @kbd{j e} before and after.
- @kindex j '
- @pindex calc-enter-selection
- The @kbd{j '} (@code{calc-enter-selection}) command is another way
- to replace a selected sub-formula. This command does an algebraic
- entry just like the regular @kbd{'} key. When you press @key{RET},
- the formula you type replaces the original selection. You can use
- the @samp{$} symbol in the formula to refer to the original
- selection. If there is no selection in the formula under the cursor,
- the cursor is used to make a temporary selection for the purposes of
- the command. Thus, to change a term of a formula, all you have to
- do is move the Emacs cursor to that term and press @kbd{j '}.
- @kindex j `
- @pindex calc-edit-selection
- The @kbd{j `} (@code{calc-edit-selection}) command is a similar
- analogue of the @kbd{`} (@code{calc-edit}) command. It edits the
- selected sub-formula in a separate buffer. If there is no
- selection, it edits the sub-formula indicated by the cursor.
- To delete a sub-formula, press @key{DEL}. This generally replaces
- the sub-formula with the constant zero, but in a few suitable contexts
- it uses the constant one instead. The @key{DEL} key automatically
- deselects and re-simplifies the entire formula afterwards. Thus:
- @smallexample
- @group
- ###
- 17 x y + # # 17 x y 17 # y 17 y
- 1* ------------- 1: ------- 1* ------- 1: -------
- 2 x + 1 2 x + 1 2 x + 1 2 x + 1
- @end group
- @end smallexample
- In this example, we first delete the @samp{sqrt(c)} term; Calc
- accomplishes this by replacing @samp{sqrt(c)} with zero and
- resimplifying. We then delete the @kbd{x} in the numerator;
- since this is part of a product, Calc replaces it with @samp{1}
- and resimplifies.
- If you select an element of a vector and press @key{DEL}, that
- element is deleted from the vector. If you delete one side of
- an equation or inequality, only the opposite side remains.
- @kindex j @key{DEL}
- @pindex calc-del-selection
- The @kbd{j @key{DEL}} (@code{calc-del-selection}) command is like
- @key{DEL} but with the auto-selecting behavior of @kbd{j '} and
- @kbd{j `}. It deletes the selected portion of the formula
- indicated by the cursor, or, in the absence of a selection, it
- deletes the sub-formula indicated by the cursor position.
- @kindex j @key{RET}
- @pindex calc-grab-selection
- (There is also an auto-selecting @kbd{j @key{RET}} (@code{calc-copy-selection})
- command.)
- Normal arithmetic operations also apply to sub-formulas. Here we
- select the denominator, press @kbd{5 -} to subtract five from the
- denominator, press @kbd{n} to negate the denominator, then
- press @kbd{Q} to take the square root.
- @smallexample
- @group
- .. . .. . .. . .. .
- 1* ....... 1* ....... 1* ....... 1* ..........
- 2 x + 1 2 x - 4 4 - 2 x _________
- V 4 - 2 x
- @end group
- @end smallexample
- Certain types of operations on selections are not allowed. For
- example, for an arithmetic function like @kbd{-} no more than one of
- the arguments may be a selected sub-formula. (As the above example
- shows, the result of the subtraction is spliced back into the argument
- which had the selection; if there were more than one selection involved,
- this would not be well-defined.) If you try to subtract two selections,
- the command will abort with an error message.
- Operations on sub-formulas sometimes leave the formula as a whole
- in an ``un-natural'' state. Consider negating the @samp{2 x} term
- of our sample formula by selecting it and pressing @kbd{n}
- (@code{calc-change-sign}).@refill
- @smallexample
- @group
- .. . .. .
- 1* .......... 1* ...........
- ......... ..........
- . . . 2 x . . . -2 x
- @end group
- @end smallexample
- Unselecting the sub-formula reveals that the minus sign, which would
- normally have cancelled out with the subtraction automatically, has
- not been able to do so because the subtraction was not part of the
- selected portion. Pressing @kbd{=} (@code{calc-evaluate}) or doing
- any other mathematical operation on the whole formula will cause it
- to be simplified.
- @smallexample
- @group
- 17 y 17 y
- 1: ----------- 1: ----------
- __________ _________
- V 4 - -2 x V 4 + 2 x
- @end group
- @end smallexample
- @node Rearranging with Selections, , Operating on Selections, Selecting Subformulas
- @subsection Rearranging Formulas using Selections
- @noindent
- @kindex j R
- @pindex calc-commute-right
- The @kbd{j R} (@code{calc-commute-right}) command moves the selected
- sub-formula to the right in its surrounding formula. Generally the
- selection is one term of a sum or product; the sum or product is
- rearranged according to the commutative laws of algebra.
- As with @kbd{j '} and @kbd{j @key{DEL}}, the term under the cursor is used
- if there is no selection in the current formula. All commands described
- in this section share this property. In this example, we place the
- cursor on the @samp{a} and type @kbd{j R}, then repeat.
- @smallexample
- 1: a + b - c 1: b + a - c 1: b - c + a
- @end smallexample
- @noindent
- Note that in the final step above, the @samp{a} is switched with
- the @samp{c} but the signs are adjusted accordingly. When moving
- terms of sums and products, @kbd{j R} will never change the
- mathematical meaning of the formula.
- The selected term may also be an element of a vector or an argument
- of a function. The term is exchanged with the one to its right.
- In this case, the ``meaning'' of the vector or function may of
- course be drastically changed.
- @smallexample
- 1: [a, b, c] 1: [b, a, c] 1: [b, c, a]
- 1: f(a, b, c) 1: f(b, a, c) 1: f(b, c, a)
- @end smallexample
- @kindex j L
- @pindex calc-commute-left
- The @kbd{j L} (@code{calc-commute-left}) command is like @kbd{j R}
- except that it swaps the selected term with the one to its left.
- With numeric prefix arguments, these commands move the selected
- term several steps at a time. It is an error to try to move a
- term left or right past the end of its enclosing formula.
- With numeric prefix arguments of zero, these commands move the
- selected term as far as possible in the given direction.
- @kindex j D
- @pindex calc-sel-distribute
- The @kbd{j D} (@code{calc-sel-distribute}) command mixes the selected
- sum or product into the surrounding formula using the distributive
- law. For example, in @samp{a * (b - c)} with the @samp{b - c}
- selected, the result is @samp{a b - a c}. This also distributes
- products or quotients into surrounding powers, and can also do
- transformations like @samp{exp(a + b)} to @samp{exp(a) exp(b)},
- where @samp{a + b} is the selected term, and @samp{ln(a ^ b)}
- to @samp{ln(a) b}, where @samp{a ^ b} is the selected term.
- For multiple-term sums or products, @kbd{j D} takes off one term
- at a time: @samp{a * (b + c - d)} goes to @samp{a * (c - d) + a b}
- with the @samp{c - d} selected so that you can type @kbd{j D}
- repeatedly to expand completely. The @kbd{j D} command allows a
- numeric prefix argument which specifies the maximum number of
- times to expand at once; the default is one time only.
- @vindex DistribRules
- The @kbd{j D} command is implemented using rewrite rules.
- @xref{Selections with Rewrite Rules}. The rules are stored in
- the Calc variable @code{DistribRules}. A convenient way to view
- these rules is to use @kbd{s e} (@code{calc-edit-variable}) which
- displays and edits the stored value of a variable. Press @kbd{M-# M-#}
- to return from editing mode; be careful not to make any actual changes
- or else you will affect the behavior of future @kbd{j D} commands!
- To extend @kbd{j D} to handle new cases, just edit @code{DistribRules}
- as described above. You can then use the @kbd{s p} command to save
- this variable's value permanently for future Calc sessions.
- @xref{Operations on Variables}.
- @kindex j M
- @pindex calc-sel-merge
- @vindex MergeRules
- The @kbd{j M} (@code{calc-sel-merge}) command is the complement
- of @kbd{j D}; given @samp{a b - a c} with either @samp{a b} or
- @samp{a c} selected, the result is @samp{a * (b - c)}. Once
- again, @kbd{j M} can also merge calls to functions like @code{exp}
- and @code{ln}; examine the variable @code{MergeRules} to see all
- the relevant rules.
- @kindex j C
- @pindex calc-sel-commute
- @vindex CommuteRules
- The @kbd{j C} (@code{calc-sel-commute}) command swaps the arguments
- of the selected sum, product, or equation. It always behaves as
- if @kbd{j b} mode were in effect, i.e., the sum @samp{a + b + c} is
- treated as the nested sums @samp{(a + b) + c} by this command.
- If you put the cursor on the first @samp{+}, the result is
- @samp{(b + a) + c}; if you put the cursor on the second @samp{+}, the
- result is @samp{c + (a + b)} (which the default simplifications
- will rearrange to @samp{(c + a) + b}). The relevant rules are stored
- in the variable @code{CommuteRules}.
- You may need to turn default simplifications off (with the @kbd{m O}
- command) in order to get the full benefit of @kbd{j C}. For example,
- commuting @samp{a - b} produces @samp{-b + a}, but the default
- simplifications will ``simplify'' this right back to @samp{a - b} if
- you don't turn them off. The same is true of some of the other
- manipulations described in this section.
- @kindex j N
- @pindex calc-sel-negate
- @vindex NegateRules
- The @kbd{j N} (@code{calc-sel-negate}) command replaces the selected
- term with the negative of that term, then adjusts the surrounding
- formula in order to preserve the meaning. For example, given
- @samp{exp(a - b)} where @samp{a - b} is selected, the result is
- @samp{1 / exp(b - a)}. By contrast, selecting a term and using the
- regular @kbd{n} (@code{calc-change-sign}) command negates the
- term without adjusting the surroundings, thus changing the meaning
- of the formula as a whole. The rules variable is @code{NegateRules}.
- @kindex j &
- @pindex calc-sel-invert
- @vindex InvertRules
- The @kbd{j &} (@code{calc-sel-invert}) command is similar to @kbd{j N}
- except it takes the reciprocal of the selected term. For example,
- given @samp{a - ln(b)} with @samp{b} selected, the result is
- @samp{a + ln(1/b)}. The rules variable is @code{InvertRules}.
- @kindex j E
- @pindex calc-sel-jump-equals
- @vindex JumpRules
- The @kbd{j E} (@code{calc-sel-jump-equals}) command moves the
- selected term from one side of an equation to the other. Given
- @samp{a + b = c + d} with @samp{c} selected, the result is
- @samp{a + b - c = d}. This command also works if the selected
- term is part of a @samp{*}, @samp{/}, or @samp{^} formula. The
- relevant rules variable is @code{JumpRules}.
- @kindex j I
- @kindex H j I
- @pindex calc-sel-isolate
- The @kbd{j I} (@code{calc-sel-isolate}) command isolates the
- selected term on its side of an equation. It uses the @kbd{a S}
- (@code{calc-solve-for}) command to solve the equation, and the
- Hyperbolic flag affects it in the same way. @xref{Solving Equations}.
- When it applies, @kbd{j I} is often easier to use than @kbd{j E}.
- It understands more rules of algebra, and works for inequalities
- as well as equations.
- @kindex j *
- @kindex j /
- @pindex calc-sel-mult-both-sides
- @pindex calc-sel-div-both-sides
- The @kbd{j *} (@code{calc-sel-mult-both-sides}) command prompts for a
- formula using algebraic entry, then multiplies both sides of the
- selected quotient or equation by that formula. It simplifies each
- side with @kbd{a s} (@code{calc-simplify}) before re-forming the
- quotient or equation. You can suppress this simplification by
- providing any numeric prefix argument. There is also a @kbd{j /}
- (@code{calc-sel-div-both-sides}) which is similar to @kbd{j *} but
- dividing instead of multiplying by the factor you enter.
- As a special feature, if the numerator of the quotient is 1, then
- the denominator is expanded at the top level using the distributive
- law (i.e., using the @kbd{C-u -1 a x} command). Suppose the
- formula on the stack is @samp{1 / (sqrt(a) + 1)}, and you wish
- to eliminate the square root in the denominator by multiplying both
- sides by @samp{sqrt(a) - 1}. Calc's default simplifications would
- change the result @samp{(sqrt(a) - 1) / (sqrt(a) - 1) (sqrt(a) + 1)}
- right back to the original form by cancellation; Calc expands the
- denominator to @samp{sqrt(a) (sqrt(a) - 1) + sqrt(a) - 1} to prevent
- this. (You would now want to use an @kbd{a x} command to expand
- the rest of the way, whereupon the denominator would cancel out to
- the desired form, @samp{a - 1}.) When the numerator is not 1, this
- initial expansion is not necessary because Calc's default
- simplifications will not notice the potential cancellation.
- If the selection is an inequality, @kbd{j *} and @kbd{j /} will
- accept any factor, but will warn unless they can prove the factor
- is either positive or negative. (In the latter case the direction
- of the inequality will be switched appropriately.) @xref{Declarations},
- for ways to inform Calc that a given variable is positive or
- negative. If Calc can't tell for sure what the sign of the factor
- will be, it will assume it is positive and display a warning
- message.
- For selections that are not quotients, equations, or inequalities,
- these commands pull out a multiplicative factor: They divide (or
- multiply) by the entered formula, simplify, then multiply (or divide)
- back by the formula.
- @kindex j +
- @kindex j -
- @pindex calc-sel-add-both-sides
- @pindex calc-sel-sub-both-sides
- The @kbd{j +} (@code{calc-sel-add-both-sides}) and @kbd{j -}
- (@code{calc-sel-sub-both-sides}) commands analogously add to or
- subtract from both sides of an equation or inequality. For other
- types of selections, they extract an additive factor. A numeric
- prefix argument suppresses simplification of the intermediate
- results.
- @kindex j U
- @pindex calc-sel-unpack
- The @kbd{j U} (@code{calc-sel-unpack}) command replaces the
- selected function call with its argument. For example, given
- @samp{a + sin(x^2)} with @samp{sin(x^2)} selected, the result
- is @samp{a + x^2}. (The @samp{x^2} will remain selected; if you
- wanted to change the @code{sin} to @code{cos}, just press @kbd{C}
- now to take the cosine of the selected part.)
- @kindex j v
- @pindex calc-sel-evaluate
- The @kbd{j v} (@code{calc-sel-evaluate}) command performs the
- normal default simplifications on the selected sub-formula.
- These are the simplifications that are normally done automatically
- on all results, but which may have been partially inhibited by
- previous selection-related operations, or turned off altogether
- by the @kbd{m O} command. This command is just an auto-selecting
- version of the @w{@kbd{a v}} command (@pxref{Algebraic Manipulation}).
- With a numeric prefix argument of 2, @kbd{C-u 2 j v} applies
- the @kbd{a s} (@code{calc-simplify}) command to the selected
- sub-formula. With a prefix argument of 3 or more, e.g., @kbd{C-u j v}
- applies the @kbd{a e} (@code{calc-simplify-extended}) command.
- @xref{Simplifying Formulas}. With a negative prefix argument
- it simplifies at the top level only, just as with @kbd{a v}.
- Here the ``top'' level refers to the top level of the selected
- sub-formula.
- @kindex j "
- @pindex calc-sel-expand-formula
- The @kbd{j "} (@code{calc-sel-expand-formula}) command is to @kbd{a "}
- (@pxref{Algebraic Manipulation}) what @kbd{j v} is to @kbd{a v}.
- You can use the @kbd{j r} (@code{calc-rewrite-selection}) command
- to define other algebraic operations on sub-formulas. @xref{Rewrite Rules}.
- @node Algebraic Manipulation, Simplifying Formulas, Selecting Subformulas, Algebra
- @section Algebraic Manipulation
- @noindent
- The commands in this section perform general-purpose algebraic
- manipulations. They work on the whole formula at the top of the
- stack (unless, of course, you have made a selection in that
- formula).
- Many algebra commands prompt for a variable name or formula. If you
- answer the prompt with a blank line, the variable or formula is taken
- from top-of-stack, and the normal argument for the command is taken
- from the second-to-top stack level.
- @kindex a v
- @pindex calc-alg-evaluate
- The @kbd{a v} (@code{calc-alg-evaluate}) command performs the normal
- default simplifications on a formula; for example, @samp{a - -b} is
- changed to @samp{a + b}. These simplifications are normally done
- automatically on all Calc results, so this command is useful only if
- you have turned default simplifications off with an @kbd{m O}
- command. @xref{Simplification Modes}.
- It is often more convenient to type @kbd{=}, which is like @kbd{a v}
- but which also substitutes stored values for variables in the formula.
- Use @kbd{a v} if you want the variables to ignore their stored values.
- If you give a numeric prefix argument of 2 to @kbd{a v}, it simplifies
- as if in algebraic simplification mode. This is equivalent to typing
- @kbd{a s}; @pxref{Simplifying Formulas}. If you give a numeric prefix
- of 3 or more, it uses extended simplification mode (@kbd{a e}).
- If you give a negative prefix argument @i{-1}, @i{-2}, or @i{-3},
- it simplifies in the corresponding mode but only works on the top-level
- function call of the formula. For example, @samp{(2 + 3) * (2 + 3)} will
- simplify to @samp{(2 + 3)^2}, without simplifying the sub-formulas
- @samp{2 + 3}. As another example, typing @kbd{V R +} to sum the vector
- @samp{[1, 2, 3, 4]} produces the formula @samp{reduce(add, [1, 2, 3, 4])}
- in no-simplify mode. Using @kbd{a v} will evaluate this all the way to
- 10; using @kbd{C-u - a v} will evaluate it only to @samp{1 + 2 + 3 + 4}.
- (@xref{Reducing and Mapping}.)
- @tindex evalv
- @tindex evalvn
- The @kbd{=} command corresponds to the @code{evalv} function, and
- the related @kbd{N} command, which is like @kbd{=} but temporarily
- disables symbolic (@kbd{m s}) mode during the evaluation, corresponds
- to the @code{evalvn} function. (These commands interpret their prefix
- arguments differently than @kbd{a v}; @kbd{=} treats the prefix as
- the number of stack elements to evaluate at once, and @kbd{N} treats
- it as a temporary different working precision.)
- The @code{evalvn} function can take an alternate working precision
- as an optional second argument. This argument can be either an
- integer, to set the precision absolutely, or a vector containing
- a single integer, to adjust the precision relative to the current
- precision. Note that @code{evalvn} with a larger than current
- precision will do the calculation at this higher precision, but the
- result will as usual be rounded back down to the current precision
- afterward. For example, @samp{evalvn(pi - 3.1415)} at a precision
- of 12 will return @samp{9.265359e-5}; @samp{evalvn(pi - 3.1415, 30)}
- will return @samp{9.26535897932e-5} (computing a 25-digit result which
- is then rounded down to 12); and @samp{evalvn(pi - 3.1415, [-2])}
- will return @samp{9.2654e-5}.
- @kindex a "
- @pindex calc-expand-formula
- The @kbd{a "} (@code{calc-expand-formula}) command expands functions
- into their defining formulas wherever possible. For example,
- @samp{deg(x^2)} is changed to @samp{180 x^2 / pi}. Most functions,
- like @code{sin} and @code{gcd}, are not defined by simple formulas
- and so are unaffected by this command. One important class of
- functions which @emph{can} be expanded is the user-defined functions
- created by the @kbd{Z F} command. @xref{Algebraic Definitions}.
- Other functions which @kbd{a "} can expand include the probability
- distribution functions, most of the financial functions, and the
- hyperbolic and inverse hyperbolic functions. A numeric prefix argument
- affects @kbd{a "} in the same way as it does @kbd{a v}: A positive
- argument expands all functions in the formula and then simplifies in
- various ways; a negative argument expands and simplifies only the
- top-level function call.
- @kindex a M
- @pindex calc-map-equation
- @tindex mapeq
- The @kbd{a M} (@code{calc-map-equation}) [@code{mapeq}] command applies
- a given function or operator to one or more equations. It is analogous
- to @kbd{V M}, which operates on vectors instead of equations.
- @pxref{Reducing and Mapping}. For example, @kbd{a M S} changes
- @samp{x = y+1} to @samp{sin(x) = sin(y+1)}, and @kbd{a M +} with
- @samp{x = y+1} and @cite{6} on the stack produces @samp{x+6 = y+7}.
- With two equations on the stack, @kbd{a M +} would add the lefthand
- sides together and the righthand sides together to get the two
- respective sides of a new equation.
- Mapping also works on inequalities. Mapping two similar inequalities
- produces another inequality of the same type. Mapping an inequality
- with an equation produces an inequality of the same type. Mapping a
- @samp{<=} with a @samp{<} or @samp{!=} (not-equal) produces a @samp{<}.
- If inequalities with opposite direction (e.g., @samp{<} and @samp{>})
- are mapped, the direction of the second inequality is reversed to
- match the first: Using @kbd{a M +} on @samp{a < b} and @samp{a > 2}
- reverses the latter to get @samp{2 < a}, which then allows the
- combination @samp{a + 2 < b + a}, which the @kbd{a s} command can
- then simplify to get @samp{2 < b}.
- Using @kbd{a M *}, @kbd{a M /}, @kbd{a M n}, or @kbd{a M &} to negate
- or invert an inequality will reverse the direction of the inequality.
- Other adjustments to inequalities are @emph{not} done automatically;
- @kbd{a M S} will change @w{@samp{x < y}} to @samp{sin(x) < sin(y)} even
- though this is not true for all values of the variables.
- @kindex H a M
- @tindex mapeqp
- With the Hyperbolic flag, @kbd{H a M} [@code{mapeqp}] does a plain
- mapping operation without reversing the direction of any inequalities.
- Thus, @kbd{H a M &} would change @kbd{x > 2} to @kbd{1/x > 0.5}.
- (This change is mathematically incorrect, but perhaps you were
- fixing an inequality which was already incorrect.)
- @kindex I a M
- @tindex mapeqr
- With the Inverse flag, @kbd{I a M} [@code{mapeqr}] always reverses
- the direction of the inequality. You might use @kbd{I a M C} to
- change @samp{x < y} to @samp{cos(x) > cos(y)} if you know you are
- working with small positive angles.
- @kindex a b
- @pindex calc-substitute
- @tindex subst
- The @kbd{a b} (@code{calc-substitute}) [@code{subst}] command substitutes
- all occurrences
- of some variable or sub-expression of an expression with a new
- sub-expression. For example, substituting @samp{sin(x)} with @samp{cos(y)}
- in @samp{2 sin(x)^2 + x sin(x) + sin(2 x)} produces
- @samp{2 cos(y)^2 + x cos(y) + @w{sin(2 x)}}.
- Note that this is a purely structural substitution; the lone @samp{x} and
- the @samp{sin(2 x)} stayed the same because they did not look like
- @samp{sin(x)}. @xref{Rewrite Rules}, for a more general method for
- doing substitutions.@refill
- The @kbd{a b} command normally prompts for two formulas, the old
- one and the new one. If you enter a blank line for the first
- prompt, all three arguments are taken from the stack (new, then old,
- then target expression). If you type an old formula but then enter a
- blank line for the new one, the new formula is taken from top-of-stack
- and the target from second-to-top. If you answer both prompts, the
- target is taken from top-of-stack as usual.
- Note that @kbd{a b} has no understanding of commutativity or
- associativity. The pattern @samp{x+y} will not match the formula
- @samp{y+x}. Also, @samp{y+z} will not match inside the formula @samp{x+y+z}
- because the @samp{+} operator is left-associative, so the ``deep
- structure'' of that formula is @samp{(x+y) + z}. Use @kbd{d U}
- (@code{calc-unformatted-language}) mode to see the true structure of
- a formula. The rewrite rule mechanism, discussed later, does not have
- these limitations.
- As an algebraic function, @code{subst} takes three arguments:
- Target expression, old, new. Note that @code{subst} is always
- evaluated immediately, even if its arguments are variables, so if
- you wish to put a call to @code{subst} onto the stack you must
- turn the default simplifications off first (with @kbd{m O}).
- @node Simplifying Formulas, Polynomials, Algebraic Manipulation, Algebra
- @section Simplifying Formulas
- @noindent
- @kindex a s
- @pindex calc-simplify
- @tindex simplify
- The @kbd{a s} (@code{calc-simplify}) [@code{simplify}] command applies
- various algebraic rules to simplify a formula. This includes rules which
- are not part of the default simplifications because they may be too slow
- to apply all the time, or may not be desirable all of the time. For
- example, non-adjacent terms of sums are combined, as in @samp{a + b + 2 a}
- to @samp{b + 3 a}, and some formulas like @samp{sin(arcsin(x))} are
- simplified to @samp{x}.
- The sections below describe all the various kinds of algebraic
- simplifications Calc provides in full detail. None of Calc's
- simplification commands are designed to pull rabbits out of hats;
- they simply apply certain specific rules to put formulas into
- less redundant or more pleasing forms. Serious algebra in Calc
- must be done manually, usually with a combination of selections
- and rewrite rules. @xref{Rearranging with Selections}.
- @xref{Rewrite Rules}.
- @xref{Simplification Modes}, for commands to control what level of
- simplification occurs automatically. Normally only the ``default
- simplifications'' occur.
- @menu
- * Default Simplifications::
- * Algebraic Simplifications::
- * Unsafe Simplifications::
- * Simplification of Units::
- @end menu
- @node Default Simplifications, Algebraic Simplifications, Simplifying Formulas, Simplifying Formulas
- @subsection Default Simplifications
- @noindent
- @cindex Default simplifications
- This section describes the ``default simplifications,'' those which are
- normally applied to all results. For example, if you enter the variable
- @cite{x} on the stack twice and push @kbd{+}, Calc's default
- simplifications automatically change @cite{x + x} to @cite{2 x}.
- The @kbd{m O} command turns off the default simplifications, so that
- @cite{x + x} will remain in this form unless you give an explicit
- ``simplify'' command like @kbd{=} or @kbd{a v}. @xref{Algebraic
- Manipulation}. The @kbd{m D} command turns the default simplifications
- back on.
- The most basic default simplification is the evaluation of functions.
- For example, @cite{2 + 3} is evaluated to @cite{5}, and @cite{@t{sqrt}(9)}
- is evaluated to @cite{3}. Evaluation does not occur if the arguments
- to a function are somehow of the wrong type (@cite{@t{tan}([2,3,4])},
- range (@cite{@t{tan}(90)}), or number (@cite{@t{tan}(3,5)}), or if the
- function name is not recognized (@cite{@t{f}(5)}), or if ``symbolic''
- mode (@pxref{Symbolic Mode}) prevents evaluation (@cite{@t{sqrt}(2)}).
- Calc simplifies (evaluates) the arguments to a function before it
- simplifies the function itself. Thus @cite{@t{sqrt}(5+4)} is
- simplified to @cite{@t{sqrt}(9)} before the @code{sqrt} function
- itself is applied. There are very few exceptions to this rule:
- @code{quote}, @code{lambda}, and @code{condition} (the @code{::}
- operator) do not evaluate their arguments, @code{if} (the @code{? :}
- operator) does not evaluate all of its arguments, and @code{evalto}
- does not evaluate its lefthand argument.
- Most commands apply the default simplifications to all arguments they
- take from the stack, perform a particular operation, then simplify
- the result before pushing it back on the stack. In the common special
- case of regular arithmetic commands like @kbd{+} and @kbd{Q} [@code{sqrt}],
- the arguments are simply popped from the stack and collected into a
- suitable function call, which is then simplified (the arguments being
- simplified first as part of the process, as described above).
- The default simplifications are too numerous to describe completely
- here, but this section will describe the ones that apply to the
- major arithmetic operators. This list will be rather technical in
- nature, and will probably be interesting to you only if you are
- a serious user of Calc's algebra facilities.
- @tex
- \bigskip
- @end tex
- As well as the simplifications described here, if you have stored
- any rewrite rules in the variable @code{EvalRules} then these rules
- will also be applied before any built-in default simplifications.
- @xref{Automatic Rewrites}, for details.
- @tex
- \bigskip
- @end tex
- And now, on with the default simplifications:
- Arithmetic operators like @kbd{+} and @kbd{*} always take two
- arguments in Calc's internal form. Sums and products of three or
- more terms are arranged by the associative law of algebra into
- a left-associative form for sums, @cite{((a + b) + c) + d}, and
- a right-associative form for products, @cite{a * (b * (c * d))}.
- Formulas like @cite{(a + b) + (c + d)} are rearranged to
- left-associative form, though this rarely matters since Calc's
- algebra commands are designed to hide the inner structure of
- sums and products as much as possible. Sums and products in
- their proper associative form will be written without parentheses
- in the examples below.
- Sums and products are @emph{not} rearranged according to the
- commutative law (@cite{a + b} to @cite{b + a}) except in a few
- special cases described below. Some algebra programs always
- rearrange terms into a canonical order, which enables them to
- see that @cite{a b + b a} can be simplified to @cite{2 a b}.
- Calc assumes you have put the terms into the order you want
- and generally leaves that order alone, with the consequence
- that formulas like the above will only be simplified if you
- explicitly give the @kbd{a s} command. @xref{Algebraic
- Simplifications}.
- Differences @cite{a - b} are treated like sums @cite{a + (-b)}
- for purposes of simplification; one of the default simplifications
- is to rewrite @cite{a + (-b)} or @cite{(-b) + a}, where @cite{-b}
- represents a ``negative-looking'' term, into @cite{a - b} form.
- ``Negative-looking'' means negative numbers, negated formulas like
- @cite{-x}, and products or quotients in which either term is
- negative-looking.
- Other simplifications involving negation are @cite{-(-x)} to @cite{x};
- @cite{-(a b)} or @cite{-(a/b)} where either @cite{a} or @cite{b} is
- negative-looking, simplified by negating that term, or else where
- @cite{a} or @cite{b} is any number, by negating that number;
- @cite{-(a + b)} to @cite{-a - b}, and @cite{-(b - a)} to @cite{a - b}.
- (This, and rewriting @cite{(-b) + a} to @cite{a - b}, are the only
- cases where the order of terms in a sum is changed by the default
- simplifications.)
- The distributive law is used to simplify sums in some cases:
- @cite{a x + b x} to @cite{(a + b) x}, where @cite{a} represents
- a number or an implicit 1 or @i{-1} (as in @cite{x} or @cite{-x})
- and similarly for @cite{b}. Use the @kbd{a c}, @w{@kbd{a f}}, or
- @kbd{j M} commands to merge sums with non-numeric coefficients
- using the distributive law.
- The distributive law is only used for sums of two terms, or
- for adjacent terms in a larger sum. Thus @cite{a + b + b + c}
- is simplified to @cite{a + 2 b + c}, but @cite{a + b + c + b}
- is not simplified. The reason is that comparing all terms of a
- sum with one another would require time proportional to the
- square of the number of terms; Calc relegates potentially slow
- operations like this to commands that have to be invoked
- explicitly, like @kbd{a s}.
- Finally, @cite{a + 0} and @cite{0 + a} are simplified to @cite{a}.
- A consequence of the above rules is that @cite{0 - a} is simplified
- to @cite{-a}.
- @tex
- \bigskip
- @end tex
- The products @cite{1 a} and @cite{a 1} are simplified to @cite{a};
- @cite{(-1) a} and @cite{a (-1)} are simplified to @cite{-a};
- @cite{0 a} and @cite{a 0} are simplified to @cite{0}, except that
- in matrix mode where @cite{a} is not provably scalar the result
- is the generic zero matrix @samp{idn(0)}, and that if @cite{a} is
- infinite the result is @samp{nan}.
- Also, @cite{(-a) b} and @cite{a (-b)} are simplified to @cite{-(a b)},
- where this occurs for negated formulas but not for regular negative
- numbers.
- Products are commuted only to move numbers to the front:
- @cite{a b 2} is commuted to @cite{2 a b}.
- The product @cite{a (b + c)} is distributed over the sum only if
- @cite{a} and at least one of @cite{b} and @cite{c} are numbers:
- @cite{2 (x + 3)} goes to @cite{2 x + 6}. The formula
- @cite{(-a) (b - c)}, where @cite{-a} is a negative number, is
- rewritten to @cite{a (c - b)}.
- The distributive law of products and powers is used for adjacent
- terms of the product: @cite{x^a x^b} goes to @c{$x^{a+b}$}
- @cite{x^(a+b)}
- where @cite{a} is a number, or an implicit 1 (as in @cite{x}),
- or the implicit one-half of @cite{@t{sqrt}(x)}, and similarly for
- @cite{b}. The result is written using @samp{sqrt} or @samp{1/sqrt}
- if the sum of the powers is @cite{1/2} or @cite{-1/2}, respectively.
- If the sum of the powers is zero, the product is simplified to
- @cite{1} or to @samp{idn(1)} if matrix mode is enabled.
- The product of a negative power times anything but another negative
- power is changed to use division: @c{$x^{-2} y$}
- @cite{x^(-2) y} goes to @cite{y / x^2} unless matrix mode is
- in effect and neither @cite{x} nor @cite{y} are scalar (in which
- case it is considered unsafe to rearrange the order of the terms).
- Finally, @cite{a (b/c)} is rewritten to @cite{(a b)/c}, and also
- @cite{(a/b) c} is changed to @cite{(a c)/b} unless in matrix mode.
- @tex
- \bigskip
- @end tex
- Simplifications for quotients are analogous to those for products.
- The quotient @cite{0 / x} is simplified to @cite{0}, with the same
- exceptions that were noted for @cite{0 x}. Likewise, @cite{x / 1}
- and @cite{x / (-1)} are simplified to @cite{x} and @cite{-x},
- respectively.
- The quotient @cite{x / 0} is left unsimplified or changed to an
- infinite quantity, as directed by the current infinite mode.
- @xref{Infinite Mode}.
- The expression @c{$a / b^{-c}$}
- @cite{a / b^(-c)} is changed to @cite{a b^c},
- where @cite{-c} is any negative-looking power. Also, @cite{1 / b^c}
- is changed to @c{$b^{-c}$}
- @cite{b^(-c)} for any power @cite{c}.
- Also, @cite{(-a) / b} and @cite{a / (-b)} go to @cite{-(a/b)};
- @cite{(a/b) / c} goes to @cite{a / (b c)}; and @cite{a / (b/c)}
- goes to @cite{(a c) / b} unless matrix mode prevents this
- rearrangement. Similarly, @cite{a / (b:c)} is simplified to
- @cite{(c:b) a} for any fraction @cite{b:c}.
- The distributive law is applied to @cite{(a + b) / c} only if
- @cite{c} and at least one of @cite{a} and @cite{b} are numbers.
- Quotients of powers and square roots are distributed just as
- described for multiplication.
- Quotients of products cancel only in the leading terms of the
- numerator and denominator. In other words, @cite{a x b / a y b}
- is cancelled to @cite{x b / y b} but not to @cite{x / y}. Once
- again this is because full cancellation can be slow; use @kbd{a s}
- to cancel all terms of the quotient.
- Quotients of negative-looking values are simplified according
- to @cite{(-a) / (-b)} to @cite{a / b}, @cite{(-a) / (b - c)}
- to @cite{a / (c - b)}, and @cite{(a - b) / (-c)} to @cite{(b - a) / c}.
- @tex
- \bigskip
- @end tex
- The formula @cite{x^0} is simplified to @cite{1}, or to @samp{idn(1)}
- in matrix mode. The formula @cite{0^x} is simplified to @cite{0}
- unless @cite{x} is a negative number or complex number, in which
- case the result is an infinity or an unsimplified formula according
- to the current infinite mode. Note that @cite{0^0} is an
- indeterminate form, as evidenced by the fact that the simplifications
- for @cite{x^0} and @cite{0^x} conflict when @cite{x=0}.
- Powers of products or quotients @cite{(a b)^c}, @cite{(a/b)^c}
- are distributed to @cite{a^c b^c}, @cite{a^c / b^c} only if @cite{c}
- is an integer, or if either @cite{a} or @cite{b} are nonnegative
- real numbers. Powers of powers @cite{(a^b)^c} are simplified to
- @c{$a^{b c}$}
- @cite{a^(b c)} only when @cite{c} is an integer and @cite{b c} also
- evaluates to an integer. Without these restrictions these simplifications
- would not be safe because of problems with principal values.
- (In other words, @c{$((-3)^{1/2})^2$}
- @cite{((-3)^1:2)^2} is safe to simplify, but
- @c{$((-3)^2)^{1/2}$}
- @cite{((-3)^2)^1:2} is not.) @xref{Declarations}, for ways to inform
- Calc that your variables satisfy these requirements.
- As a special case of this rule, @cite{@t{sqrt}(x)^n} is simplified to
- @c{$x^{n/2}$}
- @cite{x^(n/2)} only for even integers @cite{n}.
- If @cite{a} is known to be real, @cite{b} is an even integer, and
- @cite{c} is a half- or quarter-integer, then @cite{(a^b)^c} is
- simplified to @c{$@t{abs}(a^{b c})$}
- @cite{@t{abs}(a^(b c))}.
- Also, @cite{(-a)^b} is simplified to @cite{a^b} if @cite{b} is an
- even integer, or to @cite{-(a^b)} if @cite{b} is an odd integer,
- for any negative-looking expression @cite{-a}.
- Square roots @cite{@t{sqrt}(x)} generally act like one-half powers
- @c{$x^{1:2}$}
- @cite{x^1:2} for the purposes of the above-listed simplifications.
- Also, note that @c{$1 / x^{1:2}$}
- @cite{1 / x^1:2} is changed to @c{$x^{-1:2}$}
- @cite{x^(-1:2)},
- but @cite{1 / @t{sqrt}(x)} is left alone.
- @tex
- \bigskip
- @end tex
- Generic identity matrices (@pxref{Matrix Mode}) are simplified by the
- following rules: @cite{@t{idn}(a) + b} to @cite{a + b} if @cite{b}
- is provably scalar, or expanded out if @cite{b} is a matrix;
- @cite{@t{idn}(a) + @t{idn}(b)} to @cite{@t{idn}(a + b)};
- @cite{-@t{idn}(a)} to @cite{@t{idn}(-a)}; @cite{a @t{idn}(b)} to
- @cite{@t{idn}(a b)} if @cite{a} is provably scalar, or to @cite{a b}
- if @cite{a} is provably non-scalar; @cite{@t{idn}(a) @t{idn}(b)}
- to @cite{@t{idn}(a b)}; analogous simplifications for quotients
- involving @code{idn}; and @cite{@t{idn}(a)^n} to @cite{@t{idn}(a^n)}
- where @cite{n} is an integer.
- @tex
- \bigskip
- @end tex
- The @code{floor} function and other integer truncation functions
- vanish if the argument is provably integer-valued, so that
- @cite{@t{floor}(@t{round}(x))} simplifies to @cite{@t{round}(x)}.
- Also, combinations of @code{float}, @code{floor} and its friends,
- and @code{ffloor} and its friends, are simplified in appropriate
- ways. @xref{Integer Truncation}.
- The expression @cite{@t{abs}(-x)} changes to @cite{@t{abs}(x)}.
- The expression @cite{@t{abs}(@t{abs}(x))} changes to @cite{@t{abs}(x)};
- in fact, @cite{@t{abs}(x)} changes to @cite{x} or @cite{-x} if @cite{x}
- is provably nonnegative or nonpositive (@pxref{Declarations}).
- While most functions do not recognize the variable @code{i} as an
- imaginary number, the @code{arg} function does handle the two cases
- @cite{@t{arg}(@t{i})} and @cite{@t{arg}(-@t{i})} just for convenience.
- The expression @cite{@t{conj}(@t{conj}(x))} simplifies to @cite{x}.
- Various other expressions involving @code{conj}, @code{re}, and
- @code{im} are simplified, especially if some of the arguments are
- provably real or involve the constant @code{i}. For example,
- @cite{@t{conj}(a + b i)} is changed to @cite{@t{conj}(a) - @t{conj}(b) i},
- or to @cite{a - b i} if @cite{a} and @cite{b} are known to be real.
- Functions like @code{sin} and @code{arctan} generally don't have
- any default simplifications beyond simply evaluating the functions
- for suitable numeric arguments and infinity. The @kbd{a s} command
- described in the next section does provide some simplifications for
- these functions, though.
- One important simplification that does occur is that @cite{@t{ln}(@t{e})}
- is simplified to 1, and @cite{@t{ln}(@t{e}^x)} is simplified to @cite{x}
- for any @cite{x}. This occurs even if you have stored a different
- value in the Calc variable @samp{e}; but this would be a bad idea
- in any case if you were also using natural logarithms!
- Among the logical functions, @t{(@var{a} <= @var{b})} changes to
- @t{@var{a} > @var{b}} and so on. Equations and inequalities where both sides
- are either negative-looking or zero are simplified by negating both sides
- and reversing the inequality. While it might seem reasonable to simplify
- @cite{!!x} to @cite{x}, this would not be valid in general because
- @cite{!!2} is 1, not 2.
- Most other Calc functions have few if any default simplifications
- defined, aside of course from evaluation when the arguments are
- suitable numbers.
- @node Algebraic Simplifications, Unsafe Simplifications, Default Simplifications, Simplifying Formulas
- @subsection Algebraic Simplifications
- @noindent
- @cindex Algebraic simplifications
- The @kbd{a s} command makes simplifications that may be too slow to
- do all the time, or that may not be desirable all of the time.
- If you find these simplifications are worthwhile, you can type
- @kbd{m A} to have Calc apply them automatically.
- This section describes all simplifications that are performed by
- the @kbd{a s} command. Note that these occur in addition to the
- default simplifications; even if the default simplifications have
- been turned off by an @kbd{m O} command, @kbd{a s} will turn them
- back on temporarily while it simplifies the formula.
- There is a variable, @code{AlgSimpRules}, in which you can put rewrites
- to be applied by @kbd{a s}. Its use is analogous to @code{EvalRules},
- but without the special restrictions. Basically, the simplifier does
- @samp{@w{a r} AlgSimpRules} with an infinite repeat count on the whole
- expression being simplified, then it traverses the expression applying
- the built-in rules described below. If the result is different from
- the original expression, the process repeats with the default
- simplifications (including @code{EvalRules}), then @code{AlgSimpRules},
- then the built-in simplifications, and so on.
- @tex
- \bigskip
- @end tex
- Sums are simplified in two ways. Constant terms are commuted to the
- end of the sum, so that @cite{a + 2 + b} changes to @cite{a + b + 2}.
- The only exception is that a constant will not be commuted away
- from the first position of a difference, i.e., @cite{2 - x} is not
- commuted to @cite{-x + 2}.
- Also, terms of sums are combined by the distributive law, as in
- @cite{x + y + 2 x} to @cite{y + 3 x}. This always occurs for
- adjacent terms, but @kbd{a s} compares all pairs of terms including
- non-adjacent ones.
- @tex
- \bigskip
- @end tex
- Products are sorted into a canonical order using the commutative
- law. For example, @cite{b c a} is commuted to @cite{a b c}.
- This allows easier comparison of products; for example, the default
- simplifications will not change @cite{x y + y x} to @cite{2 x y},
- but @kbd{a s} will; it first rewrites the sum to @cite{x y + x y},
- and then the default simplifications are able to recognize a sum
- of identical terms.
- The canonical ordering used to sort terms of products has the
- property that real-valued numbers, interval forms and infinities
- come first, and are sorted into increasing order. The @kbd{V S}
- command uses the same ordering when sorting a vector.
- Sorting of terms of products is inhibited when matrix mode is
- turned on; in this case, Calc will never exchange the order of
- two terms unless it knows at least one of the terms is a scalar.
- Products of powers are distributed by comparing all pairs of
- terms, using the same method that the default simplifications
- use for adjacent terms of products.
- Even though sums are not sorted, the commutative law is still
- taken into account when terms of a product are being compared.
- Thus @cite{(x + y) (y + x)} will be simplified to @cite{(x + y)^2}.
- A subtle point is that @cite{(x - y) (y - x)} will @emph{not}
- be simplified to @cite{-(x - y)^2}; Calc does not notice that
- one term can be written as a constant times the other, even if
- that constant is @i{-1}.
- A fraction times any expression, @cite{(a:b) x}, is changed to
- a quotient involving integers: @cite{a x / b}. This is not
- done for floating-point numbers like @cite{0.5}, however. This
- is one reason why you may find it convenient to turn Fraction mode
- on while doing algebra; @pxref{Fraction Mode}.
- @tex
- \bigskip
- @end tex
- Quotients are simplified by comparing all terms in the numerator
- with all terms in the denominator for possible cancellation using
- the distributive law. For example, @cite{a x^2 b / c x^3 d} will
- cancel @cite{x^2} from both sides to get @cite{a b / c x d}.
- (The terms in the denominator will then be rearranged to @cite{c d x}
- as described above.) If there is any common integer or fractional
- factor in the numerator and denominator, it is cancelled out;
- for example, @cite{(4 x + 6) / 8 x} simplifies to @cite{(2 x + 3) / 4 x}.
- Non-constant common factors are not found even by @kbd{a s}. To
- cancel the factor @cite{a} in @cite{(a x + a) / a^2} you could first
- use @kbd{j M} on the product @cite{a x} to Merge the numerator to
- @cite{a (1+x)}, which can then be simplified successfully.
- @tex
- \bigskip
- @end tex
- Integer powers of the variable @code{i} are simplified according
- to the identity @cite{i^2 = -1}. If you store a new value other
- than the complex number @cite{(0,1)} in @code{i}, this simplification
- will no longer occur. This is done by @kbd{a s} instead of by default
- in case someone (unwisely) uses the name @code{i} for a variable
- unrelated to complex numbers; it would be unfortunate if Calc
- quietly and automatically changed this formula for reasons the
- user might not have been thinking of.
- Square roots of integer or rational arguments are simplified in
- several ways. (Note that these will be left unevaluated only in
- Symbolic mode.) First, square integer or rational factors are
- pulled out so that @cite{@t{sqrt}(8)} is rewritten as
- @c{$2\,\t{sqrt}(2)$}
- @cite{2 sqrt(2)}. Conceptually speaking this implies factoring
- the argument into primes and moving pairs of primes out of the
- square root, but for reasons of efficiency Calc only looks for
- primes up to 29.
- Square roots in the denominator of a quotient are moved to the
- numerator: @cite{1 / @t{sqrt}(3)} changes to @cite{@t{sqrt}(3) / 3}.
- The same effect occurs for the square root of a fraction:
- @cite{@t{sqrt}(2:3)} changes to @cite{@t{sqrt}(6) / 3}.
- @tex
- \bigskip
- @end tex
- The @code{%} (modulo) operator is simplified in several ways
- when the modulus @cite{M} is a positive real number. First, if
- the argument is of the form @cite{x + n} for some real number
- @cite{n}, then @cite{n} is itself reduced modulo @cite{M}. For
- example, @samp{(x - 23) % 10} is simplified to @samp{(x + 7) % 10}.
- If the argument is multiplied by a constant, and this constant
- has a common integer divisor with the modulus, then this factor is
- cancelled out. For example, @samp{12 x % 15} is changed to
- @samp{3 (4 x % 5)} by factoring out 3. Also, @samp{(12 x + 1) % 15}
- is changed to @samp{3 ((4 x + 1:3) % 5)}. While these forms may
- not seem ``simpler,'' they allow Calc to discover useful information
- about modulo forms in the presence of declarations.
- If the modulus is 1, then Calc can use @code{int} declarations to
- evaluate the expression. For example, the idiom @samp{x % 2} is
- often used to check whether a number is odd or even. As described
- above, @w{@samp{2 n % 2}} and @samp{(2 n + 1) % 2} are simplified to
- @samp{2 (n % 1)} and @samp{2 ((n + 1:2) % 1)}, respectively; Calc
- can simplify these to 0 and 1 (respectively) if @code{n} has been
- declared to be an integer.
- @tex
- \bigskip
- @end tex
- Trigonometric functions are simplified in several ways. First,
- @cite{@t{sin}(@t{arcsin}(x))} is simplified to @cite{x}, and
- similarly for @code{cos} and @code{tan}. If the argument to
- @code{sin} is negative-looking, it is simplified to @cite{-@t{sin}(x)},
- and similarly for @code{cos} and @code{tan}. Finally, certain
- special values of the argument are recognized;
- @pxref{Trigonometric and Hyperbolic Functions}.
- Trigonometric functions of inverses of different trigonometric
- functions can also be simplified, as in @cite{@t{sin}(@t{arccos}(x))}
- to @cite{@t{sqrt}(1 - x^2)}.
- Hyperbolic functions of their inverses and of negative-looking
- arguments are also handled, as are exponentials of inverse
- hyperbolic functions.
- No simplifications for inverse trigonometric and hyperbolic
- functions are known, except for negative arguments of @code{arcsin},
- @code{arctan}, @code{arcsinh}, and @code{arctanh}. Note that
- @cite{@t{arcsin}(@t{sin}(x))} can @emph{not} safely change to
- @cite{x}, since this only correct within an integer multiple
- of @c{$2 \pi$}
- @cite{2 pi} radians or 360 degrees. However,
- @cite{@t{arcsinh}(@t{sinh}(x))} is simplified to @cite{x} if
- @cite{x} is known to be real.
- Several simplifications that apply to logarithms and exponentials
- are that @cite{@t{exp}(@t{ln}(x))}, @c{$@t{e}^{\ln(x)}$}
- @cite{e^@t{ln}(x)}, and
- @c{$10^{{\rm log10}(x)}$}
- @cite{10^@t{log10}(x)} all reduce to @cite{x}.
- Also, @cite{@t{ln}(@t{exp}(x))}, etc., can reduce to @cite{x} if
- @cite{x} is provably real. The form @cite{@t{exp}(x)^y} is simplified
- to @cite{@t{exp}(x y)}. If @cite{x} is a suitable multiple of @c{$\pi i$}
- @cite{pi i}
- (as described above for the trigonometric functions), then @cite{@t{exp}(x)}
- or @cite{e^x} will be expanded. Finally, @cite{@t{ln}(x)} is simplified
- to a form involving @code{pi} and @code{i} where @cite{x} is provably
- negative, positive imaginary, or negative imaginary.
- The error functions @code{erf} and @code{erfc} are simplified when
- their arguments are negative-looking or are calls to the @code{conj}
- function.
- @tex
- \bigskip
- @end tex
- Equations and inequalities are simplified by cancelling factors
- of products, quotients, or sums on both sides. Inequalities
- change sign if a negative multiplicative factor is cancelled.
- Non-constant multiplicative factors as in @cite{a b = a c} are
- cancelled from equations only if they are provably nonzero (generally
- because they were declared so; @pxref{Declarations}). Factors
- are cancelled from inequalities only if they are nonzero and their
- sign is known.
- Simplification also replaces an equation or inequality with
- 1 or 0 (``true'' or ``false'') if it can through the use of
- declarations. If @cite{x} is declared to be an integer greater
- than 5, then @cite{x < 3}, @cite{x = 3}, and @cite{x = 7.5} are
- all simplified to 0, but @cite{x > 3} is simplified to 1.
- By a similar analysis, @cite{abs(x) >= 0} is simplified to 1,
- as is @cite{x^2 >= 0} if @cite{x} is known to be real.
- @node Unsafe Simplifications, Simplification of Units, Algebraic Simplifications, Simplifying Formulas
- @subsection ``Unsafe'' Simplifications
- @noindent
- @cindex Unsafe simplifications
- @cindex Extended simplification
- @kindex a e
- @pindex calc-simplify-extended
- @ignore
- @mindex esimpl@idots
- @end ignore
- @tindex esimplify
- The @kbd{a e} (@code{calc-simplify-extended}) [@code{esimplify}] command
- is like @kbd{a s}
- except that it applies some additional simplifications which are not
- ``safe'' in all cases. Use this only if you know the values in your
- formula lie in the restricted ranges for which these simplifications
- are valid. The symbolic integrator uses @kbd{a e};
- one effect of this is that the integrator's results must be used with
- caution. Where an integral table will often attach conditions like
- ``for positive @cite{a} only,'' Calc (like most other symbolic
- integration programs) will simply produce an unqualified result.@refill
- Because @kbd{a e}'s simplifications are unsafe, it is sometimes better
- to type @kbd{C-u -3 a v}, which does extended simplification only
- on the top level of the formula without affecting the sub-formulas.
- In fact, @kbd{C-u -3 j v} allows you to target extended simplification
- to any specific part of a formula.
- The variable @code{ExtSimpRules} contains rewrites to be applied by
- the @kbd{a e} command. These are applied in addition to
- @code{EvalRules} and @code{AlgSimpRules}. (The @kbd{a r AlgSimpRules}
- step described above is simply followed by an @kbd{a r ExtSimpRules} step.)
- Following is a complete list of ``unsafe'' simplifications performed
- by @kbd{a e}.
- @tex
- \bigskip
- @end tex
- Inverse trigonometric or hyperbolic functions, called with their
- corresponding non-inverse functions as arguments, are simplified
- by @kbd{a e}. For example, @cite{@t{arcsin}(@t{sin}(x))} changes
- to @cite{x}. Also, @cite{@t{arcsin}(@t{cos}(x))} and
- @cite{@t{arccos}(@t{sin}(x))} both change to @cite{@t{pi}/2 - x}.
- These simplifications are unsafe because they are valid only for
- values of @cite{x} in a certain range; outside that range, values
- are folded down to the 360-degree range that the inverse trigonometric
- functions always produce.
- Powers of powers @cite{(x^a)^b} are simplified to @c{$x^{a b}$}
- @cite{x^(a b)}
- for all @cite{a} and @cite{b}. These results will be valid only
- in a restricted range of @cite{x}; for example, in @c{$(x^2)^{1:2}$}
- @cite{(x^2)^1:2}
- the powers cancel to get @cite{x}, which is valid for positive values
- of @cite{x} but not for negative or complex values.
- Similarly, @cite{@t{sqrt}(x^a)} and @cite{@t{sqrt}(x)^a} are both
- simplified (possibly unsafely) to @c{$x^{a/2}$}
- @cite{x^(a/2)}.
- Forms like @cite{@t{sqrt}(1 - @t{sin}(x)^2)} are simplified to, e.g.,
- @cite{@t{cos}(x)}. Calc has identities of this sort for @code{sin},
- @code{cos}, @code{tan}, @code{sinh}, and @code{cosh}.
- Arguments of square roots are partially factored to look for
- squared terms that can be extracted. For example,
- @cite{@t{sqrt}(a^2 b^3 + a^3 b^2)} simplifies to @cite{a b @t{sqrt}(a+b)}.
- The simplifications of @cite{@t{ln}(@t{exp}(x))}, @cite{@t{ln}(@t{e}^x)},
- and @cite{@t{log10}(10^x)} to @cite{x} are also unsafe because
- of problems with principal values (although these simplifications
- are safe if @cite{x} is known to be real).
- Common factors are cancelled from products on both sides of an
- equation, even if those factors may be zero: @cite{a x / b x}
- to @cite{a / b}. Such factors are never cancelled from
- inequalities: Even @kbd{a e} is not bold enough to reduce
- @cite{a x < b x} to @cite{a < b} (or @cite{a > b}, depending
- on whether you believe @cite{x} is positive or negative).
- The @kbd{a M /} command can be used to divide a factor out of
- both sides of an inequality.
- @node Simplification of Units, , Unsafe Simplifications, Simplifying Formulas
- @subsection Simplification of Units
- @noindent
- The simplifications described in this section are applied by the
- @kbd{u s} (@code{calc-simplify-units}) command. These are in addition
- to the regular @kbd{a s} (but not @kbd{a e}) simplifications described
- earlier. @xref{Basic Operations on Units}.
- The variable @code{UnitSimpRules} contains rewrites to be applied by
- the @kbd{u s} command. These are applied in addition to @code{EvalRules}
- and @code{AlgSimpRules}.
- Scalar mode is automatically put into effect when simplifying units.
- @xref{Matrix Mode}.
- Sums @cite{a + b} involving units are simplified by extracting the
- units of @cite{a} as if by the @kbd{u x} command (call the result
- @cite{u_a}), then simplifying the expression @cite{b / u_a}
- using @kbd{u b} and @kbd{u s}. If the result has units then the sum
- is inconsistent and is left alone. Otherwise, it is rewritten
- in terms of the units @cite{u_a}.
- If units auto-ranging mode is enabled, products or quotients in
- which the first argument is a number which is out of range for the
- leading unit are modified accordingly.
- When cancelling and combining units in products and quotients,
- Calc accounts for unit names that differ only in the prefix letter.
- For example, @samp{2 km m} is simplified to @samp{2000 m^2}.
- However, compatible but different units like @code{ft} and @code{in}
- are not combined in this way.
- Quotients @cite{a / b} are simplified in three additional ways. First,
- if @cite{b} is a number or a product beginning with a number, Calc
- computes the reciprocal of this number and moves it to the numerator.
- Second, for each pair of unit names from the numerator and denominator
- of a quotient, if the units are compatible (e.g., they are both
- units of area) then they are replaced by the ratio between those
- units. For example, in @samp{3 s in N / kg cm} the units
- @samp{in / cm} will be replaced by @cite{2.54}.
- Third, if the units in the quotient exactly cancel out, so that
- a @kbd{u b} command on the quotient would produce a dimensionless
- number for an answer, then the quotient simplifies to that number.
- For powers and square roots, the ``unsafe'' simplifications
- @cite{(a b)^c} to @cite{a^c b^c}, @cite{(a/b)^c} to @cite{a^c / b^c},
- and @cite{(a^b)^c} to @c{$a^{b c}$}
- @cite{a^(b c)} are done if the powers are
- real numbers. (These are safe in the context of units because
- all numbers involved can reasonably be assumed to be real.)
- Also, if a unit name is raised to a fractional power, and the
- base units in that unit name all occur to powers which are a
- multiple of the denominator of the power, then the unit name
- is expanded out into its base units, which can then be simplified
- according to the previous paragraph. For example, @samp{acre^1.5}
- is simplified by noting that @cite{1.5 = 3:2}, that @samp{acre}
- is defined in terms of @samp{m^2}, and that the 2 in the power of
- @code{m} is a multiple of 2 in @cite{3:2}. Thus, @code{acre^1.5} is
- replaced by approximately @c{$(4046 m^2)^{1.5}$}
- @cite{(4046 m^2)^1.5}, which is then
- changed to @c{$4046^{1.5} \, (m^2)^{1.5}$}
- @cite{4046^1.5 (m^2)^1.5}, then to @cite{257440 m^3}.
- The functions @code{float}, @code{frac}, @code{clean}, @code{abs},
- as well as @code{floor} and the other integer truncation functions,
- applied to unit names or products or quotients involving units, are
- simplified. For example, @samp{round(1.6 in)} is changed to
- @samp{round(1.6) round(in)}; the lefthand term evaluates to 2,
- and the righthand term simplifies to @code{in}.
- The functions @code{sin}, @code{cos}, and @code{tan} with arguments
- that have angular units like @code{rad} or @code{arcmin} are
- simplified by converting to base units (radians), then evaluating
- with the angular mode temporarily set to radians.
- @node Polynomials, Calculus, Simplifying Formulas, Algebra
- @section Polynomials
- A @dfn{polynomial} is a sum of terms which are coefficients times
- various powers of a ``base'' variable. For example, @cite{2 x^2 + 3 x - 4}
- is a polynomial in @cite{x}. Some formulas can be considered
- polynomials in several different variables: @cite{1 + 2 x + 3 y + 4 x y^2}
- is a polynomial in both @cite{x} and @cite{y}. Polynomial coefficients
- are often numbers, but they may in general be any formulas not
- involving the base variable.
- @kindex a f
- @pindex calc-factor
- @tindex factor
- The @kbd{a f} (@code{calc-factor}) [@code{factor}] command factors a
- polynomial into a product of terms. For example, the polynomial
- @cite{x^3 + 2 x^2 + x} is factored into @samp{x*(x+1)^2}. As another
- example, @cite{a c + b d + b c + a d} is factored into the product
- @cite{(a + b) (c + d)}.
- Calc currently has three algorithms for factoring. Formulas which are
- linear in several variables, such as the second example above, are
- merged according to the distributive law. Formulas which are
- polynomials in a single variable, with constant integer or fractional
- coefficients, are factored into irreducible linear and/or quadratic
- terms. The first example above factors into three linear terms
- (@cite{x}, @cite{x+1}, and @cite{x+1} again). Finally, formulas
- which do not fit the above criteria are handled by the algebraic
- rewrite mechanism.
- Calc's polynomial factorization algorithm works by using the general
- root-finding command (@w{@kbd{a P}}) to solve for the roots of the
- polynomial. It then looks for roots which are rational numbers
- or complex-conjugate pairs, and converts these into linear and
- quadratic terms, respectively. Because it uses floating-point
- arithmetic, it may be unable to find terms that involve large
- integers (whose number of digits approaches the current precision).
- Also, irreducible factors of degree higher than quadratic are not
- found, and polynomials in more than one variable are not treated.
- (A more robust factorization algorithm may be included in a future
- version of Calc.)
- @vindex FactorRules
- @ignore
- @starindex
- @end ignore
- @tindex thecoefs
- @ignore
- @starindex
- @end ignore
- @ignore
- @mindex @idots
- @end ignore
- @tindex thefactors
- The rewrite-based factorization method uses rules stored in the variable
- @code{FactorRules}. @xref{Rewrite Rules}, for a discussion of the
- operation of rewrite rules. The default @code{FactorRules} are able
- to factor quadratic forms symbolically into two linear terms,
- @cite{(a x + b) (c x + d)}. You can edit these rules to include other
- cases if you wish. To use the rules, Calc builds the formula
- @samp{thecoefs(x, [a, b, c, ...])} where @code{x} is the polynomial
- base variable and @code{a}, @code{b}, etc., are polynomial coefficients
- (which may be numbers or formulas). The constant term is written first,
- i.e., in the @code{a} position. When the rules complete, they should have
- changed the formula into the form @samp{thefactors(x, [f1, f2, f3, ...])}
- where each @code{fi} should be a factored term, e.g., @samp{x - ai}.
- Calc then multiplies these terms together to get the complete
- factored form of the polynomial. If the rules do not change the
- @code{thecoefs} call to a @code{thefactors} call, @kbd{a f} leaves the
- polynomial alone on the assumption that it is unfactorable. (Note that
- the function names @code{thecoefs} and @code{thefactors} are used only
- as placeholders; there are no actual Calc functions by those names.)
- @kindex H a f
- @tindex factors
- The @kbd{H a f} [@code{factors}] command also factors a polynomial,
- but it returns a list of factors instead of an expression which is the
- product of the factors. Each factor is represented by a sub-vector
- of the factor, and the power with which it appears. For example,
- @cite{x^5 + x^4 - 33 x^3 + 63 x^2} factors to @cite{(x + 7) x^2 (x - 3)^2}
- in @kbd{a f}, or to @cite{[ [x, 2], [x+7, 1], [x-3, 2] ]} in @kbd{H a f}.
- If there is an overall numeric factor, it always comes first in the list.
- The functions @code{factor} and @code{factors} allow a second argument
- when written in algebraic form; @samp{factor(x,v)} factors @cite{x} with
- respect to the specific variable @cite{v}. The default is to factor with
- respect to all the variables that appear in @cite{x}.
- @kindex a c
- @pindex calc-collect
- @tindex collect
- The @kbd{a c} (@code{calc-collect}) [@code{collect}] command rearranges a
- formula as a
- polynomial in a given variable, ordered in decreasing powers of that
- variable. For example, given @cite{1 + 2 x + 3 y + 4 x y^2} on
- the stack, @kbd{a c x} would produce @cite{(2 + 4 y^2) x + (1 + 3 y)},
- and @kbd{a c y} would produce @cite{(4 x) y^2 + 3 y + (1 + 2 x)}.
- The polynomial will be expanded out using the distributive law as
- necessary: Collecting @cite{x} in @cite{(x - 1)^3} produces
- @cite{x^3 - 3 x^2 + 3 x - 1}. Terms not involving @cite{x} will
- not be expanded.
- The ``variable'' you specify at the prompt can actually be any
- expression: @kbd{a c ln(x+1)} will collect together all terms multiplied
- by @samp{ln(x+1)} or integer powers thereof. If @samp{x} also appears
- in the formula in a context other than @samp{ln(x+1)}, @kbd{a c} will
- treat those occurrences as unrelated to @samp{ln(x+1)}, i.e., as constants.
- @kindex a x
- @pindex calc-expand
- @tindex expand
- The @kbd{a x} (@code{calc-expand}) [@code{expand}] command expands an
- expression by applying the distributive law everywhere. It applies to
- products, quotients, and powers involving sums. By default, it fully
- distributes all parts of the expression. With a numeric prefix argument,
- the distributive law is applied only the specified number of times, then
- the partially expanded expression is left on the stack.
- The @kbd{a x} and @kbd{j D} commands are somewhat redundant. Use
- @kbd{a x} if you want to expand all products of sums in your formula.
- Use @kbd{j D} if you want to expand a particular specified term of
- the formula. There is an exactly analogous correspondence between
- @kbd{a f} and @kbd{j M}. (The @kbd{j D} and @kbd{j M} commands
- also know many other kinds of expansions, such as
- @samp{exp(a + b) = exp(a) exp(b)}, which @kbd{a x} and @kbd{a f}
- do not do.)
- Calc's automatic simplifications will sometimes reverse a partial
- expansion. For example, the first step in expanding @cite{(x+1)^3} is
- to write @cite{(x+1) (x+1)^2}. If @kbd{a x} stops there and tries
- to put this formula onto the stack, though, Calc will automatically
- simplify it back to @cite{(x+1)^3} form. The solution is to turn
- simplification off first (@pxref{Simplification Modes}), or to run
- @kbd{a x} without a numeric prefix argument so that it expands all
- the way in one step.
- @kindex a a
- @pindex calc-apart
- @tindex apart
- The @kbd{a a} (@code{calc-apart}) [@code{apart}] command expands a
- rational function by partial fractions. A rational function is the
- quotient of two polynomials; @code{apart} pulls this apart into a
- sum of rational functions with simple denominators. In algebraic
- notation, the @code{apart} function allows a second argument that
- specifies which variable to use as the ``base''; by default, Calc
- chooses the base variable automatically.
- @kindex a n
- @pindex calc-normalize-rat
- @tindex nrat
- The @kbd{a n} (@code{calc-normalize-rat}) [@code{nrat}] command
- attempts to arrange a formula into a quotient of two polynomials.
- For example, given @cite{1 + (a + b/c) / d}, the result would be
- @cite{(b + a c + c d) / c d}. The quotient is reduced, so that
- @kbd{a n} will simplify @cite{(x^2 + 2x + 1) / (x^2 - 1)} by dividing
- out the common factor @cite{x + 1}, yielding @cite{(x + 1) / (x - 1)}.
- @kindex a \
- @pindex calc-poly-div
- @tindex pdiv
- The @kbd{a \} (@code{calc-poly-div}) [@code{pdiv}] command divides
- two polynomials @cite{u} and @cite{v}, yielding a new polynomial
- @cite{q}. If several variables occur in the inputs, the inputs are
- considered multivariate polynomials. (Calc divides by the variable
- with the largest power in @cite{u} first, or, in the case of equal
- powers, chooses the variables in alphabetical order.) For example,
- dividing @cite{x^2 + 3 x + 2} by @cite{x + 2} yields @cite{x + 1}.
- The remainder from the division, if any, is reported at the bottom
- of the screen and is also placed in the Trail along with the quotient.
- Using @code{pdiv} in algebraic notation, you can specify the particular
- variable to be used as the base: @code{pdiv(@var{a},@var{b},@var{x})}.
- If @code{pdiv} is given only two arguments (as is always the case with
- the @kbd{a \} command), then it does a multivariate division as outlined
- above.
- @kindex a %
- @pindex calc-poly-rem
- @tindex prem
- The @kbd{a %} (@code{calc-poly-rem}) [@code{prem}] command divides
- two polynomials and keeps the remainder @cite{r}. The quotient
- @cite{q} is discarded. For any formulas @cite{a} and @cite{b}, the
- results of @kbd{a \} and @kbd{a %} satisfy @cite{a = q b + r}.
- (This is analogous to plain @kbd{\} and @kbd{%}, which compute the
- integer quotient and remainder from dividing two numbers.)
- @kindex a /
- @kindex H a /
- @pindex calc-poly-div-rem
- @tindex pdivrem
- @tindex pdivide
- The @kbd{a /} (@code{calc-poly-div-rem}) [@code{pdivrem}] command
- divides two polynomials and reports both the quotient and the
- remainder as a vector @cite{[q, r]}. The @kbd{H a /} [@code{pdivide}]
- command divides two polynomials and constructs the formula
- @cite{q + r/b} on the stack. (Naturally if the remainder is zero,
- this will immediately simplify to @cite{q}.)
- @kindex a g
- @pindex calc-poly-gcd
- @tindex pgcd
- The @kbd{a g} (@code{calc-poly-gcd}) [@code{pgcd}] command computes
- the greatest common divisor of two polynomials. (The GCD actually
- is unique only to within a constant multiplier; Calc attempts to
- choose a GCD which will be unsurprising.) For example, the @kbd{a n}
- command uses @kbd{a g} to take the GCD of the numerator and denominator
- of a quotient, then divides each by the result using @kbd{a \}. (The
- definition of GCD ensures that this division can take place without
- leaving a remainder.)
- While the polynomials used in operations like @kbd{a /} and @kbd{a g}
- often have integer coefficients, this is not required. Calc can also
- deal with polynomials over the rationals or floating-point reals.
- Polynomials with modulo-form coefficients are also useful in many
- applications; if you enter @samp{(x^2 + 3 x - 1) mod 5}, Calc
- automatically transforms this into a polynomial over the field of
- integers mod 5: @samp{(1 mod 5) x^2 + (3 mod 5) x + (4 mod 5)}.
- Congratulations and thanks go to Ove Ewerlid
- (@code{ewerlid@@mizar.DoCS.UU.SE}), who contributed many of the
- polynomial routines used in the above commands.
- @xref{Decomposing Polynomials}, for several useful functions for
- extracting the individual coefficients of a polynomial.
- @node Calculus, Solving Equations, Polynomials, Algebra
- @section Calculus
- @noindent
- The following calculus commands do not automatically simplify their
- inputs or outputs using @code{calc-simplify}. You may find it helps
- to do this by hand by typing @kbd{a s} or @kbd{a e}. It may also help
- to use @kbd{a x} and/or @kbd{a c} to arrange a result in the most
- readable way.
- @menu
- * Differentiation::
- * Integration::
- * Customizing the Integrator::
- * Numerical Integration::
- * Taylor Series::
- @end menu
- @node Differentiation, Integration, Calculus, Calculus
- @subsection Differentiation
- @noindent
- @kindex a d
- @kindex H a d
- @pindex calc-derivative
- @tindex deriv
- @tindex tderiv
- The @kbd{a d} (@code{calc-derivative}) [@code{deriv}] command computes
- the derivative of the expression on the top of the stack with respect to
- some variable, which it will prompt you to enter. Normally, variables
- in the formula other than the specified differentiation variable are
- considered constant, i.e., @samp{deriv(y,x)} is reduced to zero. With
- the Hyperbolic flag, the @code{tderiv} (total derivative) operation is used
- instead, in which derivatives of variables are not reduced to zero
- unless those variables are known to be ``constant,'' i.e., independent
- of any other variables. (The built-in special variables like @code{pi}
- are considered constant, as are variables that have been declared
- @code{const}; @pxref{Declarations}.)
- With a numeric prefix argument @var{n}, this command computes the
- @var{n}th derivative.
- When working with trigonometric functions, it is best to switch to
- radians mode first (with @w{@kbd{m r}}). The derivative of @samp{sin(x)}
- in degrees is @samp{(pi/180) cos(x)}, probably not the expected
- answer!
- If you use the @code{deriv} function directly in an algebraic formula,
- you can write @samp{deriv(f,x,x0)} which represents the derivative
- of @cite{f} with respect to @cite{x}, evaluated at the point @c{$x=x_0$}
- @cite{x=x0}.
- If the formula being differentiated contains functions which Calc does
- not know, the derivatives of those functions are produced by adding
- primes (apostrophe characters). For example, @samp{deriv(f(2x), x)}
- produces @samp{2 f'(2 x)}, where the function @code{f'} represents the
- derivative of @code{f}.
- For functions you have defined with the @kbd{Z F} command, Calc expands
- the functions according to their defining formulas unless you have
- also defined @code{f'} suitably. For example, suppose we define
- @samp{sinc(x) = sin(x)/x} using @kbd{Z F}. If we then differentiate
- the formula @samp{sinc(2 x)}, the formula will be expanded to
- @samp{sin(2 x) / (2 x)} and differentiated. However, if we also
- define @samp{sinc'(x) = dsinc(x)}, say, then Calc will write the
- result as @samp{2 dsinc(2 x)}. @xref{Algebraic Definitions}.
- For multi-argument functions @samp{f(x,y,z)}, the derivative with respect
- to the first argument is written @samp{f'(x,y,z)}; derivatives with
- respect to the other arguments are @samp{f'2(x,y,z)} and @samp{f'3(x,y,z)}.
- Various higher-order derivatives can be formed in the obvious way, e.g.,
- @samp{f'@var{}'(x)} (the second derivative of @code{f}) or
- @samp{f'@var{}'2'3(x,y,z)} (@code{f} differentiated with respect to each
- argument once).@refill
- @node Integration, Customizing the Integrator, Differentiation, Calculus
- @subsection Integration
- @noindent
- @kindex a i
- @pindex calc-integral
- @tindex integ
- The @kbd{a i} (@code{calc-integral}) [@code{integ}] command computes the
- indefinite integral of the expression on the top of the stack with
- respect to a variable. The integrator is not guaranteed to work for
- all integrable functions, but it is able to integrate several large
- classes of formulas. In particular, any polynomial or rational function
- (a polynomial divided by a polynomial) is acceptable. (Rational functions
- don't have to be in explicit quotient form, however; @c{$x/(1+x^{-2})$}
- @cite{x/(1+x^-2)}
- is not strictly a quotient of polynomials, but it is equivalent to
- @cite{x^3/(x^2+1)}, which is.) Also, square roots of terms involving
- @cite{x} and @cite{x^2} may appear in rational functions being
- integrated. Finally, rational functions involving trigonometric or
- hyperbolic functions can be integrated.
- @ifinfo
- If you use the @code{integ} function directly in an algebraic formula,
- you can also write @samp{integ(f,x,v)} which expresses the resulting
- indefinite integral in terms of variable @code{v} instead of @code{x}.
- With four arguments, @samp{integ(f(x),x,a,b)} represents a definite
- integral from @code{a} to @code{b}.
- @end ifinfo
- @tex
- If you use the @code{integ} function directly in an algebraic formula,
- you can also write @samp{integ(f,x,v)} which expresses the resulting
- indefinite integral in terms of variable @code{v} instead of @code{x}.
- With four arguments, @samp{integ(f(x),x,a,b)} represents a definite
- integral $\int_a^b f(x) \, dx$.
- @end tex
- Please note that the current implementation of Calc's integrator sometimes
- produces results that are significantly more complex than they need to
- be. For example, the integral Calc finds for @c{$1/(x+\sqrt{x^2+1})$}
- @cite{1/(x+sqrt(x^2+1))}
- is several times more complicated than the answer Mathematica
- returns for the same input, although the two forms are numerically
- equivalent. Also, any indefinite integral should be considered to have
- an arbitrary constant of integration added to it, although Calc does not
- write an explicit constant of integration in its result. For example,
- Calc's solution for @c{$1/(1+\tan x)$}
- @cite{1/(1+tan(x))} differs from the solution given
- in the @emph{CRC Math Tables} by a constant factor of @c{$\pi i / 2$}
- @cite{pi i / 2},
- due to a different choice of constant of integration.
- The Calculator remembers all the integrals it has done. If conditions
- change in a way that would invalidate the old integrals, say, a switch
- from degrees to radians mode, then they will be thrown out. If you
- suspect this is not happening when it should, use the
- @code{calc-flush-caches} command; @pxref{Caches}.
- @vindex IntegLimit
- Calc normally will pursue integration by substitution or integration by
- parts up to 3 nested times before abandoning an approach as fruitless.
- If the integrator is taking too long, you can lower this limit by storing
- a number (like 2) in the variable @code{IntegLimit}. (The @kbd{s I}
- command is a convenient way to edit @code{IntegLimit}.) If this variable
- has no stored value or does not contain a nonnegative integer, a limit
- of 3 is used. The lower this limit is, the greater the chance that Calc
- will be unable to integrate a function it could otherwise handle. Raising
- this limit allows the Calculator to solve more integrals, though the time
- it takes may grow exponentially. You can monitor the integrator's actions
- by creating an Emacs buffer called @code{*Trace*}. If such a buffer
- exists, the @kbd{a i} command will write a log of its actions there.
- If you want to manipulate integrals in a purely symbolic way, you can
- set the integration nesting limit to 0 to prevent all but fast
- table-lookup solutions of integrals. You might then wish to define
- rewrite rules for integration by parts, various kinds of substitutions,
- and so on. @xref{Rewrite Rules}.
- @node Customizing the Integrator, Numerical Integration, Integration, Calculus
- @subsection Customizing the Integrator
- @noindent
- @vindex IntegRules
- Calc has two built-in rewrite rules called @code{IntegRules} and
- @code{IntegAfterRules} which you can edit to define new integration
- methods. @xref{Rewrite Rules}. At each step of the integration process,
- Calc wraps the current integrand in a call to the fictitious function
- @samp{integtry(@var{expr},@var{var})}, where @var{expr} is the
- integrand and @var{var} is the integration variable. If your rules
- rewrite this to be a plain formula (not a call to @code{integtry}), then
- Calc will use this formula as the integral of @var{expr}. For example,
- the rule @samp{integtry(mysin(x),x) := -mycos(x)} would define a rule to
- integrate a function @code{mysin} that acts like the sine function.
- Then, putting @samp{4 mysin(2y+1)} on the stack and typing @kbd{a i y}
- will produce the integral @samp{-2 mycos(2y+1)}. Note that Calc has
- automatically made various transformations on the integral to allow it
- to use your rule; integral tables generally give rules for
- @samp{mysin(a x + b)}, but you don't need to use this much generality
- in your @code{IntegRules}.
- @cindex Exponential integral Ei(x)
- @ignore
- @starindex
- @end ignore
- @tindex Ei
- As a more serious example, the expression @samp{exp(x)/x} cannot be
- integrated in terms of the standard functions, so the ``exponential
- integral'' function @c{${\rm Ei}(x)$}
- @cite{Ei(x)} was invented to describe it.
- We can get Calc to do this integral in terms of a made-up @code{Ei}
- function by adding the rule @samp{[integtry(exp(x)/x, x) := Ei(x)]}
- to @code{IntegRules}. Now entering @samp{exp(2x)/x} on the stack
- and typing @kbd{a i x} yields @samp{Ei(2 x)}. This new rule will
- work with Calc's various built-in integration methods (such as
- integration by substitution) to solve a variety of other problems
- involving @code{Ei}: For example, now Calc will also be able to
- integrate @samp{exp(exp(x))} and @samp{ln(ln(x))} (to get @samp{Ei(exp(x))}
- and @samp{x ln(ln(x)) - Ei(ln(x))}, respectively).
- Your rule may do further integration by calling @code{integ}. For
- example, @samp{integtry(twice(u),x) := twice(integ(u))} allows Calc
- to integrate @samp{twice(sin(x))} to get @samp{twice(-cos(x))}.
- Note that @code{integ} was called with only one argument. This notation
- is allowed only within @code{IntegRules}; it means ``integrate this
- with respect to the same integration variable.'' If Calc is unable
- to integrate @code{u}, the integration that invoked @code{IntegRules}
- also fails. Thus integrating @samp{twice(f(x))} fails, returning the
- unevaluated integral @samp{integ(twice(f(x)), x)}. It is still legal
- to call @code{integ} with two or more arguments, however; in this case,
- if @code{u} is not integrable, @code{twice} itself will still be
- integrated: If the above rule is changed to @samp{... := twice(integ(u,x))},
- then integrating @samp{twice(f(x))} will yield @samp{twice(integ(f(x),x))}.
- If a rule instead produces the formula @samp{integsubst(@var{sexpr},
- @var{svar})}, either replacing the top-level @code{integtry} call or
- nested anywhere inside the expression, then Calc will apply the
- substitution @samp{@var{u} = @var{sexpr}(@var{svar})} to try to
- integrate the original @var{expr}. For example, the rule
- @samp{sqrt(a) := integsubst(sqrt(x),x)} says that if Calc ever finds
- a square root in the integrand, it should attempt the substitution
- @samp{u = sqrt(x)}. (This particular rule is unnecessary because
- Calc always tries ``obvious'' substitutions where @var{sexpr} actually
- appears in the integrand.) The variable @var{svar} may be the same
- as the @var{var} that appeared in the call to @code{integtry}, but
- it need not be.
- When integrating according to an @code{integsubst}, Calc uses the
- equation solver to find the inverse of @var{sexpr} (if the integrand
- refers to @var{var} anywhere except in subexpressions that exactly
- match @var{sexpr}). It uses the differentiator to find the derivative
- of @var{sexpr} and/or its inverse (it has two methods that use one
- derivative or the other). You can also specify these items by adding
- extra arguments to the @code{integsubst} your rules construct; the
- general form is @samp{integsubst(@var{sexpr}, @var{svar}, @var{sinv},
- @var{sprime})}, where @var{sinv} is the inverse of @var{sexpr} (still
- written as a function of @var{svar}), and @var{sprime} is the
- derivative of @var{sexpr} with respect to @var{svar}. If you don't
- specify these things, and Calc is not able to work them out on its
- own with the information it knows, then your substitution rule will
- work only in very specific, simple cases.
- Calc applies @code{IntegRules} as if by @kbd{C-u 1 a r IntegRules};
- in other words, Calc stops rewriting as soon as any rule in your rule
- set succeeds. (If it weren't for this, the @samp{integsubst(sqrt(x),x)}
- example above would keep on adding layers of @code{integsubst} calls
- forever!)
- @vindex IntegSimpRules
- Another set of rules, stored in @code{IntegSimpRules}, are applied
- every time the integrator uses @kbd{a s} to simplify an intermediate
- result. For example, putting the rule @samp{twice(x) := 2 x} into
- @code{IntegSimpRules} would tell Calc to convert the @code{twice}
- function into a form it knows whenever integration is attempted.
- One more way to influence the integrator is to define a function with
- the @kbd{Z F} command (@pxref{Algebraic Definitions}). Calc's
- integrator automatically expands such functions according to their
- defining formulas, even if you originally asked for the function to
- be left unevaluated for symbolic arguments. (Certain other Calc
- systems, such as the differentiator and the equation solver, also
- do this.)
- @vindex IntegAfterRules
- Sometimes Calc is able to find a solution to your integral, but it
- expresses the result in a way that is unnecessarily complicated. If
- this happens, you can either use @code{integsubst} as described
- above to try to hint at a more direct path to the desired result, or
- you can use @code{IntegAfterRules}. This is an extra rule set that
- runs after the main integrator returns its result; basically, Calc does
- an @kbd{a r IntegAfterRules} on the result before showing it to you.
- (It also does an @kbd{a s}, without @code{IntegSimpRules}, after that
- to further simplify the result.) For example, Calc's integrator
- sometimes produces expressions of the form @samp{ln(1+x) - ln(1-x)};
- the default @code{IntegAfterRules} rewrite this into the more readable
- form @samp{2 arctanh(x)}. Note that, unlike @code{IntegRules},
- @code{IntegSimpRules} and @code{IntegAfterRules} are applied any number
- of times until no further changes are possible. Rewriting by
- @code{IntegAfterRules} occurs only after the main integrator has
- finished, not at every step as for @code{IntegRules} and
- @code{IntegSimpRules}.
- @node Numerical Integration, Taylor Series, Customizing the Integrator, Calculus
- @subsection Numerical Integration
- @noindent
- @kindex a I
- @pindex calc-num-integral
- @tindex ninteg
- If you want a purely numerical answer to an integration problem, you can
- use the @kbd{a I} (@code{calc-num-integral}) [@code{ninteg}] command. This
- command prompts for an integration variable, a lower limit, and an
- upper limit. Except for the integration variable, all other variables
- that appear in the integrand formula must have stored values. (A stored
- value, if any, for the integration variable itself is ignored.)
- Numerical integration works by evaluating your formula at many points in
- the specified interval. Calc uses an ``open Romberg'' method; this means
- that it does not evaluate the formula actually at the endpoints (so that
- it is safe to integrate @samp{sin(x)/x} from zero, for example). Also,
- the Romberg method works especially well when the function being
- integrated is fairly smooth. If the function is not smooth, Calc will
- have to evaluate it at quite a few points before it can accurately
- determine the value of the integral.
- Integration is much faster when the current precision is small. It is
- best to set the precision to the smallest acceptable number of digits
- before you use @kbd{a I}. If Calc appears to be taking too long, press
- @kbd{C-g} to halt it and try a lower precision. If Calc still appears
- to need hundreds of evaluations, check to make sure your function is
- well-behaved in the specified interval.
- It is possible for the lower integration limit to be @samp{-inf} (minus
- infinity). Likewise, the upper limit may be plus infinity. Calc
- internally transforms the integral into an equivalent one with finite
- limits. However, integration to or across singularities is not supported:
- The integral of @samp{1/sqrt(x)} from 0 to 1 exists (it can be found
- by Calc's symbolic integrator, for example), but @kbd{a I} will fail
- because the integrand goes to infinity at one of the endpoints.
- @node Taylor Series, , Numerical Integration, Calculus
- @subsection Taylor Series
- @noindent
- @kindex a t
- @pindex calc-taylor
- @tindex taylor
- The @kbd{a t} (@code{calc-taylor}) [@code{taylor}] command computes a
- power series expansion or Taylor series of a function. You specify the
- variable and the desired number of terms. You may give an expression of
- the form @samp{@var{var} = @var{a}} or @samp{@var{var} - @var{a}} instead
- of just a variable to produce a Taylor expansion about the point @var{a}.
- You may specify the number of terms with a numeric prefix argument;
- otherwise the command will prompt you for the number of terms. Note that
- many series expansions have coefficients of zero for some terms, so you
- may appear to get fewer terms than you asked for.@refill
- If the @kbd{a i} command is unable to find a symbolic integral for a
- function, you can get an approximation by integrating the function's
- Taylor series.
- @node Solving Equations, Numerical Solutions, Calculus, Algebra
- @section Solving Equations
- @noindent
- @kindex a S
- @pindex calc-solve-for
- @tindex solve
- @cindex Equations, solving
- @cindex Solving equations
- The @kbd{a S} (@code{calc-solve-for}) [@code{solve}] command rearranges
- an equation to solve for a specific variable. An equation is an
- expression of the form @cite{L = R}. For example, the command @kbd{a S x}
- will rearrange @cite{y = 3x + 6} to the form, @cite{x = y/3 - 2}. If the
- input is not an equation, it is treated like an equation of the
- form @cite{X = 0}.
- This command also works for inequalities, as in @cite{y < 3x + 6}.
- Some inequalities cannot be solved where the analogous equation could
- be; for example, solving @c{$a < b \, c$}
- @cite{a < b c} for @cite{b} is impossible
- without knowing the sign of @cite{c}. In this case, @kbd{a S} will
- produce the result @c{$b \mathbin{\hbox{\code{!=}}} a/c$}
- @cite{b != a/c} (using the not-equal-to operator)
- to signify that the direction of the inequality is now unknown. The
- inequality @c{$a \le b \, c$}
- @cite{a <= b c} is not even partially solved.
- @xref{Declarations}, for a way to tell Calc that the signs of the
- variables in a formula are in fact known.
- Two useful commands for working with the result of @kbd{a S} are
- @kbd{a .} (@pxref{Logical Operations}), which converts @cite{x = y/3 - 2}
- to @cite{y/3 - 2}, and @kbd{s l} (@pxref{Let Command}) which evaluates
- another formula with @cite{x} set equal to @cite{y/3 - 2}.
- @menu
- * Multiple Solutions::
- * Solving Systems of Equations::
- * Decomposing Polynomials::
- @end menu
- @node Multiple Solutions, Solving Systems of Equations, Solving Equations, Solving Equations
- @subsection Multiple Solutions
- @noindent
- @kindex H a S
- @tindex fsolve
- Some equations have more than one solution. The Hyperbolic flag
- (@code{H a S}) [@code{fsolve}] tells the solver to report the fully
- general family of solutions. It will invent variables @code{n1},
- @code{n2}, @dots{}, which represent independent arbitrary integers, and
- @code{s1}, @code{s2}, @dots{}, which represent independent arbitrary
- signs (either @i{+1} or @i{-1}). If you don't use the Hyperbolic
- flag, Calc will use zero in place of all arbitrary integers, and plus
- one in place of all arbitrary signs. Note that variables like @code{n1}
- and @code{s1} are not given any special interpretation in Calc except by
- the equation solver itself. As usual, you can use the @w{@kbd{s l}}
- (@code{calc-let}) command to obtain solutions for various actual values
- of these variables.
- For example, @kbd{' x^2 = y @key{RET} H a S x @key{RET}} solves to
- get @samp{x = s1 sqrt(y)}, indicating that the two solutions to the
- equation are @samp{sqrt(y)} and @samp{-sqrt(y)}. Another way to
- think about it is that the square-root operation is really a
- two-valued function; since every Calc function must return a
- single result, @code{sqrt} chooses to return the positive result.
- Then @kbd{H a S} doctors this result using @code{s1} to indicate
- the full set of possible values of the mathematical square-root.
- There is a similar phenomenon going the other direction: Suppose
- we solve @samp{sqrt(y) = x} for @code{y}. Calc squares both sides
- to get @samp{y = x^2}. This is correct, except that it introduces
- some dubious solutions. Consider solving @samp{sqrt(y) = -3}:
- Calc will report @cite{y = 9} as a valid solution, which is true
- in the mathematical sense of square-root, but false (there is no
- solution) for the actual Calc positive-valued @code{sqrt}. This
- happens for both @kbd{a S} and @kbd{H a S}.
- @cindex @code{GenCount} variable
- @vindex GenCount
- @ignore
- @starindex
- @end ignore
- @tindex an
- @ignore
- @starindex
- @end ignore
- @tindex as
- If you store a positive integer in the Calc variable @code{GenCount},
- then Calc will generate formulas of the form @samp{as(@var{n})} for
- arbitrary signs, and @samp{an(@var{n})} for arbitrary integers,
- where @var{n} represents successive values taken by incrementing
- @code{GenCount} by one. While the normal arbitrary sign and
- integer symbols start over at @code{s1} and @code{n1} with each
- new Calc command, the @code{GenCount} approach will give each
- arbitrary value a name that is unique throughout the entire Calc
- session. Also, the arbitrary values are function calls instead
- of variables, which is advantageous in some cases. For example,
- you can make a rewrite rule that recognizes all arbitrary signs
- using a pattern like @samp{as(n)}. The @kbd{s l} command only works
- on variables, but you can use the @kbd{a b} (@code{calc-substitute})
- command to substitute actual values for function calls like @samp{as(3)}.
- The @kbd{s G} (@code{calc-edit-GenCount}) command is a convenient
- way to create or edit this variable. Press @kbd{M-# M-#} to finish.
- If you have not stored a value in @code{GenCount}, or if the value
- in that variable is not a positive integer, the regular
- @code{s1}/@code{n1} notation is used.
- @kindex I a S
- @kindex H I a S
- @tindex finv
- @tindex ffinv
- With the Inverse flag, @kbd{I a S} [@code{finv}] treats the expression
- on top of the stack as a function of the specified variable and solves
- to find the inverse function, written in terms of the same variable.
- For example, @kbd{I a S x} inverts @cite{2x + 6} to @cite{x/2 - 3}.
- You can use both Inverse and Hyperbolic [@code{ffinv}] to obtain a
- fully general inverse, as described above.
- @kindex a P
- @pindex calc-poly-roots
- @tindex roots
- Some equations, specifically polynomials, have a known, finite number
- of solutions. The @kbd{a P} (@code{calc-poly-roots}) [@code{roots}]
- command uses @kbd{H a S} to solve an equation in general form, then, for
- all arbitrary-sign variables like @code{s1}, and all arbitrary-integer
- variables like @code{n1} for which @code{n1} only usefully varies over
- a finite range, it expands these variables out to all their possible
- values. The results are collected into a vector, which is returned.
- For example, @samp{roots(x^4 = 1, x)} returns the four solutions
- @samp{[1, -1, (0, 1), (0, -1)]}. Generally an @var{n}th degree
- polynomial will always have @var{n} roots on the complex plane.
- (If you have given a @code{real} declaration for the solution
- variable, then only the real-valued solutions, if any, will be
- reported; @pxref{Declarations}.)
- Note that because @kbd{a P} uses @kbd{H a S}, it is able to deliver
- symbolic solutions if the polynomial has symbolic coefficients. Also
- note that Calc's solver is not able to get exact symbolic solutions
- to all polynomials. Polynomials containing powers up to @cite{x^4}
- can always be solved exactly; polynomials of higher degree sometimes
- can be: @cite{x^6 + x^3 + 1} is converted to @cite{(x^3)^2 + (x^3) + 1},
- which can be solved for @cite{x^3} using the quadratic equation, and then
- for @cite{x} by taking cube roots. But in many cases, like
- @cite{x^6 + x + 1}, Calc does not know how to rewrite the polynomial
- into a form it can solve. The @kbd{a P} command can still deliver a
- list of numerical roots, however, provided that symbolic mode (@kbd{m s})
- is not turned on. (If you work with symbolic mode on, recall that the
- @kbd{N} (@code{calc-eval-num}) key is a handy way to reevaluate the
- formula on the stack with symbolic mode temporarily off.) Naturally,
- @kbd{a P} can only provide numerical roots if the polynomial coefficents
- are all numbers (real or complex).
- @node Solving Systems of Equations, Decomposing Polynomials, Multiple Solutions, Solving Equations
- @subsection Solving Systems of Equations
- @noindent
- @cindex Systems of equations, symbolic
- You can also use the commands described above to solve systems of
- simultaneous equations. Just create a vector of equations, then
- specify a vector of variables for which to solve. (You can omit
- the surrounding brackets when entering the vector of variables
- at the prompt.)
- For example, putting @samp{[x + y = a, x - y = b]} on the stack
- and typing @kbd{a S x,y @key{RET}} produces the vector of solutions
- @samp{[x = a - (a-b)/2, y = (a-b)/2]}. The result vector will
- have the same length as the variables vector, and the variables
- will be listed in the same order there. Note that the solutions
- are not always simplified as far as possible; the solution for
- @cite{x} here could be improved by an application of the @kbd{a n}
- command.
- Calc's algorithm works by trying to eliminate one variable at a
- time by solving one of the equations for that variable and then
- substituting into the other equations. Calc will try all the
- possibilities, but you can speed things up by noting that Calc
- first tries to eliminate the first variable with the first
- equation, then the second variable with the second equation,
- and so on. It also helps to put the simpler (e.g., more linear)
- equations toward the front of the list. Calc's algorithm will
- solve any system of linear equations, and also many kinds of
- nonlinear systems.
- @ignore
- @starindex
- @end ignore
- @tindex elim
- Normally there will be as many variables as equations. If you
- give fewer variables than equations (an ``over-determined'' system
- of equations), Calc will find a partial solution. For example,
- typing @kbd{a S y @key{RET}} with the above system of equations
- would produce @samp{[y = a - x]}. There are now several ways to
- express this solution in terms of the original variables; Calc uses
- the first one that it finds. You can control the choice by adding
- variable specifiers of the form @samp{elim(@var{v})} to the
- variables list. This says that @var{v} should be eliminated from
- the equations; the variable will not appear at all in the solution.
- For example, typing @kbd{a S y,elim(x)} would yield
- @samp{[y = a - (b+a)/2]}.
- If the variables list contains only @code{elim} specifiers,
- Calc simply eliminates those variables from the equations
- and then returns the resulting set of equations. For example,
- @kbd{a S elim(x)} produces @samp{[a - 2 y = b]}. Every variable
- eliminated will reduce the number of equations in the system
- by one.
- Again, @kbd{a S} gives you one solution to the system of
- equations. If there are several solutions, you can use @kbd{H a S}
- to get a general family of solutions, or, if there is a finite
- number of solutions, you can use @kbd{a P} to get a list. (In
- the latter case, the result will take the form of a matrix where
- the rows are different solutions and the columns correspond to the
- variables you requested.)
- Another way to deal with certain kinds of overdetermined systems of
- equations is the @kbd{a F} command, which does least-squares fitting
- to satisfy the equations. @xref{Curve Fitting}.
- @node Decomposing Polynomials, , Solving Systems of Equations, Solving Equations
- @subsection Decomposing Polynomials
- @noindent
- @ignore
- @starindex
- @end ignore
- @tindex poly
- The @code{poly} function takes a polynomial and a variable as
- arguments, and returns a vector of polynomial coefficients (constant
- coefficient first). For example, @samp{poly(x^3 + 2 x, x)} returns
- @cite{[0, 2, 0, 1]}. If the input is not a polynomial in @cite{x},
- the call to @code{poly} is left in symbolic form. If the input does
- not involve the variable @cite{x}, the input is returned in a list
- of length one, representing a polynomial with only a constant
- coefficient. The call @samp{poly(x, x)} returns the vector @cite{[0, 1]}.
- The last element of the returned vector is guaranteed to be nonzero;
- note that @samp{poly(0, x)} returns the empty vector @cite{[]}.
- Note also that @cite{x} may actually be any formula; for example,
- @samp{poly(sin(x)^2 - sin(x) + 3, sin(x))} returns @cite{[3, -1, 1]}.
- @cindex Coefficients of polynomial
- @cindex Degree of polynomial
- To get the @cite{x^k} coefficient of polynomial @cite{p}, use
- @samp{poly(p, x)_(k+1)}. To get the degree of polynomial @cite{p},
- use @samp{vlen(poly(p, x)) - 1}. For example, @samp{poly((x+1)^4, x)}
- returns @samp{[1, 4, 6, 4, 1]}, so @samp{poly((x+1)^4, x)_(2+1)}
- gives the @cite{x^2} coefficient of this polynomial, 6.
- @ignore
- @starindex
- @end ignore
- @tindex gpoly
- One important feature of the solver is its ability to recognize
- formulas which are ``essentially'' polynomials. This ability is
- made available to the user through the @code{gpoly} function, which
- is used just like @code{poly}: @samp{gpoly(@var{expr}, @var{var})}.
- If @var{expr} is a polynomial in some term which includes @var{var}, then
- this function will return a vector @samp{[@var{x}, @var{c}, @var{a}]}
- where @var{x} is the term that depends on @var{var}, @var{c} is a
- vector of polynomial coefficients (like the one returned by @code{poly}),
- and @var{a} is a multiplier which is usually 1. Basically,
- @samp{@var{expr} = @var{a}*(@var{c}_1 + @var{c}_2 @var{x} +
- @var{c}_3 @var{x}^2 + ...)}. The last element of @var{c} is
- guaranteed to be non-zero, and @var{c} will not equal @samp{[1]}
- (i.e., the trivial decomposition @var{expr} = @var{x} is not
- considered a polynomial). One side effect is that @samp{gpoly(x, x)}
- and @samp{gpoly(6, x)}, both of which might be expected to recognize
- their arguments as polynomials, will not because the decomposition
- is considered trivial.
- For example, @samp{gpoly((x-2)^2, x)} returns @samp{[x, [4, -4, 1], 1]},
- since the expanded form of this polynomial is @cite{4 - 4 x + x^2}.
- The term @var{x} may itself be a polynomial in @var{var}. This is
- done to reduce the size of the @var{c} vector. For example,
- @samp{gpoly(x^4 + x^2 - 1, x)} returns @samp{[x^2, [-1, 1, 1], 1]},
- since a quadratic polynomial in @cite{x^2} is easier to solve than
- a quartic polynomial in @cite{x}.
- A few more examples of the kinds of polynomials @code{gpoly} can
- discover:
- @smallexample
- sin(x) - 1 [sin(x), [-1, 1], 1]
- x + 1/x - 1 [x, [1, -1, 1], 1/x]
- x + 1/x [x^2, [1, 1], 1/x]
- x^3 + 2 x [x^2, [2, 1], x]
- x + x^2:3 + sqrt(x) [x^1:6, [1, 1, 0, 1], x^1:2]
- x^(2a) + 2 x^a + 5 [x^a, [5, 2, 1], 1]
- (exp(-x) + exp(x)) / 2 [e^(2 x), [0.5, 0.5], e^-x]
- @end smallexample
- The @code{poly} and @code{gpoly} functions accept a third integer argument
- which specifies the largest degree of polynomial that is acceptable.
- If this is @cite{n}, then only @var{c} vectors of length @cite{n+1}
- or less will be returned. Otherwise, the @code{poly} or @code{gpoly}
- call will remain in symbolic form. For example, the equation solver
- can handle quartics and smaller polynomials, so it calls
- @samp{gpoly(@var{expr}, @var{var}, 4)} to discover whether @var{expr}
- can be treated by its linear, quadratic, cubic, or quartic formulas.
- @ignore
- @starindex
- @end ignore
- @tindex pdeg
- The @code{pdeg} function computes the degree of a polynomial;
- @samp{pdeg(p,x)} is the highest power of @code{x} that appears in
- @code{p}. This is the same as @samp{vlen(poly(p,x))-1}, but is
- much more efficient. If @code{p} is constant with respect to @code{x},
- then @samp{pdeg(p,x) = 0}. If @code{p} is not a polynomial in @code{x}
- (e.g., @samp{pdeg(2 cos(x), x)}, the function remains unevaluated.
- It is possible to omit the second argument @code{x}, in which case
- @samp{pdeg(p)} returns the highest total degree of any term of the
- polynomial, counting all variables that appear in @code{p}. Note
- that @code{pdeg(c) = pdeg(c,x) = 0} for any nonzero constant @code{c};
- the degree of the constant zero is considered to be @code{-inf}
- (minus infinity).
- @ignore
- @starindex
- @end ignore
- @tindex plead
- The @code{plead} function finds the leading term of a polynomial.
- Thus @samp{plead(p,x)} is equivalent to @samp{poly(p,x)_vlen(poly(p,x))},
- though again more efficient. In particular, @samp{plead((2x+1)^10, x)}
- returns 1024 without expanding out the list of coefficients. The
- value of @code{plead(p,x)} will be zero only if @cite{p = 0}.
- @ignore
- @starindex
- @end ignore
- @tindex pcont
- The @code{pcont} function finds the @dfn{content} of a polynomial. This
- is the greatest common divisor of all the coefficients of the polynomial.
- With two arguments, @code{pcont(p,x)} effectively uses @samp{poly(p,x)}
- to get a list of coefficients, then uses @code{pgcd} (the polynomial
- GCD function) to combine these into an answer. For example,
- @samp{pcont(4 x y^2 + 6 x^2 y, x)} is @samp{2 y}. The content is
- basically the ``biggest'' polynomial that can be divided into @code{p}
- exactly. The sign of the content is the same as the sign of the leading
- coefficient.
- With only one argument, @samp{pcont(p)} computes the numerical
- content of the polynomial, i.e., the @code{gcd} of the numerical
- coefficients of all the terms in the formula. Note that @code{gcd}
- is defined on rational numbers as well as integers; it computes
- the @code{gcd} of the numerators and the @code{lcm} of the
- denominators. Thus @samp{pcont(4:3 x y^2 + 6 x^2 y)} returns 2:3.
- Dividing the polynomial by this number will clear all the
- denominators, as well as dividing by any common content in the
- numerators. The numerical content of a polynomial is negative only
- if all the coefficients in the polynomial are negative.
- @ignore
- @starindex
- @end ignore
- @tindex pprim
- The @code{pprim} function finds the @dfn{primitive part} of a
- polynomial, which is simply the polynomial divided (using @code{pdiv}
- if necessary) by its content. If the input polynomial has rational
- coefficients, the result will have integer coefficients in simplest
- terms.
- @node Numerical Solutions, Curve Fitting, Solving Equations, Algebra
- @section Numerical Solutions
- @noindent
- Not all equations can be solved symbolically. The commands in this
- section use numerical algorithms that can find a solution to a specific
- instance of an equation to any desired accuracy. Note that the
- numerical commands are slower than their algebraic cousins; it is a
- good idea to try @kbd{a S} before resorting to these commands.
- (@xref{Curve Fitting}, for some other, more specialized, operations
- on numerical data.)
- @menu
- * Root Finding::
- * Minimization::
- * Numerical Systems of Equations::
- @end menu
- @node Root Finding, Minimization, Numerical Solutions, Numerical Solutions
- @subsection Root Finding
- @noindent
- @kindex a R
- @pindex calc-find-root
- @tindex root
- @cindex Newton's method
- @cindex Roots of equations
- @cindex Numerical root-finding
- The @kbd{a R} (@code{calc-find-root}) [@code{root}] command finds a
- numerical solution (or @dfn{root}) of an equation. (This command treats
- inequalities the same as equations. If the input is any other kind
- of formula, it is interpreted as an equation of the form @cite{X = 0}.)
- The @kbd{a R} command requires an initial guess on the top of the
- stack, and a formula in the second-to-top position. It prompts for a
- solution variable, which must appear in the formula. All other variables
- that appear in the formula must have assigned values, i.e., when
- a value is assigned to the solution variable and the formula is
- evaluated with @kbd{=}, it should evaluate to a number. Any assigned
- value for the solution variable itself is ignored and unaffected by
- this command.
- When the command completes, the initial guess is replaced on the stack
- by a vector of two numbers: The value of the solution variable that
- solves the equation, and the difference between the lefthand and
- righthand sides of the equation at that value. Ordinarily, the second
- number will be zero or very nearly zero. (Note that Calc uses a
- slightly higher precision while finding the root, and thus the second
- number may be slightly different from the value you would compute from
- the equation yourself.)
- The @kbd{v h} (@code{calc-head}) command is a handy way to extract
- the first element of the result vector, discarding the error term.
- The initial guess can be a real number, in which case Calc searches
- for a real solution near that number, or a complex number, in which
- case Calc searches the whole complex plane near that number for a
- solution, or it can be an interval form which restricts the search
- to real numbers inside that interval.
- Calc tries to use @kbd{a d} to take the derivative of the equation.
- If this succeeds, it uses Newton's method. If the equation is not
- differentiable Calc uses a bisection method. (If Newton's method
- appears to be going astray, Calc switches over to bisection if it
- can, or otherwise gives up. In this case it may help to try again
- with a slightly different initial guess.) If the initial guess is a
- complex number, the function must be differentiable.
- If the formula (or the difference between the sides of an equation)
- is negative at one end of the interval you specify and positive at
- the other end, the root finder is guaranteed to find a root.
- Otherwise, Calc subdivides the interval into small parts looking for
- positive and negative values to bracket the root. When your guess is
- an interval, Calc will not look outside that interval for a root.
- @kindex H a R
- @tindex wroot
- The @kbd{H a R} [@code{wroot}] command is similar to @kbd{a R}, except
- that if the initial guess is an interval for which the function has
- the same sign at both ends, then rather than subdividing the interval
- Calc attempts to widen it to enclose a root. Use this mode if
- you are not sure if the function has a root in your interval.
- If the function is not differentiable, and you give a simple number
- instead of an interval as your initial guess, Calc uses this widening
- process even if you did not type the Hyperbolic flag. (If the function
- @emph{is} differentiable, Calc uses Newton's method which does not
- require a bounding interval in order to work.)
- If Calc leaves the @code{root} or @code{wroot} function in symbolic
- form on the stack, it will normally display an explanation for why
- no root was found. If you miss this explanation, press @kbd{w}
- (@code{calc-why}) to get it back.
- @node Minimization, Numerical Systems of Equations, Root Finding, Numerical Solutions
- @subsection Minimization
- @noindent
- @kindex a N
- @kindex H a N
- @kindex a X
- @kindex H a X
- @pindex calc-find-minimum
- @pindex calc-find-maximum
- @tindex minimize
- @tindex maximize
- @cindex Minimization, numerical
- The @kbd{a N} (@code{calc-find-minimum}) [@code{minimize}] command
- finds a minimum value for a formula. It is very similar in operation
- to @kbd{a R} (@code{calc-find-root}): You give the formula and an initial
- guess on the stack, and are prompted for the name of a variable. The guess
- may be either a number near the desired minimum, or an interval enclosing
- the desired minimum. The function returns a vector containing the
- value of the variable which minimizes the formula's value, along
- with the minimum value itself.
- Note that this command looks for a @emph{local} minimum. Many functions
- have more than one minimum; some, like @c{$x \sin x$}
- @cite{x sin(x)}, have infinitely
- many. In fact, there is no easy way to define the ``global'' minimum
- of @c{$x \sin x$}
- @cite{x sin(x)} but Calc can still locate any particular local minimum
- for you. Calc basically goes downhill from the initial guess until it
- finds a point at which the function's value is greater both to the left
- and to the right. Calc does not use derivatives when minimizing a function.
- If your initial guess is an interval and it looks like the minimum
- occurs at one or the other endpoint of the interval, Calc will return
- that endpoint only if that endpoint is closed; thus, minimizing @cite{17 x}
- over @cite{[2..3]} will return @cite{[2, 38]}, but minimizing over
- @cite{(2..3]} would report no minimum found. In general, you should
- use closed intervals to find literally the minimum value in that
- range of @cite{x}, or open intervals to find the local minimum, if
- any, that happens to lie in that range.
- Most functions are smooth and flat near their minimum values. Because
- of this flatness, if the current precision is, say, 12 digits, the
- variable can only be determined meaningfully to about six digits. Thus
- you should set the precision to twice as many digits as you need in your
- answer.
- @ignore
- @mindex wmin@idots
- @end ignore
- @tindex wminimize
- @ignore
- @mindex wmax@idots
- @end ignore
- @tindex wmaximize
- The @kbd{H a N} [@code{wminimize}] command, analogously to @kbd{H a R},
- expands the guess interval to enclose a minimum rather than requiring
- that the minimum lie inside the interval you supply.
- The @kbd{a X} (@code{calc-find-maximum}) [@code{maximize}] and
- @kbd{H a X} [@code{wmaximize}] commands effectively minimize the
- negative of the formula you supply.
- The formula must evaluate to a real number at all points inside the
- interval (or near the initial guess if the guess is a number). If
- the initial guess is a complex number the variable will be minimized
- over the complex numbers; if it is real or an interval it will
- be minimized over the reals.
- @node Numerical Systems of Equations, , Minimization, Numerical Solutions
- @subsection Systems of Equations
- @noindent
- @cindex Systems of equations, numerical
- The @kbd{a R} command can also solve systems of equations. In this
- case, the equation should instead be a vector of equations, the
- guess should instead be a vector of numbers (intervals are not
- supported), and the variable should be a vector of variables. You
- can omit the brackets while entering the list of variables. Each
- equation must be differentiable by each variable for this mode to
- work. The result will be a vector of two vectors: The variable
- values that solved the system of equations, and the differences
- between the sides of the equations with those variable values.
- There must be the same number of equations as variables. Since
- only plain numbers are allowed as guesses, the Hyperbolic flag has
- no effect when solving a system of equations.
- It is also possible to minimize over many variables with @kbd{a N}
- (or maximize with @kbd{a X}). Once again the variable name should
- be replaced by a vector of variables, and the initial guess should
- be an equal-sized vector of initial guesses. But, unlike the case of
- multidimensional @kbd{a R}, the formula being minimized should
- still be a single formula, @emph{not} a vector. Beware that
- multidimensional minimization is currently @emph{very} slow.
- @node Curve Fitting, Summations, Numerical Solutions, Algebra
- @section Curve Fitting
- @noindent
- The @kbd{a F} command fits a set of data to a @dfn{model formula},
- such as @cite{y = m x + b} where @cite{m} and @cite{b} are parameters
- to be determined. For a typical set of measured data there will be
- no single @cite{m} and @cite{b} that exactly fit the data; in this
- case, Calc chooses values of the parameters that provide the closest
- possible fit.
- @menu
- * Linear Fits::
- * Polynomial and Multilinear Fits::
- * Error Estimates for Fits::
- * Standard Nonlinear Models::
- * Curve Fitting Details::
- * Interpolation::
- @end menu
- @node Linear Fits, Polynomial and Multilinear Fits, Curve Fitting, Curve Fitting
- @subsection Linear Fits
- @noindent
- @kindex a F
- @pindex calc-curve-fit
- @tindex fit
- @cindex Linear regression
- @cindex Least-squares fits
- The @kbd{a F} (@code{calc-curve-fit}) [@code{fit}] command attempts
- to fit a set of data (@cite{x} and @cite{y} vectors of numbers) to a
- straight line, polynomial, or other function of @cite{x}. For the
- moment we will consider only the case of fitting to a line, and we
- will ignore the issue of whether or not the model was in fact a good
- fit for the data.
- In a standard linear least-squares fit, we have a set of @cite{(x,y)}
- data points that we wish to fit to the model @cite{y = m x + b}
- by adjusting the parameters @cite{m} and @cite{b} to make the @cite{y}
- values calculated from the formula be as close as possible to the actual
- @cite{y} values in the data set. (In a polynomial fit, the model is
- instead, say, @cite{y = a x^3 + b x^2 + c x + d}. In a multilinear fit,
- we have data points of the form @cite{(x_1,x_2,x_3,y)} and our model is
- @cite{y = a x_1 + b x_2 + c x_3 + d}. These will be discussed later.)
- In the model formula, variables like @cite{x} and @cite{x_2} are called
- the @dfn{independent variables}, and @cite{y} is the @dfn{dependent
- variable}. Variables like @cite{m}, @cite{a}, and @cite{b} are called
- the @dfn{parameters} of the model.
- The @kbd{a F} command takes the data set to be fitted from the stack.
- By default, it expects the data in the form of a matrix. For example,
- for a linear or polynomial fit, this would be a @c{$2\times N$}
- @asis{2xN} matrix where
- the first row is a list of @cite{x} values and the second row has the
- corresponding @cite{y} values. For the multilinear fit shown above,
- the matrix would have four rows (@cite{x_1}, @cite{x_2}, @cite{x_3}, and
- @cite{y}, respectively).
- If you happen to have an @c{$N\times2$}
- @asis{Nx2} matrix instead of a @c{$2\times N$}
- @asis{2xN} matrix,
- just press @kbd{v t} first to transpose the matrix.
- After you type @kbd{a F}, Calc prompts you to select a model. For a
- linear fit, press the digit @kbd{1}.
- Calc then prompts for you to name the variables. By default it chooses
- high letters like @cite{x} and @cite{y} for independent variables and
- low letters like @cite{a} and @cite{b} for parameters. (The dependent
- variable doesn't need a name.) The two kinds of variables are separated
- by a semicolon. Since you generally care more about the names of the
- independent variables than of the parameters, Calc also allows you to
- name only those and let the parameters use default names.
- For example, suppose the data matrix
- @ifinfo
- @example
- @group
- [ [ 1, 2, 3, 4, 5 ]
- [ 5, 7, 9, 11, 13 ] ]
- @end group
- @end example
- @end ifinfo
- @tex
- \turnoffactive
- \turnoffactive
- \beforedisplay
- $$ \pmatrix{ 1 & 2 & 3 & 4 & 5 \cr
- 5 & 7 & 9 & 11 & 13 }
- $$
- \afterdisplay
- @end tex
- @noindent
- is on the stack and we wish to do a simple linear fit. Type
- @kbd{a F}, then @kbd{1} for the model, then @key{RET} to use
- the default names. The result will be the formula @cite{3 + 2 x}
- on the stack. Calc has created the model expression @kbd{a + b x},
- then found the optimal values of @cite{a} and @cite{b} to fit the
- data. (In this case, it was able to find an exact fit.) Calc then
- substituted those values for @cite{a} and @cite{b} in the model
- formula.
- The @kbd{a F} command puts two entries in the trail. One is, as
- always, a copy of the result that went to the stack; the other is
- a vector of the actual parameter values, written as equations:
- @cite{[a = 3, b = 2]}, in case you'd rather read them in a list
- than pick them out of the formula. (You can type @kbd{t y}
- to move this vector to the stack; see @ref{Trail Commands}.
- Specifying a different independent variable name will affect the
- resulting formula: @kbd{a F 1 k @key{RET}} produces @kbd{3 + 2 k}.
- Changing the parameter names (say, @kbd{a F 1 k;b,m @key{RET}}) will affect
- the equations that go into the trail.
- @tex
- \bigskip
- @end tex
- To see what happens when the fit is not exact, we could change
- the number 13 in the data matrix to 14 and try the fit again.
- The result is:
- @example
- 2.6 + 2.2 x
- @end example
- Evaluating this formula, say with @kbd{v x 5 @key{RET} @key{TAB} V M $ @key{RET}}, shows
- a reasonably close match to the y-values in the data.
- @example
- [4.8, 7., 9.2, 11.4, 13.6]
- @end example
- Since there is no line which passes through all the @var{n} data points,
- Calc has chosen a line that best approximates the data points using
- the method of least squares. The idea is to define the @dfn{chi-square}
- error measure
- @ifinfo
- @example
- chi^2 = sum((y_i - (a + b x_i))^2, i, 1, N)
- @end example
- @end ifinfo
- @tex
- \turnoffactive
- \beforedisplay
- $$ \chi^2 = \sum_{i=1}^N (y_i - (a + b x_i))^2 $$
- \afterdisplay
- @end tex
- @noindent
- which is clearly zero if @cite{a + b x} exactly fits all data points,
- and increases as various @cite{a + b x_i} values fail to match the
- corresponding @cite{y_i} values. There are several reasons why the
- summand is squared, one of them being to ensure that @c{$\chi^2 \ge 0$}
- @cite{chi^2 >= 0}.
- Least-squares fitting simply chooses the values of @cite{a} and @cite{b}
- for which the error @c{$\chi^2$}
- @cite{chi^2} is as small as possible.
- Other kinds of models do the same thing but with a different model
- formula in place of @cite{a + b x_i}.
- @tex
- \bigskip
- @end tex
- A numeric prefix argument causes the @kbd{a F} command to take the
- data in some other form than one big matrix. A positive argument @var{n}
- will take @var{N} items from the stack, corresponding to the @var{n} rows
- of a data matrix. In the linear case, @var{n} must be 2 since there
- is always one independent variable and one dependent variable.
- A prefix of zero or plain @kbd{C-u} is a compromise; Calc takes two
- items from the stack, an @var{n}-row matrix of @cite{x} values, and a
- vector of @cite{y} values. If there is only one independent variable,
- the @cite{x} values can be either a one-row matrix or a plain vector,
- in which case the @kbd{C-u} prefix is the same as a @w{@kbd{C-u 2}} prefix.
- @node Polynomial and Multilinear Fits, Error Estimates for Fits, Linear Fits, Curve Fitting
- @subsection Polynomial and Multilinear Fits
- @noindent
- To fit the data to higher-order polynomials, just type one of the
- digits @kbd{2} through @kbd{9} when prompted for a model. For example,
- we could fit the original data matrix from the previous section
- (with 13, not 14) to a parabola instead of a line by typing
- @kbd{a F 2 @key{RET}}.
- @example
- 2.00000000001 x - 1.5e-12 x^2 + 2.99999999999
- @end example
- Note that since the constant and linear terms are enough to fit the
- data exactly, it's no surprise that Calc chose a tiny contribution
- for @cite{x^2}. (The fact that it's not exactly zero is due only
- to roundoff error. Since our data are exact integers, we could get
- an exact answer by typing @kbd{m f} first to get fraction mode.
- Then the @cite{x^2} term would vanish altogether. Usually, though,
- the data being fitted will be approximate floats so fraction mode
- won't help.)
- Doing the @kbd{a F 2} fit on the data set with 14 instead of 13
- gives a much larger @cite{x^2} contribution, as Calc bends the
- line slightly to improve the fit.
- @example
- 0.142857142855 x^2 + 1.34285714287 x + 3.59999999998
- @end example
- An important result from the theory of polynomial fitting is that it
- is always possible to fit @var{n} data points exactly using a polynomial
- of degree @i{@var{n}-1}, sometimes called an @dfn{interpolating polynomial}.
- Using the modified (14) data matrix, a model number of 4 gives
- a polynomial that exactly matches all five data points:
- @example
- 0.04167 x^4 - 0.4167 x^3 + 1.458 x^2 - 0.08333 x + 4.
- @end example
- The actual coefficients we get with a precision of 12, like
- @cite{0.0416666663588}, clearly suffer from loss of precision.
- It is a good idea to increase the working precision to several
- digits beyond what you need when you do a fitting operation.
- Or, if your data are exact, use fraction mode to get exact
- results.
- You can type @kbd{i} instead of a digit at the model prompt to fit
- the data exactly to a polynomial. This just counts the number of
- columns of the data matrix to choose the degree of the polynomial
- automatically.
- Fitting data ``exactly'' to high-degree polynomials is not always
- a good idea, though. High-degree polynomials have a tendency to
- wiggle uncontrollably in between the fitting data points. Also,
- if the exact-fit polynomial is going to be used to interpolate or
- extrapolate the data, it is numerically better to use the @kbd{a p}
- command described below. @xref{Interpolation}.
- @tex
- \bigskip
- @end tex
- Another generalization of the linear model is to assume the
- @cite{y} values are a sum of linear contributions from several
- @cite{x} values. This is a @dfn{multilinear} fit, and it is also
- selected by the @kbd{1} digit key. (Calc decides whether the fit
- is linear or multilinear by counting the rows in the data matrix.)
- Given the data matrix,
- @example
- @group
- [ [ 1, 2, 3, 4, 5 ]
- [ 7, 2, 3, 5, 2 ]
- [ 14.5, 15, 18.5, 22.5, 24 ] ]
- @end group
- @end example
- @noindent
- the command @kbd{a F 1 @key{RET}} will call the first row @cite{x} and the
- second row @cite{y}, and will fit the values in the third row to the
- model @cite{a + b x + c y}.
- @example
- 8. + 3. x + 0.5 y
- @end example
- Calc can do multilinear fits with any number of independent variables
- (i.e., with any number of data rows).
- @tex
- \bigskip
- @end tex
- Yet another variation is @dfn{homogeneous} linear models, in which
- the constant term is known to be zero. In the linear case, this
- means the model formula is simply @cite{a x}; in the multilinear
- case, the model might be @cite{a x + b y + c z}; and in the polynomial
- case, the model could be @cite{a x + b x^2 + c x^3}. You can get
- a homogeneous linear or multilinear model by pressing the letter
- @kbd{h} followed by a regular model key, like @kbd{1} or @kbd{2}.
- It is certainly possible to have other constrained linear models,
- like @cite{2.3 + a x} or @cite{a - 4 x}. While there is no single
- key to select models like these, a later section shows how to enter
- any desired model by hand. In the first case, for example, you
- would enter @kbd{a F ' 2.3 + a x}.
- Another class of models that will work but must be entered by hand
- are multinomial fits, e.g., @cite{a + b x + c y + d x^2 + e y^2 + f x y}.
- @node Error Estimates for Fits, Standard Nonlinear Models, Polynomial and Multilinear Fits, Curve Fitting
- @subsection Error Estimates for Fits
- @noindent
- @kindex H a F
- @tindex efit
- With the Hyperbolic flag, @kbd{H a F} [@code{efit}] performs the same
- fitting operation as @kbd{a F}, but reports the coefficients as error
- forms instead of plain numbers. Fitting our two data matrices (first
- with 13, then with 14) to a line with @kbd{H a F} gives the results,
- @example
- 3. + 2. x
- 2.6 +/- 0.382970843103 + 2.2 +/- 0.115470053838 x
- @end example
- In the first case the estimated errors are zero because the linear
- fit is perfect. In the second case, the errors are nonzero but
- moderately small, because the data are still very close to linear.
- It is also possible for the @emph{input} to a fitting operation to
- contain error forms. The data values must either all include errors
- or all be plain numbers. Error forms can go anywhere but generally
- go on the numbers in the last row of the data matrix. If the last
- row contains error forms
- `@var{y_i}@w{ @t{+/-} }@c{$\sigma_i$}
- @var{sigma_i}', then the @c{$\chi^2$}
- @cite{chi^2}
- statistic is now,
- @ifinfo
- @example
- chi^2 = sum(((y_i - (a + b x_i)) / sigma_i)^2, i, 1, N)
- @end example
- @end ifinfo
- @tex
- \turnoffactive
- \beforedisplay
- $$ \chi^2 = \sum_{i=1}^N \left(y_i - (a + b x_i) \over \sigma_i\right)^2 $$
- \afterdisplay
- @end tex
- @noindent
- so that data points with larger error estimates contribute less to
- the fitting operation.
- If there are error forms on other rows of the data matrix, all the
- errors for a given data point are combined; the square root of the
- sum of the squares of the errors forms the @c{$\sigma_i$}
- @cite{sigma_i} used for
- the data point.
- Both @kbd{a F} and @kbd{H a F} can accept error forms in the input
- matrix, although if you are concerned about error analysis you will
- probably use @kbd{H a F} so that the output also contains error
- estimates.
- If the input contains error forms but all the @c{$\sigma_i$}
- @cite{sigma_i} values are
- the same, it is easy to see that the resulting fitted model will be
- the same as if the input did not have error forms at all (@c{$\chi^2$}
- @cite{chi^2}
- is simply scaled uniformly by @c{$1 / \sigma^2$}
- @cite{1 / sigma^2}, which doesn't affect
- where it has a minimum). But there @emph{will} be a difference
- in the estimated errors of the coefficients reported by @kbd{H a F}.
- Consult any text on statistical modelling of data for a discussion
- of where these error estimates come from and how they should be
- interpreted.
- @tex
- \bigskip
- @end tex
- @kindex I a F
- @tindex xfit
- With the Inverse flag, @kbd{I a F} [@code{xfit}] produces even more
- information. The result is a vector of six items:
- @enumerate
- @item
- The model formula with error forms for its coefficients or
- parameters. This is the result that @kbd{H a F} would have
- produced.
- @item
- A vector of ``raw'' parameter values for the model. These are the
- polynomial coefficients or other parameters as plain numbers, in the
- same order as the parameters appeared in the final prompt of the
- @kbd{I a F} command. For polynomials of degree @cite{d}, this vector
- will have length @cite{M = d+1} with the constant term first.
- @item
- The covariance matrix @cite{C} computed from the fit. This is
- an @var{m}x@var{m} symmetric matrix; the diagonal elements
- @c{$C_{jj}$}
- @cite{C_j_j} are the variances @c{$\sigma_j^2$}
- @cite{sigma_j^2} of the parameters.
- The other elements are covariances @c{$\sigma_{ij}^2$}
- @cite{sigma_i_j^2} that describe the
- correlation between pairs of parameters. (A related set of
- numbers, the @dfn{linear correlation coefficients} @c{$r_{ij}$}
- @cite{r_i_j},
- are defined as @c{$\sigma_{ij}^2 / \sigma_i \, \sigma_j$}
- @cite{sigma_i_j^2 / sigma_i sigma_j}.)
- @item
- A vector of @cite{M} ``parameter filter'' functions whose
- meanings are described below. If no filters are necessary this
- will instead be an empty vector; this is always the case for the
- polynomial and multilinear fits described so far.
- @item
- The value of @c{$\chi^2$}
- @cite{chi^2} for the fit, calculated by the formulas
- shown above. This gives a measure of the quality of the fit;
- statisticians consider @c{$\chi^2 \approx N - M$}
- @cite{chi^2 = N - M} to indicate a moderately good fit
- (where again @cite{N} is the number of data points and @cite{M}
- is the number of parameters).
- @item
- A measure of goodness of fit expressed as a probability @cite{Q}.
- This is computed from the @code{utpc} probability distribution
- function using @c{$\chi^2$}
- @cite{chi^2} with @cite{N - M} degrees of freedom. A
- value of 0.5 implies a good fit; some texts recommend that often
- @cite{Q = 0.1} or even 0.001 can signify an acceptable fit. In
- particular, @c{$\chi^2$}
- @cite{chi^2} statistics assume the errors in your inputs
- follow a normal (Gaussian) distribution; if they don't, you may
- have to accept smaller values of @cite{Q}.
- The @cite{Q} value is computed only if the input included error
- estimates. Otherwise, Calc will report the symbol @code{nan}
- for @cite{Q}. The reason is that in this case the @c{$\chi^2$}
- @cite{chi^2}
- value has effectively been used to estimate the original errors
- in the input, and thus there is no redundant information left
- over to use for a confidence test.
- @end enumerate
- @node Standard Nonlinear Models, Curve Fitting Details, Error Estimates for Fits, Curve Fitting
- @subsection Standard Nonlinear Models
- @noindent
- The @kbd{a F} command also accepts other kinds of models besides
- lines and polynomials. Some common models have quick single-key
- abbreviations; others must be entered by hand as algebraic formulas.
- Here is a complete list of the standard models recognized by @kbd{a F}:
- @table @kbd
- @item 1
- Linear or multilinear. @i{a + b x + c y + d z}.
- @item 2-9
- Polynomials. @i{a + b x + c x^2 + d x^3}.
- @item e
- Exponential. @i{a} @t{exp}@i{(b x)} @t{exp}@i{(c y)}.
- @item E
- Base-10 exponential. @i{a} @t{10^}@i{(b x)} @t{10^}@i{(c y)}.
- @item x
- Exponential (alternate notation). @t{exp}@i{(a + b x + c y)}.
- @item X
- Base-10 exponential (alternate). @t{10^}@i{(a + b x + c y)}.
- @item l
- Logarithmic. @i{a + b} @t{ln}@i{(x) + c} @t{ln}@i{(y)}.
- @item L
- Base-10 logarithmic. @i{a + b} @t{log10}@i{(x) + c} @t{log10}@i{(y)}.
- @item ^
- General exponential. @i{a b^x c^y}.
- @item p
- Power law. @i{a x^b y^c}.
- @item q
- Quadratic. @i{a + b (x-c)^2 + d (x-e)^2}.
- @item g
- Gaussian. @c{${a \over b \sqrt{2 \pi}} \exp\left( -{1 \over 2} \left( x - c \over b \right)^2 \right)$}
- @i{(a / b sqrt(2 pi)) exp(-0.5*((x-c)/b)^2)}.
- @end table
- All of these models are used in the usual way; just press the appropriate
- letter at the model prompt, and choose variable names if you wish. The
- result will be a formula as shown in the above table, with the best-fit
- values of the parameters substituted. (You may find it easier to read
- the parameter values from the vector that is placed in the trail.)
- All models except Gaussian and polynomials can generalize as shown to any
- number of independent variables. Also, all the built-in models have an
- additive or multiplicative parameter shown as @cite{a} in the above table
- which can be replaced by zero or one, as appropriate, by typing @kbd{h}
- before the model key.
- Note that many of these models are essentially equivalent, but express
- the parameters slightly differently. For example, @cite{a b^x} and
- the other two exponential models are all algebraic rearrangements of
- each other. Also, the ``quadratic'' model is just a degree-2 polynomial
- with the parameters expressed differently. Use whichever form best
- matches the problem.
- The HP-28/48 calculators support four different models for curve
- fitting, called @code{LIN}, @code{LOG}, @code{EXP}, and @code{PWR}.
- These correspond to Calc models @samp{a + b x}, @samp{a + b ln(x)},
- @samp{a exp(b x)}, and @samp{a x^b}, respectively. In each case,
- @cite{a} is what the HP-48 identifies as the ``intercept,'' and
- @cite{b} is what it calls the ``slope.''
- @tex
- \bigskip
- @end tex
- If the model you want doesn't appear on this list, press @kbd{'}
- (the apostrophe key) at the model prompt to enter any algebraic
- formula, such as @kbd{m x - b}, as the model. (Not all models
- will work, though---see the next section for details.)
- The model can also be an equation like @cite{y = m x + b}.
- In this case, Calc thinks of all the rows of the data matrix on
- equal terms; this model effectively has two parameters
- (@cite{m} and @cite{b}) and two independent variables (@cite{x}
- and @cite{y}), with no ``dependent'' variables. Model equations
- do not need to take this @cite{y =} form. For example, the
- implicit line equation @cite{a x + b y = 1} works fine as a
- model.
- When you enter a model, Calc makes an alphabetical list of all
- the variables that appear in the model. These are used for the
- default parameters, independent variables, and dependent variable
- (in that order). If you enter a plain formula (not an equation),
- Calc assumes the dependent variable does not appear in the formula
- and thus does not need a name.
- For example, if the model formula has the variables @cite{a,mu,sigma,t,x},
- and the data matrix has three rows (meaning two independent variables),
- Calc will use @cite{a,mu,sigma} as the default parameters, and the
- data rows will be named @cite{t} and @cite{x}, respectively. If you
- enter an equation instead of a plain formula, Calc will use @cite{a,mu}
- as the parameters, and @cite{sigma,t,x} as the three independent
- variables.
- You can, of course, override these choices by entering something
- different at the prompt. If you leave some variables out of the list,
- those variables must have stored values and those stored values will
- be used as constants in the model. (Stored values for the parameters
- and independent variables are ignored by the @kbd{a F} command.)
- If you list only independent variables, all the remaining variables
- in the model formula will become parameters.
- If there are @kbd{$} signs in the model you type, they will stand
- for parameters and all other variables (in alphabetical order)
- will be independent. Use @kbd{$} for one parameter, @kbd{$$} for
- another, and so on. Thus @kbd{$ x + $$} is another way to describe
- a linear model.
- If you type a @kbd{$} instead of @kbd{'} at the model prompt itself,
- Calc will take the model formula from the stack. (The data must then
- appear at the second stack level.) The same conventions are used to
- choose which variables in the formula are independent by default and
- which are parameters.
- Models taken from the stack can also be expressed as vectors of
- two or three elements, @cite{[@var{model}, @var{vars}]} or
- @cite{[@var{model}, @var{vars}, @var{params}]}. Each of @var{vars}
- and @var{params} may be either a variable or a vector of variables.
- (If @var{params} is omitted, all variables in @var{model} except
- those listed as @var{vars} are parameters.)@refill
- When you enter a model manually with @kbd{'}, Calc puts a 3-vector
- describing the model in the trail so you can get it back if you wish.
- @tex
- \bigskip
- @end tex
- @vindex Model1
- @vindex Model2
- Finally, you can store a model in one of the Calc variables
- @code{Model1} or @code{Model2}, then use this model by typing
- @kbd{a F u} or @kbd{a F U} (respectively). The value stored in
- the variable can be any of the formats that @kbd{a F $} would
- accept for a model on the stack.
- @tex
- \bigskip
- @end tex
- Calc uses the principal values of inverse functions like @code{ln}
- and @code{arcsin} when doing fits. For example, when you enter
- the model @samp{y = sin(a t + b)} Calc actually uses the easier
- form @samp{arcsin(y) = a t + b}. The @code{arcsin} function always
- returns results in the range from @i{-90} to 90 degrees (or the
- equivalent range in radians). Suppose you had data that you
- believed to represent roughly three oscillations of a sine wave,
- so that the argument of the sine might go from zero to @c{$3\times360$}
- @i{3*360} degrees.
- The above model would appear to be a good way to determine the
- true frequency and phase of the sine wave, but in practice it
- would fail utterly. The righthand side of the actual model
- @samp{arcsin(y) = a t + b} will grow smoothly with @cite{t}, but
- the lefthand side will bounce back and forth between @i{-90} and 90.
- No values of @cite{a} and @cite{b} can make the two sides match,
- even approximately.
- There is no good solution to this problem at present. You could
- restrict your data to small enough ranges so that the above problem
- doesn't occur (i.e., not straddling any peaks in the sine wave).
- Or, in this case, you could use a totally different method such as
- Fourier analysis, which is beyond the scope of the @kbd{a F} command.
- (Unfortunately, Calc does not currently have any facilities for
- taking Fourier and related transforms.)
- @node Curve Fitting Details, Interpolation, Standard Nonlinear Models, Curve Fitting
- @subsection Curve Fitting Details
- @noindent
- Calc's internal least-squares fitter can only handle multilinear
- models. More precisely, it can handle any model of the form
- @cite{a f(x,y,z) + b g(x,y,z) + c h(x,y,z)}, where @cite{a,b,c}
- are the parameters and @cite{x,y,z} are the independent variables
- (of course there can be any number of each, not just three).
- In a simple multilinear or polynomial fit, it is easy to see how
- to convert the model into this form. For example, if the model
- is @cite{a + b x + c x^2}, then @cite{f(x) = 1}, @cite{g(x) = x},
- and @cite{h(x) = x^2} are suitable functions.
- For other models, Calc uses a variety of algebraic manipulations
- to try to put the problem into the form
- @smallexample
- Y(x,y,z) = A(a,b,c) F(x,y,z) + B(a,b,c) G(x,y,z) + C(a,b,c) H(x,y,z)
- @end smallexample
- @noindent
- where @cite{Y,A,B,C,F,G,H} are arbitrary functions. It computes
- @cite{Y}, @cite{F}, @cite{G}, and @cite{H} for all the data points,
- does a standard linear fit to find the values of @cite{A}, @cite{B},
- and @cite{C}, then uses the equation solver to solve for @cite{a,b,c}
- in terms of @cite{A,B,C}.
- A remarkable number of models can be cast into this general form.
- We'll look at two examples here to see how it works. The power-law
- model @cite{y = a x^b} with two independent variables and two parameters
- can be rewritten as follows:
- @example
- y = a x^b
- y = a exp(b ln(x))
- y = exp(ln(a) + b ln(x))
- ln(y) = ln(a) + b ln(x)
- @end example
- @noindent
- which matches the desired form with @c{$Y = \ln(y)$}
- @cite{Y = ln(y)}, @c{$A = \ln(a)$}
- @cite{A = ln(a)},
- @cite{F = 1}, @cite{B = b}, and @c{$G = \ln(x)$}
- @cite{G = ln(x)}. Calc thus computes
- the logarithms of your @cite{y} and @cite{x} values, does a linear fit
- for @cite{A} and @cite{B}, then solves to get @c{$a = \exp(A)$}
- @cite{a = exp(A)} and
- @cite{b = B}.
- Another interesting example is the ``quadratic'' model, which can
- be handled by expanding according to the distributive law.
- @example
- y = a + b*(x - c)^2
- y = a + b c^2 - 2 b c x + b x^2
- @end example
- @noindent
- which matches with @cite{Y = y}, @cite{A = a + b c^2}, @cite{F = 1},
- @cite{B = -2 b c}, @cite{G = x} (the @i{-2} factor could just as easily
- have been put into @cite{G} instead of @cite{B}), @cite{C = b}, and
- @cite{H = x^2}.
- The Gaussian model looks quite complicated, but a closer examination
- shows that it's actually similar to the quadratic model but with an
- exponential that can be brought to the top and moved into @cite{Y}.
- An example of a model that cannot be put into general linear
- form is a Gaussian with a constant background added on, i.e.,
- @cite{d} + the regular Gaussian formula. If you have a model like
- this, your best bet is to replace enough of your parameters with
- constants to make the model linearizable, then adjust the constants
- manually by doing a series of fits. You can compare the fits by
- graphing them, by examining the goodness-of-fit measures returned by
- @kbd{I a F}, or by some other method suitable to your application.
- Note that some models can be linearized in several ways. The
- Gaussian-plus-@var{d} model can be linearized by setting @cite{d}
- (the background) to a constant, or by setting @cite{b} (the standard
- deviation) and @cite{c} (the mean) to constants.
- To fit a model with constants substituted for some parameters, just
- store suitable values in those parameter variables, then omit them
- from the list of parameters when you answer the variables prompt.
- @tex
- \bigskip
- @end tex
- A last desperate step would be to use the general-purpose
- @code{minimize} function rather than @code{fit}. After all, both
- functions solve the problem of minimizing an expression (the @c{$\chi^2$}
- @cite{chi^2}
- sum) by adjusting certain parameters in the expression. The @kbd{a F}
- command is able to use a vastly more efficient algorithm due to its
- special knowledge about linear chi-square sums, but the @kbd{a N}
- command can do the same thing by brute force.
- A compromise would be to pick out a few parameters without which the
- fit is linearizable, and use @code{minimize} on a call to @code{fit}
- which efficiently takes care of the rest of the parameters. The thing
- to be minimized would be the value of @c{$\chi^2$}
- @cite{chi^2} returned as
- the fifth result of the @code{xfit} function:
- @smallexample
- minimize(xfit(gaus(a,b,c,d,x), x, [a,b,c], data)_5, d, guess)
- @end smallexample
- @noindent
- where @code{gaus} represents the Gaussian model with background,
- @code{data} represents the data matrix, and @code{guess} represents
- the initial guess for @cite{d} that @code{minimize} requires.
- This operation will only be, shall we say, extraordinarily slow
- rather than astronomically slow (as would be the case if @code{minimize}
- were used by itself to solve the problem).
- @tex
- \bigskip
- @end tex
- The @kbd{I a F} [@code{xfit}] command is somewhat trickier when
- nonlinear models are used. The second item in the result is the
- vector of ``raw'' parameters @cite{A}, @cite{B}, @cite{C}. The
- covariance matrix is written in terms of those raw parameters.
- The fifth item is a vector of @dfn{filter} expressions. This
- is the empty vector @samp{[]} if the raw parameters were the same
- as the requested parameters, i.e., if @cite{A = a}, @cite{B = b},
- and so on (which is always true if the model is already linear
- in the parameters as written, e.g., for polynomial fits). If the
- parameters had to be rearranged, the fifth item is instead a vector
- of one formula per parameter in the original model. The raw
- parameters are expressed in these ``filter'' formulas as
- @samp{fitdummy(1)} for @cite{A}, @samp{fitdummy(2)} for @cite{B},
- and so on.
- When Calc needs to modify the model to return the result, it replaces
- @samp{fitdummy(1)} in all the filters with the first item in the raw
- parameters list, and so on for the other raw parameters, then
- evaluates the resulting filter formulas to get the actual parameter
- values to be substituted into the original model. In the case of
- @kbd{H a F} and @kbd{I a F} where the parameters must be error forms,
- Calc uses the square roots of the diagonal entries of the covariance
- matrix as error values for the raw parameters, then lets Calc's
- standard error-form arithmetic take it from there.
- If you use @kbd{I a F} with a nonlinear model, be sure to remember
- that the covariance matrix is in terms of the raw parameters,
- @emph{not} the actual requested parameters. It's up to you to
- figure out how to interpret the covariances in the presence of
- nontrivial filter functions.
- Things are also complicated when the input contains error forms.
- Suppose there are three independent and dependent variables, @cite{x},
- @cite{y}, and @cite{z}, one or more of which are error forms in the
- data. Calc combines all the error values by taking the square root
- of the sum of the squares of the errors. It then changes @cite{x}
- and @cite{y} to be plain numbers, and makes @cite{z} into an error
- form with this combined error. The @cite{Y(x,y,z)} part of the
- linearized model is evaluated, and the result should be an error
- form. The error part of that result is used for @c{$\sigma_i$}
- @cite{sigma_i} for
- the data point. If for some reason @cite{Y(x,y,z)} does not return
- an error form, the combined error from @cite{z} is used directly
- for @c{$\sigma_i$}
- @cite{sigma_i}. Finally, @cite{z} is also stripped of its error
- for use in computing @cite{F(x,y,z)}, @cite{G(x,y,z)} and so on;
- the righthand side of the linearized model is computed in regular
- arithmetic with no error forms.
- (While these rules may seem complicated, they are designed to do
- the most reasonable thing in the typical case that @cite{Y(x,y,z)}
- depends only on the dependent variable @cite{z}, and in fact is
- often simply equal to @cite{z}. For common cases like polynomials
- and multilinear models, the combined error is simply used as the
- @c{$\sigma$}
- @cite{sigma} for the data point with no further ado.)
- @tex
- \bigskip
- @end tex
- @vindex FitRules
- It may be the case that the model you wish to use is linearizable,
- but Calc's built-in rules are unable to figure it out. Calc uses
- its algebraic rewrite mechanism to linearize a model. The rewrite
- rules are kept in the variable @code{FitRules}. You can edit this
- variable using the @kbd{s e FitRules} command; in fact, there is
- a special @kbd{s F} command just for editing @code{FitRules}.
- @xref{Operations on Variables}.
- @xref{Rewrite Rules}, for a discussion of rewrite rules.
- @ignore
- @starindex
- @end ignore
- @tindex fitvar
- @ignore
- @starindex
- @end ignore
- @ignore
- @mindex @idots
- @end ignore
- @tindex fitparam
- @ignore
- @starindex
- @end ignore
- @ignore
- @mindex @null
- @end ignore
- @tindex fitmodel
- @ignore
- @starindex
- @end ignore
- @ignore
- @mindex @null
- @end ignore
- @tindex fitsystem
- @ignore
- @starindex
- @end ignore
- @ignore
- @mindex @null
- @end ignore
- @tindex fitdummy
- Calc uses @code{FitRules} as follows. First, it converts the model
- to an equation if necessary and encloses the model equation in a
- call to the function @code{fitmodel} (which is not actually a defined
- function in Calc; it is only used as a placeholder by the rewrite rules).
- Parameter variables are renamed to function calls @samp{fitparam(1)},
- @samp{fitparam(2)}, and so on, and independent variables are renamed
- to @samp{fitvar(1)}, @samp{fitvar(2)}, etc. The dependent variable
- is the highest-numbered @code{fitvar}. For example, the power law
- model @cite{a x^b} is converted to @cite{y = a x^b}, then to
- @smallexample
- @group
- fitmodel(fitvar(2) = fitparam(1) fitvar(1)^fitparam(2))
- @end group
- @end smallexample
- Calc then applies the rewrites as if by @samp{C-u 0 a r FitRules}.
- (The zero prefix means that rewriting should continue until no further
- changes are possible.)
- When rewriting is complete, the @code{fitmodel} call should have
- been replaced by a @code{fitsystem} call that looks like this:
- @example
- fitsystem(@var{Y}, @var{FGH}, @var{abc})
- @end example
- @noindent
- where @var{Y} is a formula that describes the function @cite{Y(x,y,z)},
- @var{FGH} is the vector of formulas @cite{[F(x,y,z), G(x,y,z), H(x,y,z)]},
- and @var{abc} is the vector of parameter filters which refer to the
- raw parameters as @samp{fitdummy(1)} for @cite{A}, @samp{fitdummy(2)}
- for @cite{B}, etc. While the number of raw parameters (the length of
- the @var{FGH} vector) is usually the same as the number of original
- parameters (the length of the @var{abc} vector), this is not required.
- The power law model eventually boils down to
- @smallexample
- @group
- fitsystem(ln(fitvar(2)),
- [1, ln(fitvar(1))],
- [exp(fitdummy(1)), fitdummy(2)])
- @end group
- @end smallexample
- The actual implementation of @code{FitRules} is complicated; it
- proceeds in four phases. First, common rearrangements are done
- to try to bring linear terms together and to isolate functions like
- @code{exp} and @code{ln} either all the way ``out'' (so that they
- can be put into @var{Y}) or all the way ``in'' (so that they can
- be put into @var{abc} or @var{FGH}). In particular, all
- non-constant powers are converted to logs-and-exponentials form,
- and the distributive law is used to expand products of sums.
- Quotients are rewritten to use the @samp{fitinv} function, where
- @samp{fitinv(x)} represents @cite{1/x} while the @code{FitRules}
- are operating. (The use of @code{fitinv} makes recognition of
- linear-looking forms easier.) If you modify @code{FitRules}, you
- will probably only need to modify the rules for this phase.
- Phase two, whose rules can actually also apply during phases one
- and three, first rewrites @code{fitmodel} to a two-argument
- form @samp{fitmodel(@var{Y}, @var{model})}, where @var{Y} is
- initially zero and @var{model} has been changed from @cite{a=b}
- to @cite{a-b} form. It then tries to peel off invertible functions
- from the outside of @var{model} and put them into @var{Y} instead,
- calling the equation solver to invert the functions. Finally, when
- this is no longer possible, the @code{fitmodel} is changed to a
- four-argument @code{fitsystem}, where the fourth argument is
- @var{model} and the @var{FGH} and @var{abc} vectors are initially
- empty. (The last vector is really @var{ABC}, corresponding to
- raw parameters, for now.)
- Phase three converts a sum of items in the @var{model} to a sum
- of @samp{fitpart(@var{a}, @var{b}, @var{c})} terms which represent
- terms @samp{@var{a}*@var{b}*@var{c}} of the sum, where @var{a}
- is all factors that do not involve any variables, @var{b} is all
- factors that involve only parameters, and @var{c} is the factors
- that involve only independent variables. (If this decomposition
- is not possible, the rule set will not complete and Calc will
- complain that the model is too complex.) Then @code{fitpart}s
- with equal @var{b} or @var{c} components are merged back together
- using the distributive law in order to minimize the number of
- raw parameters needed.
- Phase four moves the @code{fitpart} terms into the @var{FGH} and
- @var{ABC} vectors. Also, some of the algebraic expansions that
- were done in phase 1 are undone now to make the formulas more
- computationally efficient. Finally, it calls the solver one more
- time to convert the @var{ABC} vector to an @var{abc} vector, and
- removes the fourth @var{model} argument (which by now will be zero)
- to obtain the three-argument @code{fitsystem} that the linear
- least-squares solver wants to see.
- @ignore
- @starindex
- @end ignore
- @ignore
- @mindex hasfit@idots
- @end ignore
- @tindex hasfitparams
- @ignore
- @starindex
- @end ignore
- @ignore
- @mindex @null
- @end ignore
- @tindex hasfitvars
- Two functions which are useful in connection with @code{FitRules}
- are @samp{hasfitparams(x)} and @samp{hasfitvars(x)}, which check
- whether @cite{x} refers to any parameters or independent variables,
- respectively. Specifically, these functions return ``true'' if the
- argument contains any @code{fitparam} (or @code{fitvar}) function
- calls, and ``false'' otherwise. (Recall that ``true'' means a
- nonzero number, and ``false'' means zero. The actual nonzero number
- returned is the largest @var{n} from all the @samp{fitparam(@var{n})}s
- or @samp{fitvar(@var{n})}s, respectively, that appear in the formula.)
- @tex
- \bigskip
- @end tex
- The @code{fit} function in algebraic notation normally takes four
- arguments, @samp{fit(@var{model}, @var{vars}, @var{params}, @var{data})},
- where @var{model} is the model formula as it would be typed after
- @kbd{a F '}, @var{vars} is the independent variable or a vector of
- independent variables, @var{params} likewise gives the parameter(s),
- and @var{data} is the data matrix. Note that the length of @var{vars}
- must be equal to the number of rows in @var{data} if @var{model} is
- an equation, or one less than the number of rows if @var{model} is
- a plain formula. (Actually, a name for the dependent variable is
- allowed but will be ignored in the plain-formula case.)
- If @var{params} is omitted, the parameters are all variables in
- @var{model} except those that appear in @var{vars}. If @var{vars}
- is also omitted, Calc sorts all the variables that appear in
- @var{model} alphabetically and uses the higher ones for @var{vars}
- and the lower ones for @var{params}.
- Alternatively, @samp{fit(@var{modelvec}, @var{data})} is allowed
- where @var{modelvec} is a 2- or 3-vector describing the model
- and variables, as discussed previously.
- If Calc is unable to do the fit, the @code{fit} function is left
- in symbolic form, ordinarily with an explanatory message. The
- message will be ``Model expression is too complex'' if the
- linearizer was unable to put the model into the required form.
- The @code{efit} (corresponding to @kbd{H a F}) and @code{xfit}
- (for @kbd{I a F}) functions are completely analogous.
- @node Interpolation, , Curve Fitting Details, Curve Fitting
- @subsection Polynomial Interpolation
- @kindex a p
- @pindex calc-poly-interp
- @tindex polint
- The @kbd{a p} (@code{calc-poly-interp}) [@code{polint}] command does
- a polynomial interpolation at a particular @cite{x} value. It takes
- two arguments from the stack: A data matrix of the sort used by
- @kbd{a F}, and a single number which represents the desired @cite{x}
- value. Calc effectively does an exact polynomial fit as if by @kbd{a F i},
- then substitutes the @cite{x} value into the result in order to get an
- approximate @cite{y} value based on the fit. (Calc does not actually
- use @kbd{a F i}, however; it uses a direct method which is both more
- efficient and more numerically stable.)
- The result of @kbd{a p} is actually a vector of two values: The @cite{y}
- value approximation, and an error measure @cite{dy} that reflects Calc's
- estimation of the probable error of the approximation at that value of
- @cite{x}. If the input @cite{x} is equal to any of the @cite{x} values
- in the data matrix, the output @cite{y} will be the corresponding @cite{y}
- value from the matrix, and the output @cite{dy} will be exactly zero.
- A prefix argument of 2 causes @kbd{a p} to take separate x- and
- y-vectors from the stack instead of one data matrix.
- If @cite{x} is a vector of numbers, @kbd{a p} will return a matrix of
- interpolated results for each of those @cite{x} values. (The matrix will
- have two columns, the @cite{y} values and the @cite{dy} values.)
- If @cite{x} is a formula instead of a number, the @code{polint} function
- remains in symbolic form; use the @kbd{a "} command to expand it out to
- a formula that describes the fit in symbolic terms.
- In all cases, the @kbd{a p} command leaves the data vectors or matrix
- on the stack. Only the @cite{x} value is replaced by the result.
- @kindex H a p
- @tindex ratint
- The @kbd{H a p} [@code{ratint}] command does a rational function
- interpolation. It is used exactly like @kbd{a p}, except that it
- uses as its model the quotient of two polynomials. If there are
- @cite{N} data points, the numerator and denominator polynomials will
- each have degree @cite{N/2} (if @cite{N} is odd, the denominator will
- have degree one higher than the numerator).
- Rational approximations have the advantage that they can accurately
- describe functions that have poles (points at which the function's value
- goes to infinity, so that the denominator polynomial of the approximation
- goes to zero). If @cite{x} corresponds to a pole of the fitted rational
- function, then the result will be a division by zero. If Infinite mode
- is enabled, the result will be @samp{[uinf, uinf]}.
- There is no way to get the actual coefficients of the rational function
- used by @kbd{H a p}. (The algorithm never generates these coefficients
- explicitly, and quotients of polynomials are beyond @w{@kbd{a F}}'s
- capabilities to fit.)
- @node Summations, Logical Operations, Curve Fitting, Algebra
- @section Summations
- @noindent
- @cindex Summation of a series
- @kindex a +
- @pindex calc-summation
- @tindex sum
- The @kbd{a +} (@code{calc-summation}) [@code{sum}] command computes
- the sum of a formula over a certain range of index values. The formula
- is taken from the top of the stack; the command prompts for the
- name of the summation index variable, the lower limit of the
- sum (any formula), and the upper limit of the sum. If you
- enter a blank line at any of these prompts, that prompt and
- any later ones are answered by reading additional elements from
- the stack. Thus, @kbd{' k^2 @key{RET} ' k @key{RET} 1 @key{RET} 5 @key{RET} a + @key{RET}}
- produces the result 55.
- @tex
- \turnoffactive
- $$ \sum_{k=1}^5 k^2 = 55 $$
- @end tex
- The choice of index variable is arbitrary, but it's best not to
- use a variable with a stored value. In particular, while
- @code{i} is often a favorite index variable, it should be avoided
- in Calc because @code{i} has the imaginary constant @cite{(0, 1)}
- as a value. If you pressed @kbd{=} on a sum over @code{i}, it would
- be changed to a nonsensical sum over the ``variable'' @cite{(0, 1)}!
- If you really want to use @code{i} as an index variable, use
- @w{@kbd{s u i @key{RET}}} first to ``unstore'' this variable.
- (@xref{Storing Variables}.)
- A numeric prefix argument steps the index by that amount rather
- than by one. Thus @kbd{' a_k @key{RET} C-u -2 a + k @key{RET} 10 @key{RET} 0 @key{RET}}
- yields @samp{a_10 + a_8 + a_6 + a_4 + a_2 + a_0}. A prefix
- argument of plain @kbd{C-u} causes @kbd{a +} to prompt for the
- step value, in which case you can enter any formula or enter
- a blank line to take the step value from the stack. With the
- @kbd{C-u} prefix, @kbd{a +} can take up to five arguments from
- the stack: The formula, the variable, the lower limit, the
- upper limit, and (at the top of the stack), the step value.
- Calc knows how to do certain sums in closed form. For example,
- @samp{sum(6 k^2, k, 1, n) = @w{2 n^3} + 3 n^2 + n}. In particular,
- this is possible if the formula being summed is polynomial or
- exponential in the index variable. Sums of logarithms are
- transformed into logarithms of products. Sums of trigonometric
- and hyperbolic functions are transformed to sums of exponentials
- and then done in closed form. Also, of course, sums in which the
- lower and upper limits are both numbers can always be evaluated
- just by grinding them out, although Calc will use closed forms
- whenever it can for the sake of efficiency.
- The notation for sums in algebraic formulas is
- @samp{sum(@var{expr}, @var{var}, @var{low}, @var{high}, @var{step})}.
- If @var{step} is omitted, it defaults to one. If @var{high} is
- omitted, @var{low} is actually the upper limit and the lower limit
- is one. If @var{low} is also omitted, the limits are @samp{-inf}
- and @samp{inf}, respectively.
- Infinite sums can sometimes be evaluated: @samp{sum(.5^k, k, 1, inf)}
- returns @cite{1}. This is done by evaluating the sum in closed
- form (to @samp{1. - 0.5^n} in this case), then evaluating this
- formula with @code{n} set to @code{inf}. Calc's usual rules
- for ``infinite'' arithmetic can find the answer from there. If
- infinite arithmetic yields a @samp{nan}, or if the sum cannot be
- solved in closed form, Calc leaves the @code{sum} function in
- symbolic form. @xref{Infinities}.
- As a special feature, if the limits are infinite (or omitted, as
- described above) but the formula includes vectors subscripted by
- expressions that involve the iteration variable, Calc narrows
- the limits to include only the range of integers which result in
- legal subscripts for the vector. For example, the sum
- @samp{sum(k [a,b,c,d,e,f,g]_(2k),k)} evaluates to @samp{b + 2 d + 3 f}.
- The limits of a sum do not need to be integers. For example,
- @samp{sum(a_k, k, 0, 2 n, n)} produces @samp{a_0 + a_n + a_(2 n)}.
- Calc computes the number of iterations using the formula
- @samp{1 + (@var{high} - @var{low}) / @var{step}}, which must,
- after simplification as if by @kbd{a s}, evaluate to an integer.
- If the number of iterations according to the above formula does
- not come out to an integer, the sum is illegal and will be left
- in symbolic form. However, closed forms are still supplied, and
- you are on your honor not to misuse the resulting formulas by
- substituting mismatched bounds into them. For example,
- @samp{sum(k, k, 1, 10, 2)} is invalid, but Calc will go ahead and
- evaluate the closed form solution for the limits 1 and 10 to get
- the rather dubious answer, 29.25.
- If the lower limit is greater than the upper limit (assuming a
- positive step size), the result is generally zero. However,
- Calc only guarantees a zero result when the upper limit is
- exactly one step less than the lower limit, i.e., if the number
- of iterations is @i{-1}. Thus @samp{sum(f(k), k, n, n-1)} is zero
- but the sum from @samp{n} to @samp{n-2} may report a nonzero value
- if Calc used a closed form solution.
- Calc's logical predicates like @cite{a < b} return 1 for ``true''
- and 0 for ``false.'' @xref{Logical Operations}. This can be
- used to advantage for building conditional sums. For example,
- @samp{sum(prime(k)*k^2, k, 1, 20)} is the sum of the squares of all
- prime numbers from 1 to 20; the @code{prime} predicate returns 1 if
- its argument is prime and 0 otherwise. You can read this expression
- as ``the sum of @cite{k^2}, where @cite{k} is prime.'' Indeed,
- @samp{sum(prime(k)*k^2, k)} would represent the sum of @emph{all} primes
- squared, since the limits default to plus and minus infinity, but
- there are no such sums that Calc's built-in rules can do in
- closed form.
- As another example, @samp{sum((k != k_0) * f(k), k, 1, n)} is the
- sum of @cite{f(k)} for all @cite{k} from 1 to @cite{n}, excluding
- one value @cite{k_0}. Slightly more tricky is the summand
- @samp{(k != k_0) / (k - k_0)}, which is an attempt to describe
- the sum of all @cite{1/(k-k_0)} except at @cite{k = k_0}, where
- this would be a division by zero. But at @cite{k = k_0}, this
- formula works out to the indeterminate form @cite{0 / 0}, which
- Calc will not assume is zero. Better would be to use
- @samp{(k != k_0) ? 1/(k-k_0) : 0}; the @samp{? :} operator does
- an ``if-then-else'' test: This expression says, ``if @c{$k \ne k_0$}
- @cite{k != k_0},
- then @cite{1/(k-k_0)}, else zero.'' Now the formula @cite{1/(k-k_0)}
- will not even be evaluated by Calc when @cite{k = k_0}.
- @cindex Alternating sums
- @kindex a -
- @pindex calc-alt-summation
- @tindex asum
- The @kbd{a -} (@code{calc-alt-summation}) [@code{asum}] command
- computes an alternating sum. Successive terms of the sequence
- are given alternating signs, with the first term (corresponding
- to the lower index value) being positive. Alternating sums
- are converted to normal sums with an extra term of the form
- @samp{(-1)^(k-@var{low})}. This formula is adjusted appropriately
- if the step value is other than one. For example, the Taylor
- series for the sine function is @samp{asum(x^k / k!, k, 1, inf, 2)}.
- (Calc cannot evaluate this infinite series, but it can approximate
- it if you replace @code{inf} with any particular odd number.)
- Calc converts this series to a regular sum with a step of one,
- namely @samp{sum((-1)^k x^(2k+1) / (2k+1)!, k, 0, inf)}.
- @cindex Product of a sequence
- @kindex a *
- @pindex calc-product
- @tindex prod
- The @kbd{a *} (@code{calc-product}) [@code{prod}] command is
- the analogous way to take a product of many terms. Calc also knows
- some closed forms for products, such as @samp{prod(k, k, 1, n) = n!}.
- Conditional products can be written @samp{prod(k^prime(k), k, 1, n)}
- or @samp{prod(prime(k) ? k : 1, k, 1, n)}.
- @kindex a T
- @pindex calc-tabulate
- @tindex table
- The @kbd{a T} (@code{calc-tabulate}) [@code{table}] command
- evaluates a formula at a series of iterated index values, just
- like @code{sum} and @code{prod}, but its result is simply a
- vector of the results. For example, @samp{table(a_i, i, 1, 7, 2)}
- produces @samp{[a_1, a_3, a_5, a_7]}.
- @node Logical Operations, Rewrite Rules, Summations, Algebra
- @section Logical Operations
- @noindent
- The following commands and algebraic functions return true/false values,
- where 1 represents ``true'' and 0 represents ``false.'' In cases where
- a truth value is required (such as for the condition part of a rewrite
- rule, or as the condition for a @w{@kbd{Z [ Z ]}} control structure), any
- nonzero value is accepted to mean ``true.'' (Specifically, anything
- for which @code{dnonzero} returns 1 is ``true,'' and anything for
- which @code{dnonzero} returns 0 or cannot decide is assumed ``false.''
- Note that this means that @w{@kbd{Z [ Z ]}} will execute the ``then''
- portion if its condition is provably true, but it will execute the
- ``else'' portion for any condition like @cite{a = b} that is not
- provably true, even if it might be true. Algebraic functions that
- have conditions as arguments, like @code{? :} and @code{&&}, remain
- unevaluated if the condition is neither provably true nor provably
- false. @xref{Declarations}.)
- @kindex a =
- @pindex calc-equal-to
- @tindex eq
- @tindex =
- @tindex ==
- The @kbd{a =} (@code{calc-equal-to}) command, or @samp{eq(a,b)} function
- (which can also be written @samp{a = b} or @samp{a == b} in an algebraic
- formula) is true if @cite{a} and @cite{b} are equal, either because they
- are identical expressions, or because they are numbers which are
- numerically equal. (Thus the integer 1 is considered equal to the float
- 1.0.) If the equality of @cite{a} and @cite{b} cannot be determined,
- the comparison is left in symbolic form. Note that as a command, this
- operation pops two values from the stack and pushes back either a 1 or
- a 0, or a formula @samp{a = b} if the values' equality cannot be determined.
- Many Calc commands use @samp{=} formulas to represent @dfn{equations}.
- For example, the @kbd{a S} (@code{calc-solve-for}) command rearranges
- an equation to solve for a given variable. The @kbd{a M}
- (@code{calc-map-equation}) command can be used to apply any
- function to both sides of an equation; for example, @kbd{2 a M *}
- multiplies both sides of the equation by two. Note that just
- @kbd{2 *} would not do the same thing; it would produce the formula
- @samp{2 (a = b)} which represents 2 if the equality is true or
- zero if not.
- The @code{eq} function with more than two arguments (e.g., @kbd{C-u 3 a =}
- or @samp{a = b = c}) tests if all of its arguments are equal. In
- algebraic notation, the @samp{=} operator is unusual in that it is
- neither left- nor right-associative: @samp{a = b = c} is not the
- same as @samp{(a = b) = c} or @samp{a = (b = c)} (which each compare
- one variable with the 1 or 0 that results from comparing two other
- variables).
- @kindex a #
- @pindex calc-not-equal-to
- @tindex neq
- @tindex !=
- The @kbd{a #} (@code{calc-not-equal-to}) command, or @samp{neq(a,b)} or
- @samp{a != b} function, is true if @cite{a} and @cite{b} are not equal.
- This also works with more than two arguments; @samp{a != b != c != d}
- tests that all four of @cite{a}, @cite{b}, @cite{c}, and @cite{d} are
- distinct numbers.
- @kindex a <
- @tindex lt
- @ignore
- @mindex @idots
- @end ignore
- @kindex a >
- @ignore
- @mindex @null
- @end ignore
- @kindex a [
- @ignore
- @mindex @null
- @end ignore
- @kindex a ]
- @pindex calc-less-than
- @pindex calc-greater-than
- @pindex calc-less-equal
- @pindex calc-greater-equal
- @ignore
- @mindex @null
- @end ignore
- @tindex gt
- @ignore
- @mindex @null
- @end ignore
- @tindex leq
- @ignore
- @mindex @null
- @end ignore
- @tindex geq
- @ignore
- @mindex @null
- @end ignore
- @tindex <
- @ignore
- @mindex @null
- @end ignore
- @tindex >
- @ignore
- @mindex @null
- @end ignore
- @tindex <=
- @ignore
- @mindex @null
- @end ignore
- @tindex >=
- The @kbd{a <} (@code{calc-less-than}) [@samp{lt(a,b)} or @samp{a < b}]
- operation is true if @cite{a} is less than @cite{b}. Similar functions
- are @kbd{a >} (@code{calc-greater-than}) [@samp{gt(a,b)} or @samp{a > b}],
- @kbd{a [} (@code{calc-less-equal}) [@samp{leq(a,b)} or @samp{a <= b}], and
- @kbd{a ]} (@code{calc-greater-equal}) [@samp{geq(a,b)} or @samp{a >= b}].
- While the inequality functions like @code{lt} do not accept more
- than two arguments, the syntax @w{@samp{a <= b < c}} is translated to an
- equivalent expression involving intervals: @samp{b in [a .. c)}.
- (See the description of @code{in} below.) All four combinations
- of @samp{<} and @samp{<=} are allowed, or any of the four combinations
- of @samp{>} and @samp{>=}. Four-argument constructions like
- @samp{a < b < c < d}, and mixtures like @w{@samp{a < b = c}} that
- involve both equalities and inequalities, are not allowed.
- @kindex a .
- @pindex calc-remove-equal
- @tindex rmeq
- The @kbd{a .} (@code{calc-remove-equal}) [@code{rmeq}] command extracts
- the righthand side of the equation or inequality on the top of the
- stack. It also works elementwise on vectors. For example, if
- @samp{[x = 2.34, y = z / 2]} is on the stack, then @kbd{a .} produces
- @samp{[2.34, z / 2]}. As a special case, if the righthand side is a
- variable and the lefthand side is a number (as in @samp{2.34 = x}), then
- Calc keeps the lefthand side instead. Finally, this command works with
- assignments @samp{x := 2.34} as well as equations, always taking the
- the righthand side, and for @samp{=>} (evaluates-to) operators, always
- taking the lefthand side.
- @kindex a &
- @pindex calc-logical-and
- @tindex land
- @tindex &&
- The @kbd{a &} (@code{calc-logical-and}) [@samp{land(a,b)} or @samp{a && b}]
- function is true if both of its arguments are true, i.e., are
- non-zero numbers. In this case, the result will be either @cite{a} or
- @cite{b}, chosen arbitrarily. If either argument is zero, the result is
- zero. Otherwise, the formula is left in symbolic form.
- @kindex a |
- @pindex calc-logical-or
- @tindex lor
- @tindex ||
- The @kbd{a |} (@code{calc-logical-or}) [@samp{lor(a,b)} or @samp{a || b}]
- function is true if either or both of its arguments are true (nonzero).
- The result is whichever argument was nonzero, choosing arbitrarily if both
- are nonzero. If both @cite{a} and @cite{b} are zero, the result is
- zero.
- @kindex a !
- @pindex calc-logical-not
- @tindex lnot
- @tindex !
- The @kbd{a !} (@code{calc-logical-not}) [@samp{lnot(a)} or @samp{!@: a}]
- function is true if @cite{a} is false (zero), or false if @cite{a} is
- true (nonzero). It is left in symbolic form if @cite{a} is not a
- number.
- @kindex a :
- @pindex calc-logical-if
- @tindex if
- @ignore
- @mindex ? :
- @end ignore
- @tindex ?
- @ignore
- @mindex @null
- @end ignore
- @tindex :
- @cindex Arguments, not evaluated
- The @kbd{a :} (@code{calc-logical-if}) [@samp{if(a,b,c)} or @samp{a ? b :@: c}]
- function is equal to either @cite{b} or @cite{c} if @cite{a} is a nonzero
- number or zero, respectively. If @cite{a} is not a number, the test is
- left in symbolic form and neither @cite{b} nor @cite{c} is evaluated in
- any way. In algebraic formulas, this is one of the few Calc functions
- whose arguments are not automatically evaluated when the function itself
- is evaluated. The others are @code{lambda}, @code{quote}, and
- @code{condition}.
- One minor surprise to watch out for is that the formula @samp{a?3:4}
- will not work because the @samp{3:4} is parsed as a fraction instead of
- as three separate symbols. Type something like @samp{a ? 3 : 4} or
- @samp{a?(3):4} instead.
- As a special case, if @cite{a} evaluates to a vector, then both @cite{b}
- and @cite{c} are evaluated; the result is a vector of the same length
- as @cite{a} whose elements are chosen from corresponding elements of
- @cite{b} and @cite{c} according to whether each element of @cite{a}
- is zero or nonzero. Each of @cite{b} and @cite{c} must be either a
- vector of the same length as @cite{a}, or a non-vector which is matched
- with all elements of @cite{a}.
- @kindex a @{
- @pindex calc-in-set
- @tindex in
- The @kbd{a @{} (@code{calc-in-set}) [@samp{in(a,b)}] function is true if
- the number @cite{a} is in the set of numbers represented by @cite{b}.
- If @cite{b} is an interval form, @cite{a} must be one of the values
- encompassed by the interval. If @cite{b} is a vector, @cite{a} must be
- equal to one of the elements of the vector. (If any vector elements are
- intervals, @cite{a} must be in any of the intervals.) If @cite{b} is a
- plain number, @cite{a} must be numerically equal to @cite{b}.
- @xref{Set Operations}, for a group of commands that manipulate sets
- of this sort.
- @ignore
- @starindex
- @end ignore
- @tindex typeof
- The @samp{typeof(a)} function produces an integer or variable which
- characterizes @cite{a}. If @cite{a} is a number, vector, or variable,
- the result will be one of the following numbers:
- @example
- 1 Integer
- 2 Fraction
- 3 Floating-point number
- 4 HMS form
- 5 Rectangular complex number
- 6 Polar complex number
- 7 Error form
- 8 Interval form
- 9 Modulo form
- 10 Date-only form
- 11 Date/time form
- 12 Infinity (inf, uinf, or nan)
- 100 Variable
- 101 Vector (but not a matrix)
- 102 Matrix
- @end example
- Otherwise, @cite{a} is a formula, and the result is a variable which
- represents the name of the top-level function call.
- @ignore
- @starindex
- @end ignore
- @tindex integer
- @ignore
- @starindex
- @end ignore
- @tindex real
- @ignore
- @starindex
- @end ignore
- @tindex constant
- The @samp{integer(a)} function returns true if @cite{a} is an integer.
- The @samp{real(a)} function
- is true if @cite{a} is a real number, either integer, fraction, or
- float. The @samp{constant(a)} function returns true if @cite{a} is
- any of the objects for which @code{typeof} would produce an integer
- code result except for variables, and provided that the components of
- an object like a vector or error form are themselves constant.
- Note that infinities do not satisfy any of these tests, nor do
- special constants like @code{pi} and @code{e}.@refill
- @xref{Declarations}, for a set of similar functions that recognize
- formulas as well as actual numbers. For example, @samp{dint(floor(x))}
- is true because @samp{floor(x)} is provably integer-valued, but
- @samp{integer(floor(x))} does not because @samp{floor(x)} is not
- literally an integer constant.
- @ignore
- @starindex
- @end ignore
- @tindex refers
- The @samp{refers(a,b)} function is true if the variable (or sub-expression)
- @cite{b} appears in @cite{a}, or false otherwise. Unlike the other
- tests described here, this function returns a definite ``no'' answer
- even if its arguments are still in symbolic form. The only case where
- @code{refers} will be left unevaluated is if @cite{a} is a plain
- variable (different from @cite{b}).
- @ignore
- @starindex
- @end ignore
- @tindex negative
- The @samp{negative(a)} function returns true if @cite{a} ``looks'' negative,
- because it is a negative number, because it is of the form @cite{-x},
- or because it is a product or quotient with a term that looks negative.
- This is most useful in rewrite rules. Beware that @samp{negative(a)}
- evaluates to 1 or 0 for @emph{any} argument @cite{a}, so it can only
- be stored in a formula if the default simplifications are turned off
- first with @kbd{m O} (or if it appears in an unevaluated context such
- as a rewrite rule condition).
- @ignore
- @starindex
- @end ignore
- @tindex variable
- The @samp{variable(a)} function is true if @cite{a} is a variable,
- or false if not. If @cite{a} is a function call, this test is left
- in symbolic form. Built-in variables like @code{pi} and @code{inf}
- are considered variables like any others by this test.
- @ignore
- @starindex
- @end ignore
- @tindex nonvar
- The @samp{nonvar(a)} function is true if @cite{a} is a non-variable.
- If its argument is a variable it is left unsimplified; it never
- actually returns zero. However, since Calc's condition-testing
- commands consider ``false'' anything not provably true, this is
- often good enough.
- @ignore
- @starindex
- @end ignore
- @tindex lin
- @ignore
- @starindex
- @end ignore
- @tindex linnt
- @ignore
- @starindex
- @end ignore
- @tindex islin
- @ignore
- @starindex
- @end ignore
- @tindex islinnt
- @cindex Linearity testing
- The functions @code{lin}, @code{linnt}, @code{islin}, and @code{islinnt}
- check if an expression is ``linear,'' i.e., can be written in the form
- @cite{a + b x} for some constants @cite{a} and @cite{b}, and some
- variable or subformula @cite{x}. The function @samp{islin(f,x)} checks
- if formula @cite{f} is linear in @cite{x}, returning 1 if so. For
- example, @samp{islin(x,x)}, @samp{islin(-x,x)}, @samp{islin(3,x)}, and
- @samp{islin(x y / 3 - 2, x)} all return 1. The @samp{lin(f,x)} function
- is similar, except that instead of returning 1 it returns the vector
- @cite{[a, b, x]}. For the above examples, this vector would be
- @cite{[0, 1, x]}, @cite{[0, -1, x]}, @cite{[3, 0, x]}, and
- @cite{[-2, y/3, x]}, respectively. Both @code{lin} and @code{islin}
- generally remain unevaluated for expressions which are not linear,
- e.g., @samp{lin(2 x^2, x)} and @samp{lin(sin(x), x)}. The second
- argument can also be a formula; @samp{islin(2 + 3 sin(x), sin(x))}
- returns true.
- The @code{linnt} and @code{islinnt} functions perform a similar check,
- but require a ``non-trivial'' linear form, which means that the
- @cite{b} coefficient must be non-zero. For example, @samp{lin(2,x)}
- returns @cite{[2, 0, x]} and @samp{lin(y,x)} returns @cite{[y, 0, x]},
- but @samp{linnt(2,x)} and @samp{linnt(y,x)} are left unevaluated
- (in other words, these formulas are considered to be only ``trivially''
- linear in @cite{x}).
- All four linearity-testing functions allow you to omit the second
- argument, in which case the input may be linear in any non-constant
- formula. Here, the @cite{a=0}, @cite{b=1} case is also considered
- trivial, and only constant values for @cite{a} and @cite{b} are
- recognized. Thus, @samp{lin(2 x y)} returns @cite{[0, 2, x y]},
- @samp{lin(2 - x y)} returns @cite{[2, -1, x y]}, and @samp{lin(x y)}
- returns @cite{[0, 1, x y]}. The @code{linnt} function would allow the
- first two cases but not the third. Also, neither @code{lin} nor
- @code{linnt} accept plain constants as linear in the one-argument
- case: @samp{islin(2,x)} is true, but @samp{islin(2)} is false.
- @ignore
- @starindex
- @end ignore
- @tindex istrue
- The @samp{istrue(a)} function returns 1 if @cite{a} is a nonzero
- number or provably nonzero formula, or 0 if @cite{a} is anything else.
- Calls to @code{istrue} can only be manipulated if @kbd{m O} mode is
- used to make sure they are not evaluated prematurely. (Note that
- declarations are used when deciding whether a formula is true;
- @code{istrue} returns 1 when @code{dnonzero} would return 1, and
- it returns 0 when @code{dnonzero} would return 0 or leave itself
- in symbolic form.)
- @node Rewrite Rules, , Logical Operations, Algebra
- @section Rewrite Rules
- @noindent
- @cindex Rewrite rules
- @cindex Transformations
- @cindex Pattern matching
- @kindex a r
- @pindex calc-rewrite
- @tindex rewrite
- The @kbd{a r} (@code{calc-rewrite}) [@code{rewrite}] command makes
- substitutions in a formula according to a specified pattern or patterns
- known as @dfn{rewrite rules}. Whereas @kbd{a b} (@code{calc-substitute})
- matches literally, so that substituting @samp{sin(x)} with @samp{cos(x)}
- matches only the @code{sin} function applied to the variable @code{x},
- rewrite rules match general kinds of formulas; rewriting using the rule
- @samp{sin(x) := cos(x)} matches @code{sin} of any argument and replaces
- it with @code{cos} of that same argument. The only significance of the
- name @code{x} is that the same name is used on both sides of the rule.
- Rewrite rules rearrange formulas already in Calc's memory.
- @xref{Syntax Tables}, to read about @dfn{syntax rules}, which are
- similar to algebraic rewrite rules but operate when new algebraic
- entries are being parsed, converting strings of characters into
- Calc formulas.
- @menu
- * Entering Rewrite Rules::
- * Basic Rewrite Rules::
- * Conditional Rewrite Rules::
- * Algebraic Properties of Rewrite Rules::
- * Other Features of Rewrite Rules::
- * Composing Patterns in Rewrite Rules::
- * Nested Formulas with Rewrite Rules::
- * Multi-Phase Rewrite Rules::
- * Selections with Rewrite Rules::
- * Matching Commands::
- * Automatic Rewrites::
- * Debugging Rewrites::
- * Examples of Rewrite Rules::
- @end menu
- @node Entering Rewrite Rules, Basic Rewrite Rules, Rewrite Rules, Rewrite Rules
- @subsection Entering Rewrite Rules
- @noindent
- Rewrite rules normally use the ``assignment'' operator
- @samp{@var{old} := @var{new}}.
- This operator is equivalent to the function call @samp{assign(old, new)}.
- The @code{assign} function is undefined by itself in Calc, so an
- assignment formula such as a rewrite rule will be left alone by ordinary
- Calc commands. But certain commands, like the rewrite system, interpret
- assignments in special ways.@refill
- For example, the rule @samp{sin(x)^2 := 1-cos(x)^2} says to replace
- every occurrence of the sine of something, squared, with one minus the
- square of the cosine of that same thing. All by itself as a formula
- on the stack it does nothing, but when given to the @kbd{a r} command
- it turns that command into a sine-squared-to-cosine-squared converter.
- To specify a set of rules to be applied all at once, make a vector of
- rules.
- When @kbd{a r} prompts you to enter the rewrite rules, you can answer
- in several ways:
- @enumerate
- @item
- With a rule: @kbd{f(x) := g(x) @key{RET}}.
- @item
- With a vector of rules: @kbd{[f1(x) := g1(x), f2(x) := g2(x)] @key{RET}}.
- (You can omit the enclosing square brackets if you wish.)
- @item
- With the name of a variable that contains the rule or rules vector:
- @kbd{myrules @key{RET}}.
- @item
- With any formula except a rule, a vector, or a variable name; this
- will be interpreted as the @var{old} half of a rewrite rule,
- and you will be prompted a second time for the @var{new} half:
- @kbd{f(x) @key{RET} g(x) @key{RET}}.
- @item
- With a blank line, in which case the rule, rules vector, or variable
- will be taken from the top of the stack (and the formula to be
- rewritten will come from the second-to-top position).
- @end enumerate
- If you enter the rules directly (as opposed to using rules stored
- in a variable), those rules will be put into the Trail so that you
- can retrieve them later. @xref{Trail Commands}.
- It is most convenient to store rules you use often in a variable and
- invoke them by giving the variable name. The @kbd{s e}
- (@code{calc-edit-variable}) command is an easy way to create or edit a
- rule set stored in a variable. You may also wish to use @kbd{s p}
- (@code{calc-permanent-variable}) to save your rules permanently;
- @pxref{Operations on Variables}.@refill
- Rewrite rules are compiled into a special internal form for faster
- matching. If you enter a rule set directly it must be recompiled
- every time. If you store the rules in a variable and refer to them
- through that variable, they will be compiled once and saved away
- along with the variable for later reference. This is another good
- reason to store your rules in a variable.
- Calc also accepts an obsolete notation for rules, as vectors
- @samp{[@var{old}, @var{new}]}. But because it is easily confused with a
- vector of two rules, the use of this notation is no longer recommended.
- @node Basic Rewrite Rules, Conditional Rewrite Rules, Entering Rewrite Rules, Rewrite Rules
- @subsection Basic Rewrite Rules
- @noindent
- To match a particular formula @cite{x} with a particular rewrite rule
- @samp{@var{old} := @var{new}}, Calc compares the structure of @cite{x} with
- the structure of @var{old}. Variables that appear in @var{old} are
- treated as @dfn{meta-variables}; the corresponding positions in @cite{x}
- may contain any sub-formulas. For example, the pattern @samp{f(x,y)}
- would match the expression @samp{f(12, a+1)} with the meta-variable
- @samp{x} corresponding to 12 and with @samp{y} corresponding to
- @samp{a+1}. However, this pattern would not match @samp{f(12)} or
- @samp{g(12, a+1)}, since there is no assignment of the meta-variables
- that will make the pattern match these expressions. Notice that if
- the pattern is a single meta-variable, it will match any expression.
- If a given meta-variable appears more than once in @var{old}, the
- corresponding sub-formulas of @cite{x} must be identical. Thus
- the pattern @samp{f(x,x)} would match @samp{f(12, 12)} and
- @samp{f(a+1, a+1)} but not @samp{f(12, a+1)} or @samp{f(a+b, b+a)}.
- (@xref{Conditional Rewrite Rules}, for a way to match the latter.)
- Things other than variables must match exactly between the pattern
- and the target formula. To match a particular variable exactly, use
- the pseudo-function @samp{quote(v)} in the pattern. For example, the
- pattern @samp{x+quote(y)} matches @samp{x+y}, @samp{2+y}, or
- @samp{sin(a)+y}.
- The special variable names @samp{e}, @samp{pi}, @samp{i}, @samp{phi},
- @samp{gamma}, @samp{inf}, @samp{uinf}, and @samp{nan} always match
- literally. Thus the pattern @samp{sin(d + e + f)} acts exactly like
- @samp{sin(d + quote(e) + f)}.
- If the @var{old} pattern is found to match a given formula, that
- formula is replaced by @var{new}, where any occurrences in @var{new}
- of meta-variables from the pattern are replaced with the sub-formulas
- that they matched. Thus, applying the rule @samp{f(x,y) := g(y+x,x)}
- to @samp{f(12, a+1)} would produce @samp{g(a+13, 12)}.
- The normal @kbd{a r} command applies rewrite rules over and over
- throughout the target formula until no further changes are possible
- (up to a limit of 100 times). Use @kbd{C-u 1 a r} to make only one
- change at a time.
- @node Conditional Rewrite Rules, Algebraic Properties of Rewrite Rules, Basic Rewrite Rules, Rewrite Rules
- @subsection Conditional Rewrite Rules
- @noindent
- A rewrite rule can also be @dfn{conditional}, written in the form
- @samp{@var{old} := @var{new} :: @var{cond}}. (There is also the obsolete
- form @samp{[@var{old}, @var{new}, @var{cond}]}.) If a @var{cond} part
- is present in the
- rule, this is an additional condition that must be satisfied before
- the rule is accepted. Once @var{old} has been successfully matched
- to the target expression, @var{cond} is evaluated (with all the
- meta-variables substituted for the values they matched) and simplified
- with @kbd{a s} (@code{calc-simplify}). If the result is a nonzero
- number or any other object known to be nonzero (@pxref{Declarations}),
- the rule is accepted. If the result is zero or if it is a symbolic
- formula that is not known to be nonzero, the rule is rejected.
- @xref{Logical Operations}, for a number of functions that return
- 1 or 0 according to the results of various tests.@refill
- For example, the formula @samp{n > 0} simplifies to 1 or 0 if @cite{n}
- is replaced by a positive or nonpositive number, respectively (or if
- @cite{n} has been declared to be positive or nonpositive). Thus,
- the rule @samp{f(x,y) := g(y+x,x) :: x+y > 0} would apply to
- @samp{f(0, 4)} but not to @samp{f(-3, 2)} or @samp{f(12, a+1)}
- (assuming no outstanding declarations for @cite{a}). In the case of
- @samp{f(-3, 2)}, the condition can be shown not to be satisfied; in
- the case of @samp{f(12, a+1)}, the condition merely cannot be shown
- to be satisfied, but that is enough to reject the rule.
- While Calc will use declarations to reason about variables in the
- formula being rewritten, declarations do not apply to meta-variables.
- For example, the rule @samp{f(a) := g(a+1)} will match for any values
- of @samp{a}, such as complex numbers, vectors, or formulas, even if
- @samp{a} has been declared to be real or scalar. If you want the
- meta-variable @samp{a} to match only literal real numbers, use
- @samp{f(a) := g(a+1) :: real(a)}. If you want @samp{a} to match only
- reals and formulas which are provably real, use @samp{dreal(a)} as
- the condition.
- The @samp{::} operator is a shorthand for the @code{condition}
- function; @samp{@var{old} := @var{new} :: @var{cond}} is equivalent to
- the formula @samp{condition(assign(@var{old}, @var{new}), @var{cond})}.
- If you have several conditions, you can use @samp{... :: c1 :: c2 :: c3}
- or @samp{... :: c1 && c2 && c3}. The two are entirely equivalent.
- It is also possible to embed conditions inside the pattern:
- @samp{f(x :: x>0, y) := g(y+x, x)}. This is purely a notational
- convenience, though; where a condition appears in a rule has no
- effect on when it is tested. The rewrite-rule compiler automatically
- decides when it is best to test each condition while a rule is being
- matched.
- Certain conditions are handled as special cases by the rewrite rule
- system and are tested very efficiently: Where @cite{x} is any
- meta-variable, these conditions are @samp{integer(x)}, @samp{real(x)},
- @samp{constant(x)}, @samp{negative(x)}, @samp{x >= y} where @cite{y}
- is either a constant or another meta-variable and @samp{>=} may be
- replaced by any of the six relational operators, and @samp{x % a = b}
- where @cite{a} and @cite{b} are constants. Other conditions, like
- @samp{x >= y+1} or @samp{dreal(x)}, will be less efficient to check
- since Calc must bring the whole evaluator and simplifier into play.
- An interesting property of @samp{::} is that neither of its arguments
- will be touched by Calc's default simplifications. This is important
- because conditions often are expressions that cannot safely be
- evaluated early. For example, the @code{typeof} function never
- remains in symbolic form; entering @samp{typeof(a)} will put the
- number 100 (the type code for variables like @samp{a}) on the stack.
- But putting the condition @samp{... :: typeof(a) = 6} on the stack
- is safe since @samp{::} prevents the @code{typeof} from being
- evaluated until the condition is actually used by the rewrite system.
- Since @samp{::} protects its lefthand side, too, you can use a dummy
- condition to protect a rule that must itself not evaluate early.
- For example, it's not safe to put @samp{a(f,x) := apply(f, [x])} on
- the stack because it will immediately evaluate to @samp{a(f,x) := f(x)},
- where the meta-variable-ness of @code{f} on the righthand side has been
- lost. But @samp{a(f,x) := apply(f, [x]) :: 1} is safe, and of course
- the condition @samp{1} is always true (nonzero) so it has no effect on
- the functioning of the rule. (The rewrite compiler will ensure that
- it doesn't even impact the speed of matching the rule.)
- @node Algebraic Properties of Rewrite Rules, Other Features of Rewrite Rules, Conditional Rewrite Rules, Rewrite Rules
- @subsection Algebraic Properties of Rewrite Rules
- @noindent
- The rewrite mechanism understands the algebraic properties of functions
- like @samp{+} and @samp{*}. In particular, pattern matching takes
- the associativity and commutativity of the following functions into
- account:
- @smallexample
- + - * = != && || and or xor vint vunion vxor gcd lcm max min beta
- @end smallexample
- For example, the rewrite rule:
- @example
- a x + b x := (a + b) x
- @end example
- @noindent
- will match formulas of the form,
- @example
- a x + b x, x a + x b, a x + x b, x a + b x
- @end example
- Rewrites also understand the relationship between the @samp{+} and @samp{-}
- operators. The above rewrite rule will also match the formulas,
- @example
- a x - b x, x a - x b, a x - x b, x a - b x
- @end example
- @noindent
- by matching @samp{b} in the pattern to @samp{-b} from the formula.
- Applied to a sum of many terms like @samp{r + a x + s + b x + t}, this
- pattern will check all pairs of terms for possible matches. The rewrite
- will take whichever suitable pair it discovers first.
- In general, a pattern using an associative operator like @samp{a + b}
- will try @var{2 n} different ways to match a sum of @var{n} terms
- like @samp{x + y + z - w}. First, @samp{a} is matched against each
- of @samp{x}, @samp{y}, @samp{z}, and @samp{-w} in turn, with @samp{b}
- being matched to the remainders @samp{y + z - w}, @samp{x + z - w}, etc.
- If none of these succeed, then @samp{b} is matched against each of the
- four terms with @samp{a} matching the remainder. Half-and-half matches,
- like @samp{(x + y) + (z - w)}, are not tried.
- Note that @samp{*} is not commutative when applied to matrices, but
- rewrite rules pretend that it is. If you type @kbd{m v} to enable
- matrix mode (@pxref{Matrix Mode}), rewrite rules will match @samp{*}
- literally, ignoring its usual commutativity property. (In the
- current implementation, the associativity also vanishes---it is as
- if the pattern had been enclosed in a @code{plain} marker; see below.)
- If you are applying rewrites to formulas with matrices, it's best to
- enable matrix mode first to prevent algebraically incorrect rewrites
- from occurring.
- The pattern @samp{-x} will actually match any expression. For example,
- the rule
- @example
- f(-x) := -f(x)
- @end example
- @noindent
- will rewrite @samp{f(a)} to @samp{-f(-a)}. To avoid this, either use
- a @code{plain} marker as described below, or add a @samp{negative(x)}
- condition. The @code{negative} function is true if its argument
- ``looks'' negative, for example, because it is a negative number or
- because it is a formula like @samp{-x}. The new rule using this
- condition is:
- @example
- f(x) := -f(-x) :: negative(x) @r{or, equivalently,}
- f(-x) := -f(x) :: negative(-x)
- @end example
- In the same way, the pattern @samp{x - y} will match the sum @samp{a + b}
- by matching @samp{y} to @samp{-b}.
- The pattern @samp{a b} will also match the formula @samp{x/y} if
- @samp{y} is a number. Thus the rule @samp{a x + @w{b x} := (a+b) x}
- will also convert @samp{a x + x / 2} to @samp{(a + 0.5) x} (or
- @samp{(a + 1:2) x}, depending on the current fraction mode).
- Calc will @emph{not} take other liberties with @samp{*}, @samp{/}, and
- @samp{^}. For example, the pattern @samp{f(a b)} will not match
- @samp{f(x^2)}, and @samp{f(a + b)} will not match @samp{f(2 x)}, even
- though conceivably these patterns could match with @samp{a = b = x}.
- Nor will @samp{f(a b)} match @samp{f(x / y)} if @samp{y} is not a
- constant, even though it could be considered to match with @samp{a = x}
- and @samp{b = 1/y}. The reasons are partly for efficiency, and partly
- because while few mathematical operations are substantively different
- for addition and subtraction, often it is preferable to treat the cases
- of multiplication, division, and integer powers separately.
- Even more subtle is the rule set
- @example
- [ f(a) + f(b) := f(a + b), -f(a) := f(-a) ]
- @end example
- @noindent
- attempting to match @samp{f(x) - f(y)}. You might think that Calc
- will view this subtraction as @samp{f(x) + (-f(y))} and then apply
- the above two rules in turn, but actually this will not work because
- Calc only does this when considering rules for @samp{+} (like the
- first rule in this set). So it will see first that @samp{f(x) + (-f(y))}
- does not match @samp{f(a) + f(b)} for any assignments of the
- meta-variables, and then it will see that @samp{f(x) - f(y)} does
- not match @samp{-f(a)} for any assignment of @samp{a}. Because Calc
- tries only one rule at a time, it will not be able to rewrite
- @samp{f(x) - f(y)} with this rule set. An explicit @samp{f(a) - f(b)}
- rule will have to be added.
- Another thing patterns will @emph{not} do is break up complex numbers.
- The pattern @samp{myconj(a + @w{b i)} := a - b i} will work for formulas
- involving the special constant @samp{i} (such as @samp{3 - 4 i}), but
- it will not match actual complex numbers like @samp{(3, -4)}. A version
- of the above rule for complex numbers would be
- @example
- myconj(a) := re(a) - im(a) (0,1) :: im(a) != 0
- @end example
- @noindent
- (Because the @code{re} and @code{im} functions understand the properties
- of the special constant @samp{i}, this rule will also work for
- @samp{3 - 4 i}. In fact, this particular rule would probably be better
- without the @samp{im(a) != 0} condition, since if @samp{im(a) = 0} the
- righthand side of the rule will still give the correct answer for the
- conjugate of a real number.)
- It is also possible to specify optional arguments in patterns. The rule
- @example
- opt(a) x + opt(b) (x^opt(c) + opt(d)) := f(a, b, c, d)
- @end example
- @noindent
- will match the formula
- @example
- 5 (x^2 - 4) + 3 x
- @end example
- @noindent
- in a fairly straightforward manner, but it will also match reduced
- formulas like
- @example
- x + x^2, 2(x + 1) - x, x + x
- @end example
- @noindent
- producing, respectively,
- @example
- f(1, 1, 2, 0), f(-1, 2, 1, 1), f(1, 1, 1, 0)
- @end example
- (The latter two formulas can be entered only if default simplifications
- have been turned off with @kbd{m O}.)
- The default value for a term of a sum is zero. The default value
- for a part of a product, for a power, or for the denominator of a
- quotient, is one. Also, @samp{-x} matches the pattern @samp{opt(a) b}
- with @samp{a = -1}.
- In particular, the distributive-law rule can be refined to
- @example
- opt(a) x + opt(b) x := (a + b) x
- @end example
- @noindent
- so that it will convert, e.g., @samp{a x - x}, to @samp{(a - 1) x}.
- The pattern @samp{opt(a) + opt(b) x} matches almost any formulas which
- are linear in @samp{x}. You can also use the @code{lin} and @code{islin}
- functions with rewrite conditions to test for this; @pxref{Logical
- Operations}. These functions are not as convenient to use in rewrite
- rules, but they recognize more kinds of formulas as linear:
- @samp{x/z} is considered linear with @cite{b = 1/z} by @code{lin},
- but it will not match the above pattern because that pattern calls
- for a multiplication, not a division.
- As another example, the obvious rule to replace @samp{sin(x)^2 + cos(x)^2}
- by 1,
- @example
- sin(x)^2 + cos(x)^2 := 1
- @end example
- @noindent
- misses many cases because the sine and cosine may both be multiplied by
- an equal factor. Here's a more successful rule:
- @example
- opt(a) sin(x)^2 + opt(a) cos(x)^2 := a
- @end example
- Note that this rule will @emph{not} match @samp{sin(x)^2 + 6 cos(x)^2}
- because one @cite{a} would have ``matched'' 1 while the other matched 6.
- Calc automatically converts a rule like
- @example
- f(x-1, x) := g(x)
- @end example
- @noindent
- into the form
- @example
- f(temp, x) := g(x) :: temp = x-1
- @end example
- @noindent
- (where @code{temp} stands for a new, invented meta-variable that
- doesn't actually have a name). This modified rule will successfully
- match @samp{f(6, 7)}, binding @samp{temp} and @samp{x} to 6 and 7,
- respectively, then verifying that they differ by one even though
- @samp{6} does not superficially look like @samp{x-1}.
- However, Calc does not solve equations to interpret a rule. The
- following rule,
- @example
- f(x-1, x+1) := g(x)
- @end example
- @noindent
- will not work. That is, it will match @samp{f(a - 1 + b, a + 1 + b)}
- but not @samp{f(6, 8)}. Calc always interprets at least one occurrence
- of a variable by literal matching. If the variable appears ``isolated''
- then Calc is smart enough to use it for literal matching. But in this
- last example, Calc is forced to rewrite the rule to @samp{f(x-1, temp)
- := g(x) :: temp = x+1} where the @samp{x-1} term must correspond to an
- actual ``something-minus-one'' in the target formula.
- A successful way to write this would be @samp{f(x, x+2) := g(x+1)}.
- You could make this resemble the original form more closely by using
- @code{let} notation, which is described in the next section:
- @example
- f(xm1, x+1) := g(x) :: let(x := xm1+1)
- @end example
- Calc does this rewriting or ``conditionalizing'' for any sub-pattern
- which involves only the functions in the following list, operating
- only on constants and meta-variables which have already been matched
- elsewhere in the pattern. When matching a function call, Calc is
- careful to match arguments which are plain variables before arguments
- which are calls to any of the functions below, so that a pattern like
- @samp{f(x-1, x)} can be conditionalized even though the isolated
- @samp{x} comes after the @samp{x-1}.
- @smallexample
- + - * / \ % ^ abs sign round rounde roundu trunc floor ceil
- max min re im conj arg
- @end smallexample
- You can suppress all of the special treatments described in this
- section by surrounding a function call with a @code{plain} marker.
- This marker causes the function call which is its argument to be
- matched literally, without regard to commutativity, associativity,
- negation, or conditionalization. When you use @code{plain}, the
- ``deep structure'' of the formula being matched can show through.
- For example,
- @example
- plain(a - a b) := f(a, b)
- @end example
- @noindent
- will match only literal subtractions. However, the @code{plain}
- marker does not affect its arguments' arguments. In this case,
- commutativity and associativity is still considered while matching
- the @w{@samp{a b}} sub-pattern, so the whole pattern will match
- @samp{x - y x} as well as @samp{x - x y}. We could go still
- further and use
- @example
- plain(a - plain(a b)) := f(a, b)
- @end example
- @noindent
- which would do a completely strict match for the pattern.
- By contrast, the @code{quote} marker means that not only the
- function name but also the arguments must be literally the same.
- The above pattern will match @samp{x - x y} but
- @example
- quote(a - a b) := f(a, b)
- @end example
- @noindent
- will match only the single formula @samp{a - a b}. Also,
- @example
- quote(a - quote(a b)) := f(a, b)
- @end example
- @noindent
- will match only @samp{a - quote(a b)}---probably not the desired
- effect!
- A certain amount of algebra is also done when substituting the
- meta-variables on the righthand side of a rule. For example,
- in the rule
- @example
- a + f(b) := f(a + b)
- @end example
- @noindent
- matching @samp{f(x) - y} would produce @samp{f((-y) + x)} if
- taken literally, but the rewrite mechanism will simplify the
- righthand side to @samp{f(x - y)} automatically. (Of course,
- the default simplifications would do this anyway, so this
- special simplification is only noticeable if you have turned the
- default simplifications off.) This rewriting is done only when
- a meta-variable expands to a ``negative-looking'' expression.
- If this simplification is not desirable, you can use a @code{plain}
- marker on the righthand side:
- @example
- a + f(b) := f(plain(a + b))
- @end example
- @noindent
- In this example, we are still allowing the pattern-matcher to
- use all the algebra it can muster, but the righthand side will
- always simplify to a literal addition like @samp{f((-y) + x)}.
- @node Other Features of Rewrite Rules, Composing Patterns in Rewrite Rules, Algebraic Properties of Rewrite Rules, Rewrite Rules
- @subsection Other Features of Rewrite Rules
- @noindent
- Certain ``function names'' serve as markers in rewrite rules.
- Here is a complete list of these markers. First are listed the
- markers that work inside a pattern; then come the markers that
- work in the righthand side of a rule.
- @ignore
- @starindex
- @end ignore
- @tindex import
- One kind of marker, @samp{import(x)}, takes the place of a whole
- rule. Here @cite{x} is the name of a variable containing another
- rule set; those rules are ``spliced into'' the rule set that
- imports them. For example, if @samp{[f(a+b) := f(a) + f(b),
- f(a b) := a f(b) :: real(a)]} is stored in variable @samp{linearF},
- then the rule set @samp{[f(0) := 0, import(linearF)]} will apply
- all three rules. It is possible to modify the imported rules
- slightly: @samp{import(x, v1, x1, v2, x2, @dots{})} imports
- the rule set @cite{x} with all occurrences of @c{$v_1$}
- @cite{v1}, as either
- a variable name or a function name, replaced with @c{$x_1$}
- @cite{x1} and
- so on. (If @c{$v_1$}
- @cite{v1} is used as a function name, then @c{$x_1$}
- @cite{x1}
- must be either a function name itself or a @w{@samp{< >}} nameless
- function; @pxref{Specifying Operators}.) For example, @samp{[g(0) := 0,
- import(linearF, f, g)]} applies the linearity rules to the function
- @samp{g} instead of @samp{f}. Imports can be nested, but the
- import-with-renaming feature may fail to rename sub-imports properly.
- The special functions allowed in patterns are:
- @table @samp
- @item quote(x)
- @ignore
- @starindex
- @end ignore
- @tindex quote
- This pattern matches exactly @cite{x}; variable names in @cite{x} are
- not interpreted as meta-variables. The only flexibility is that
- numbers are compared for numeric equality, so that the pattern
- @samp{f(quote(12))} will match both @samp{f(12)} and @samp{f(12.0)}.
- (Numbers are always treated this way by the rewrite mechanism:
- The rule @samp{f(x,x) := g(x)} will match @samp{f(12, 12.0)}.
- The rewrite may produce either @samp{g(12)} or @samp{g(12.0)}
- as a result in this case.)
- @item plain(x)
- @ignore
- @starindex
- @end ignore
- @tindex plain
- Here @cite{x} must be a function call @samp{f(x1,x2,@dots{})}. This
- pattern matches a call to function @cite{f} with the specified
- argument patterns. No special knowledge of the properties of the
- function @cite{f} is used in this case; @samp{+} is not commutative or
- associative. Unlike @code{quote}, the arguments @samp{x1,x2,@dots{}}
- are treated as patterns. If you wish them to be treated ``plainly''
- as well, you must enclose them with more @code{plain} markers:
- @samp{plain(plain(@w{-a}) + plain(b c))}.
- @item opt(x,def)
- @ignore
- @starindex
- @end ignore
- @tindex opt
- Here @cite{x} must be a variable name. This must appear as an
- argument to a function or an element of a vector; it specifies that
- the argument or element is optional.
- As an argument to @samp{+}, @samp{-}, @samp{*}, @samp{&&}, or @samp{||},
- or as the second argument to @samp{/} or @samp{^}, the value @var{def}
- may be omitted. The pattern @samp{x + opt(y)} matches a sum by
- binding one summand to @cite{x} and the other to @cite{y}, and it
- matches anything else by binding the whole expression to @cite{x} and
- zero to @cite{y}. The other operators above work similarly.@refill
- For general miscellanous functions, the default value @code{def}
- must be specified. Optional arguments are dropped starting with
- the rightmost one during matching. For example, the pattern
- @samp{f(opt(a,0), b, opt(c,b))} will match @samp{f(b)}, @samp{f(a,b)},
- or @samp{f(a,b,c)}. Default values of zero and @cite{b} are
- supplied in this example for the omitted arguments. Note that
- the literal variable @cite{b} will be the default in the latter
- case, @emph{not} the value that matched the meta-variable @cite{b}.
- In other words, the default @var{def} is effectively quoted.
- @item condition(x,c)
- @ignore
- @starindex
- @end ignore
- @tindex condition
- @tindex ::
- This matches the pattern @cite{x}, with the attached condition
- @cite{c}. It is the same as @samp{x :: c}.
- @item pand(x,y)
- @ignore
- @starindex
- @end ignore
- @tindex pand
- @tindex &&&
- This matches anything that matches both pattern @cite{x} and
- pattern @cite{y}. It is the same as @samp{x &&& y}.
- @pxref{Composing Patterns in Rewrite Rules}.
- @item por(x,y)
- @ignore
- @starindex
- @end ignore
- @tindex por
- @tindex |||
- This matches anything that matches either pattern @cite{x} or
- pattern @cite{y}. It is the same as @w{@samp{x ||| y}}.
- @item pnot(x)
- @ignore
- @starindex
- @end ignore
- @tindex pnot
- @tindex !!!
- This matches anything that does not match pattern @cite{x}.
- It is the same as @samp{!!! x}.
- @item cons(h,t)
- @ignore
- @mindex cons
- @end ignore
- @tindex cons (rewrites)
- This matches any vector of one or more elements. The first
- element is matched to @cite{h}; a vector of the remaining
- elements is matched to @cite{t}. Note that vectors of fixed
- length can also be matched as actual vectors: The rule
- @samp{cons(a,cons(b,[])) := cons(a+b,[])} is equivalent
- to the rule @samp{[a,b] := [a+b]}.
- @item rcons(t,h)
- @ignore
- @mindex rcons
- @end ignore
- @tindex rcons (rewrites)
- This is like @code{cons}, except that the @emph{last} element
- is matched to @cite{h}, with the remaining elements matched
- to @cite{t}.
- @item apply(f,args)
- @ignore
- @mindex apply
- @end ignore
- @tindex apply (rewrites)
- This matches any function call. The name of the function, in
- the form of a variable, is matched to @cite{f}. The arguments
- of the function, as a vector of zero or more objects, are
- matched to @samp{args}. Constants, variables, and vectors
- do @emph{not} match an @code{apply} pattern. For example,
- @samp{apply(f,x)} matches any function call, @samp{apply(quote(f),x)}
- matches any call to the function @samp{f}, @samp{apply(f,[a,b])}
- matches any function call with exactly two arguments, and
- @samp{apply(quote(f), cons(a,cons(b,x)))} matches any call
- to the function @samp{f} with two or more arguments. Another
- way to implement the latter, if the rest of the rule does not
- need to refer to the first two arguments of @samp{f} by name,
- would be @samp{apply(quote(f), x :: vlen(x) >= 2)}.
- Here's a more interesting sample use of @code{apply}:
- @example
- apply(f,[x+n]) := n + apply(f,[x])
- :: in(f, [floor,ceil,round,trunc]) :: integer(n)
- @end example
- Note, however, that this will be slower to match than a rule
- set with four separate rules. The reason is that Calc sorts
- the rules of a rule set according to top-level function name;
- if the top-level function is @code{apply}, Calc must try the
- rule for every single formula and sub-formula. If the top-level
- function in the pattern is, say, @code{floor}, then Calc invokes
- the rule only for sub-formulas which are calls to @code{floor}.
- Formulas normally written with operators like @code{+} are still
- considered function calls: @code{apply(f,x)} matches @samp{a+b}
- with @samp{f = add}, @samp{x = [a,b]}.
- You must use @code{apply} for meta-variables with function names
- on both sides of a rewrite rule: @samp{apply(f, [x]) := f(x+1)}
- is @emph{not} correct, because it rewrites @samp{spam(6)} into
- @samp{f(7)}. The righthand side should be @samp{apply(f, [x+1])}.
- Also note that you will have to use no-simplify (@kbd{m O})
- mode when entering this rule so that the @code{apply} isn't
- evaluated immediately to get the new rule @samp{f(x) := f(x+1)}.
- Or, use @kbd{s e} to enter the rule without going through the stack,
- or enter the rule as @samp{apply(f, [x]) := apply(f, [x+1]) @w{:: 1}}.
- @xref{Conditional Rewrite Rules}.
- @item select(x)
- @ignore
- @starindex
- @end ignore
- @tindex select
- This is used for applying rules to formulas with selections;
- @pxref{Selections with Rewrite Rules}.
- @end table
- Special functions for the righthand sides of rules are:
- @table @samp
- @item quote(x)
- The notation @samp{quote(x)} is changed to @samp{x} when the
- righthand side is used. As far as the rewrite rule is concerned,
- @code{quote} is invisible. However, @code{quote} has the special
- property in Calc that its argument is not evaluated. Thus,
- while it will not work to put the rule @samp{t(a) := typeof(a)}
- on the stack because @samp{typeof(a)} is evaluated immediately
- to produce @samp{t(a) := 100}, you can use @code{quote} to
- protect the righthand side: @samp{t(a) := quote(typeof(a))}.
- (@xref{Conditional Rewrite Rules}, for another trick for
- protecting rules from evaluation.)
- @item plain(x)
- Special properties of and simplifications for the function call
- @cite{x} are not used. One interesting case where @code{plain}
- is useful is the rule, @samp{q(x) := quote(x)}, trying to expand a
- shorthand notation for the @code{quote} function. This rule will
- not work as shown; instead of replacing @samp{q(foo)} with
- @samp{quote(foo)}, it will replace it with @samp{foo}! The correct
- rule would be @samp{q(x) := plain(quote(x))}.
- @item cons(h,t)
- Where @cite{t} is a vector, this is converted into an expanded
- vector during rewrite processing. Note that @code{cons} is a regular
- Calc function which normally does this anyway; the only way @code{cons}
- is treated specially by rewrites is that @code{cons} on the righthand
- side of a rule will be evaluated even if default simplifications
- have been turned off.
- @item rcons(t,h)
- Analogous to @code{cons} except putting @cite{h} at the @emph{end} of
- the vector @cite{t}.
- @item apply(f,args)
- Where @cite{f} is a variable and @var{args} is a vector, this
- is converted to a function call. Once again, note that @code{apply}
- is also a regular Calc function.
- @item eval(x)
- @ignore
- @starindex
- @end ignore
- @tindex eval
- The formula @cite{x} is handled in the usual way, then the
- default simplifications are applied to it even if they have
- been turned off normally. This allows you to treat any function
- similarly to the way @code{cons} and @code{apply} are always
- treated. However, there is a slight difference: @samp{cons(2+3, [])}
- with default simplifications off will be converted to @samp{[2+3]},
- whereas @samp{eval(cons(2+3, []))} will be converted to @samp{[5]}.
- @item evalsimp(x)
- @ignore
- @starindex
- @end ignore
- @tindex evalsimp
- The formula @cite{x} has meta-variables substituted in the usual
- way, then algebraically simplified as if by the @kbd{a s} command.
- @item evalextsimp(x)
- @ignore
- @starindex
- @end ignore
- @tindex evalextsimp
- The formula @cite{x} has meta-variables substituted in the normal
- way, then ``extendedly'' simplified as if by the @kbd{a e} command.
- @item select(x)
- @xref{Selections with Rewrite Rules}.
- @end table
- There are also some special functions you can use in conditions.
- @table @samp
- @item let(v := x)
- @ignore
- @starindex
- @end ignore
- @tindex let
- The expression @cite{x} is evaluated with meta-variables substituted.
- The @kbd{a s} command's simplifications are @emph{not} applied by
- default, but @cite{x} can include calls to @code{evalsimp} or
- @code{evalextsimp} as described above to invoke higher levels
- of simplification. The
- result of @cite{x} is then bound to the meta-variable @cite{v}. As
- usual, if this meta-variable has already been matched to something
- else the two values must be equal; if the meta-variable is new then
- it is bound to the result of the expression. This variable can then
- appear in later conditions, and on the righthand side of the rule.
- In fact, @cite{v} may be any pattern in which case the result of
- evaluating @cite{x} is matched to that pattern, binding any
- meta-variables that appear in that pattern. Note that @code{let}
- can only appear by itself as a condition, or as one term of an
- @samp{&&} which is a whole condition: It cannot be inside
- an @samp{||} term or otherwise buried.@refill
- The alternate, equivalent form @samp{let(v, x)} is also recognized.
- Note that the use of @samp{:=} by @code{let}, while still being
- assignment-like in character, is unrelated to the use of @samp{:=}
- in the main part of a rewrite rule.
- As an example, @samp{f(a) := g(ia) :: let(ia := 1/a) :: constant(ia)}
- replaces @samp{f(a)} with @samp{g} of the inverse of @samp{a}, if
- that inverse exists and is constant. For example, if @samp{a} is a
- singular matrix the operation @samp{1/a} is left unsimplified and
- @samp{constant(ia)} fails, but if @samp{a} is an invertible matrix
- then the rule succeeds. Without @code{let} there would be no way
- to express this rule that didn't have to invert the matrix twice.
- Note that, because the meta-variable @samp{ia} is otherwise unbound
- in this rule, the @code{let} condition itself always ``succeeds''
- because no matter what @samp{1/a} evaluates to, it can successfully
- be bound to @code{ia}.@refill
- Here's another example, for integrating cosines of linear
- terms: @samp{myint(cos(y),x) := sin(y)/b :: let([a,b,x] := lin(y,x))}.
- The @code{lin} function returns a 3-vector if its argument is linear,
- or leaves itself unevaluated if not. But an unevaluated @code{lin}
- call will not match the 3-vector on the lefthand side of the @code{let},
- so this @code{let} both verifies that @code{y} is linear, and binds
- the coefficients @code{a} and @code{b} for use elsewhere in the rule.
- (It would have been possible to use @samp{sin(a x + b)/b} for the
- righthand side instead, but using @samp{sin(y)/b} avoids gratuitous
- rearrangement of the argument of the sine.)@refill
- @ignore
- @starindex
- @end ignore
- @tindex ierf
- Similarly, here is a rule that implements an inverse-@code{erf}
- function. It uses @code{root} to search for a solution. If
- @code{root} succeeds, it will return a vector of two numbers
- where the first number is the desired solution. If no solution
- is found, @code{root} remains in symbolic form. So we use
- @code{let} to check that the result was indeed a vector.
- @example
- ierf(x) := y :: let([y,z] := root(erf(a) = x, a, .5))
- @end example
- @item matches(v,p)
- The meta-variable @var{v}, which must already have been matched
- to something elsewhere in the rule, is compared against pattern
- @var{p}. Since @code{matches} is a standard Calc function, it
- can appear anywhere in a condition. But if it appears alone or
- as a term of a top-level @samp{&&}, then you get the special
- extra feature that meta-variables which are bound to things
- inside @var{p} can be used elsewhere in the surrounding rewrite
- rule.
- The only real difference between @samp{let(p := v)} and
- @samp{matches(v, p)} is that the former evaluates @samp{v} using
- the default simplifications, while the latter does not.
- @item remember
- @vindex remember
- This is actually a variable, not a function. If @code{remember}
- appears as a condition in a rule, then when that rule succeeds
- the original expression and rewritten expression are added to the
- front of the rule set that contained the rule. If the rule set
- was not stored in a variable, @code{remember} is ignored. The
- lefthand side is enclosed in @code{quote} in the added rule if it
- contains any variables.
- For example, the rule @samp{f(n) := n f(n-1) :: remember} applied
- to @samp{f(7)} will add the rule @samp{f(7) := 7 f(6)} to the front
- of the rule set. The rule set @code{EvalRules} works slightly
- differently: There, the evaluation of @samp{f(6)} will complete before
- the result is added to the rule set, in this case as @samp{f(7) := 5040}.
- Thus @code{remember} is most useful inside @code{EvalRules}.
- It is up to you to ensure that the optimization performed by
- @code{remember} is safe. For example, the rule @samp{foo(n) := n
- :: evalv(eatfoo) > 0 :: remember} is a bad idea (@code{evalv} is
- the function equivalent of the @kbd{=} command); if the variable
- @code{eatfoo} ever contains 1, rules like @samp{foo(7) := 7} will
- be added to the rule set and will continue to operate even if
- @code{eatfoo} is later changed to 0.
- @item remember(c)
- @ignore
- @starindex
- @end ignore
- @tindex remember
- Remember the match as described above, but only if condition @cite{c}
- is true. For example, @samp{remember(n % 4 = 0)} in the above factorial
- rule remembers only every fourth result. Note that @samp{remember(1)}
- is equivalent to @samp{remember}, and @samp{remember(0)} has no effect.
- @end table
- @node Composing Patterns in Rewrite Rules, Nested Formulas with Rewrite Rules, Other Features of Rewrite Rules, Rewrite Rules
- @subsection Composing Patterns in Rewrite Rules
- @noindent
- There are three operators, @samp{&&&}, @samp{|||}, and @samp{!!!},
- that combine rewrite patterns to make larger patterns. The
- combinations are ``and,'' ``or,'' and ``not,'' respectively, and
- these operators are the pattern equivalents of @samp{&&}, @samp{||}
- and @samp{!} (which operate on zero-or-nonzero logical values).
- Note that @samp{&&&}, @samp{|||}, and @samp{!!!} are left in symbolic
- form by all regular Calc features; they have special meaning only in
- the context of rewrite rule patterns.
- The pattern @samp{@var{p1} &&& @var{p2}} matches anything that
- matches both @var{p1} and @var{p2}. One especially useful case is
- when one of @var{p1} or @var{p2} is a meta-variable. For example,
- here is a rule that operates on error forms:
- @example
- f(x &&& a +/- b, x) := g(x)
- @end example
- This does the same thing, but is arguably simpler than, the rule
- @example
- f(a +/- b, a +/- b) := g(a +/- b)
- @end example
- @ignore
- @starindex
- @end ignore
- @tindex ends
- Here's another interesting example:
- @example
- ends(cons(a, x) &&& rcons(y, b)) := [a, b]
- @end example
- @noindent
- which effectively clips out the middle of a vector leaving just
- the first and last elements. This rule will change a one-element
- vector @samp{[a]} to @samp{[a, a]}. The similar rule
- @example
- ends(cons(a, rcons(y, b))) := [a, b]
- @end example
- @noindent
- would do the same thing except that it would fail to match a
- one-element vector.
- @tex
- \bigskip
- @end tex
- The pattern @samp{@var{p1} ||| @var{p2}} matches anything that
- matches either @var{p1} or @var{p2}. Calc first tries matching
- against @var{p1}; if that fails, it goes on to try @var{p2}.
- @ignore
- @starindex
- @end ignore
- @tindex curve
- A simple example of @samp{|||} is
- @example
- curve(inf ||| -inf) := 0
- @end example
- @noindent
- which converts both @samp{curve(inf)} and @samp{curve(-inf)} to zero.
- Here is a larger example:
- @example
- log(a, b) ||| (ln(a) :: let(b := e)) := mylog(a, b)
- @end example
- This matches both generalized and natural logarithms in a single rule.
- Note that the @samp{::} term must be enclosed in parentheses because
- that operator has lower precedence than @samp{|||} or @samp{:=}.
- (In practice this rule would probably include a third alternative,
- omitted here for brevity, to take care of @code{log10}.)
- While Calc generally treats interior conditions exactly the same as
- conditions on the outside of a rule, it does guarantee that if all the
- variables in the condition are special names like @code{e}, or already
- bound in the pattern to which the condition is attached (say, if
- @samp{a} had appeared in this condition), then Calc will process this
- condition right after matching the pattern to the left of the @samp{::}.
- Thus, we know that @samp{b} will be bound to @samp{e} only if the
- @code{ln} branch of the @samp{|||} was taken.
- Note that this rule was careful to bind the same set of meta-variables
- on both sides of the @samp{|||}. Calc does not check this, but if
- you bind a certain meta-variable only in one branch and then use that
- meta-variable elsewhere in the rule, results are unpredictable:
- @example
- f(a,b) ||| g(b) := h(a,b)
- @end example
- Here if the pattern matches @samp{g(17)}, Calc makes no promises about
- the value that will be substituted for @samp{a} on the righthand side.
- @tex
- \bigskip
- @end tex
- The pattern @samp{!!! @var{pat}} matches anything that does not
- match @var{pat}. Any meta-variables that are bound while matching
- @var{pat} remain unbound outside of @var{pat}.
- For example,
- @example
- f(x &&& !!! a +/- b, !!![]) := g(x)
- @end example
- @noindent
- converts @code{f} whose first argument is anything @emph{except} an
- error form, and whose second argument is not the empty vector, into
- a similar call to @code{g} (but without the second argument).
- If we know that the second argument will be a vector (empty or not),
- then an equivalent rule would be:
- @example
- f(x, y) := g(x) :: typeof(x) != 7 :: vlen(y) > 0
- @end example
- @noindent
- where of course 7 is the @code{typeof} code for error forms.
- Another final condition, that works for any kind of @samp{y},
- would be @samp{!istrue(y == [])}. (The @code{istrue} function
- returns an explicit 0 if its argument was left in symbolic form;
- plain @samp{!(y == [])} or @samp{y != []} would not work to replace
- @samp{!!![]} since these would be left unsimplified, and thus cause
- the rule to fail, if @samp{y} was something like a variable name.)
- It is possible for a @samp{!!!} to refer to meta-variables bound
- elsewhere in the pattern. For example,
- @example
- f(a, !!!a) := g(a)
- @end example
- @noindent
- matches any call to @code{f} with different arguments, changing
- this to @code{g} with only the first argument.
- If a function call is to be matched and one of the argument patterns
- contains a @samp{!!!} somewhere inside it, that argument will be
- matched last. Thus
- @example
- f(!!!a, a) := g(a)
- @end example
- @noindent
- will be careful to bind @samp{a} to the second argument of @code{f}
- before testing the first argument. If Calc had tried to match the
- first argument of @code{f} first, the results would have been
- disasterous: Since @code{a} was unbound so far, the pattern @samp{a}
- would have matched anything at all, and the pattern @samp{!!!a}
- therefore would @emph{not} have matched anything at all!
- @node Nested Formulas with Rewrite Rules, Multi-Phase Rewrite Rules, Composing Patterns in Rewrite Rules, Rewrite Rules
- @subsection Nested Formulas with Rewrite Rules
- @noindent
- When @kbd{a r} (@code{calc-rewrite}) is used, it takes an expression from
- the top of the stack and attempts to match any of the specified rules
- to any part of the expression, starting with the whole expression
- and then, if that fails, trying deeper and deeper sub-expressions.
- For each part of the expression, the rules are tried in the order
- they appear in the rules vector. The first rule to match the first
- sub-expression wins; it replaces the matched sub-expression according
- to the @var{new} part of the rule.
- Often, the rule set will match and change the formula several times.
- The top-level formula is first matched and substituted repeatedly until
- it no longer matches the pattern; then, sub-formulas are tried, and
- so on. Once every part of the formula has gotten its chance, the
- rewrite mechanism starts over again with the top-level formula
- (in case a substitution of one of its arguments has caused it again
- to match). This continues until no further matches can be made
- anywhere in the formula.
- It is possible for a rule set to get into an infinite loop. The
- most obvious case, replacing a formula with itself, is not a problem
- because a rule is not considered to ``succeed'' unless the righthand
- side actually comes out to something different than the original
- formula or sub-formula that was matched. But if you accidentally
- had both @samp{ln(a b) := ln(a) + ln(b)} and the reverse
- @samp{ln(a) + ln(b) := ln(a b)} in your rule set, Calc would
- run forever switching a formula back and forth between the two
- forms.
- To avoid disaster, Calc normally stops after 100 changes have been
- made to the formula. This will be enough for most multiple rewrites,
- but it will keep an endless loop of rewrites from locking up the
- computer forever. (On most systems, you can also type @kbd{C-g} to
- halt any Emacs command prematurely.)
- To change this limit, give a positive numeric prefix argument.
- In particular, @kbd{M-1 a r} applies only one rewrite at a time,
- useful when you are first testing your rule (or just if repeated
- rewriting is not what is called for by your application).
- @ignore
- @starindex
- @end ignore
- @ignore
- @mindex iter@idots
- @end ignore
- @tindex iterations
- You can also put a ``function call'' @samp{iterations(@var{n})}
- in place of a rule anywhere in your rules vector (but usually at
- the top). Then, @var{n} will be used instead of 100 as the default
- number of iterations for this rule set. You can use
- @samp{iterations(inf)} if you want no iteration limit by default.
- A prefix argument will override the @code{iterations} limit in the
- rule set.
- @example
- [ iterations(1),
- f(x) := f(x+1) ]
- @end example
- More precisely, the limit controls the number of ``iterations,''
- where each iteration is a successful matching of a rule pattern whose
- righthand side, after substituting meta-variables and applying the
- default simplifications, is different from the original sub-formula
- that was matched.
- A prefix argument of zero sets the limit to infinity. Use with caution!
- Given a negative numeric prefix argument, @kbd{a r} will match and
- substitute the top-level expression up to that many times, but
- will not attempt to match the rules to any sub-expressions.
- In a formula, @code{rewrite(@var{expr}, @var{rules}, @var{n})}
- does a rewriting operation. Here @var{expr} is the expression
- being rewritten, @var{rules} is the rule, vector of rules, or
- variable containing the rules, and @var{n} is the optional
- iteration limit, which may be a positive integer, a negative
- integer, or @samp{inf} or @samp{-inf}. If @var{n} is omitted
- the @code{iterations} value from the rule set is used; if both
- are omitted, 100 is used.
- @node Multi-Phase Rewrite Rules, Selections with Rewrite Rules, Nested Formulas with Rewrite Rules, Rewrite Rules
- @subsection Multi-Phase Rewrite Rules
- @noindent
- It is possible to separate a rewrite rule set into several @dfn{phases}.
- During each phase, certain rules will be enabled while certain others
- will be disabled. A @dfn{phase schedule} controls the order in which
- phases occur during the rewriting process.
- @ignore
- @starindex
- @end ignore
- @tindex phase
- @vindex all
- If a call to the marker function @code{phase} appears in the rules
- vector in place of a rule, all rules following that point will be
- members of the phase(s) identified in the arguments to @code{phase}.
- Phases are given integer numbers. The markers @samp{phase()} and
- @samp{phase(all)} both mean the following rules belong to all phases;
- this is the default at the start of the rule set.
- If you do not explicitly schedule the phases, Calc sorts all phase
- numbers that appear in the rule set and executes the phases in
- ascending order. For example, the rule set
- @example
- @group
- [ f0(x) := g0(x),
- phase(1),
- f1(x) := g1(x),
- phase(2),
- f2(x) := g2(x),
- phase(3),
- f3(x) := g3(x),
- phase(1,2),
- f4(x) := g4(x) ]
- @end group
- @end example
- @noindent
- has three phases, 1 through 3. Phase 1 consists of the @code{f0},
- @code{f1}, and @code{f4} rules (in that order). Phase 2 consists of
- @code{f0}, @code{f2}, and @code{f4}. Phase 3 consists of @code{f0}
- and @code{f3}.
- When Calc rewrites a formula using this rule set, it first rewrites
- the formula using only the phase 1 rules until no further changes are
- possible. Then it switches to the phase 2 rule set and continues
- until no further changes occur, then finally rewrites with phase 3.
- When no more phase 3 rules apply, rewriting finishes. (This is
- assuming @kbd{a r} with a large enough prefix argument to allow the
- rewriting to run to completion; the sequence just described stops
- early if the number of iterations specified in the prefix argument,
- 100 by default, is reached.)
- During each phase, Calc descends through the nested levels of the
- formula as described previously. (@xref{Nested Formulas with Rewrite
- Rules}.) Rewriting starts at the top of the formula, then works its
- way down to the parts, then goes back to the top and works down again.
- The phase 2 rules do not begin until no phase 1 rules apply anywhere
- in the formula.
- @ignore
- @starindex
- @end ignore
- @tindex schedule
- A @code{schedule} marker appearing in the rule set (anywhere, but
- conventionally at the top) changes the default schedule of phases.
- In the simplest case, @code{schedule} has a sequence of phase numbers
- for arguments; each phase number is invoked in turn until the
- arguments to @code{schedule} are exhausted. Thus adding
- @samp{schedule(3,2,1)} at the top of the above rule set would
- reverse the order of the phases; @samp{schedule(1,2,3)} would have
- no effect since this is the default schedule; and @samp{schedule(1,2,1,3)}
- would give phase 1 a second chance after phase 2 has completed, before
- moving on to phase 3.
- Any argument to @code{schedule} can instead be a vector of phase
- numbers (or even of sub-vectors). Then the sub-sequence of phases
- described by the vector are tried repeatedly until no change occurs
- in any phase in the sequence. For example, @samp{schedule([1, 2], 3)}
- tries phase 1, then phase 2, then, if either phase made any changes
- to the formula, repeats these two phases until they can make no
- further progress. Finally, it goes on to phase 3 for finishing
- touches.
- Also, items in @code{schedule} can be variable names as well as
- numbers. A variable name is interpreted as the name of a function
- to call on the whole formula. For example, @samp{schedule(1, simplify)}
- says to apply the phase-1 rules (presumably, all of them), then to
- call @code{simplify} which is the function name equivalent of @kbd{a s}.
- Likewise, @samp{schedule([1, simplify])} says to alternate between
- phase 1 and @kbd{a s} until no further changes occur.
- Phases can be used purely to improve efficiency; if it is known that
- a certain group of rules will apply only at the beginning of rewriting,
- and a certain other group will apply only at the end, then rewriting
- will be faster if these groups are identified as separate phases.
- Once the phase 1 rules are done, Calc can put them aside and no longer
- spend any time on them while it works on phase 2.
- There are also some problems that can only be solved with several
- rewrite phases. For a real-world example of a multi-phase rule set,
- examine the set @code{FitRules}, which is used by the curve-fitting
- command to convert a model expression to linear form.
- @xref{Curve Fitting Details}. This set is divided into four phases.
- The first phase rewrites certain kinds of expressions to be more
- easily linearizable, but less computationally efficient. After the
- linear components have been picked out, the final phase includes the
- opposite rewrites to put each component back into an efficient form.
- If both sets of rules were included in one big phase, Calc could get
- into an infinite loop going back and forth between the two forms.
- Elsewhere in @code{FitRules}, the components are first isolated,
- then recombined where possible to reduce the complexity of the linear
- fit, then finally packaged one component at a time into vectors.
- If the packaging rules were allowed to begin before the recombining
- rules were finished, some components might be put away into vectors
- before they had a chance to recombine. By putting these rules in
- two separate phases, this problem is neatly avoided.
- @node Selections with Rewrite Rules, Matching Commands, Multi-Phase Rewrite Rules, Rewrite Rules
- @subsection Selections with Rewrite Rules
- @noindent
- If a sub-formula of the current formula is selected (as by @kbd{j s};
- @pxref{Selecting Subformulas}), the @kbd{a r} (@code{calc-rewrite})
- command applies only to that sub-formula. Together with a negative
- prefix argument, you can use this fact to apply a rewrite to one
- specific part of a formula without affecting any other parts.
- @kindex j r
- @pindex calc-rewrite-selection
- The @kbd{j r} (@code{calc-rewrite-selection}) command allows more
- sophisticated operations on selections. This command prompts for
- the rules in the same way as @kbd{a r}, but it then applies those
- rules to the whole formula in question even though a sub-formula
- of it has been selected. However, the selected sub-formula will
- first have been surrounded by a @samp{select( )} function call.
- (Calc's evaluator does not understand the function name @code{select};
- this is only a tag used by the @kbd{j r} command.)
- For example, suppose the formula on the stack is @samp{2 (a + b)^2}
- and the sub-formula @samp{a + b} is selected. This formula will
- be rewritten to @samp{2 select(a + b)^2} and then the rewrite
- rules will be applied in the usual way. The rewrite rules can
- include references to @code{select} to tell where in the pattern
- the selected sub-formula should appear.
- If there is still exactly one @samp{select( )} function call in
- the formula after rewriting is done, it indicates which part of
- the formula should be selected afterwards. Otherwise, the
- formula will be unselected.
- You can make @kbd{j r} act much like @kbd{a r} by enclosing both parts
- of the rewrite rule with @samp{select()}. However, @kbd{j r}
- allows you to use the current selection in more flexible ways.
- Suppose you wished to make a rule which removed the exponent from
- the selected term; the rule @samp{select(a)^x := select(a)} would
- work. In the above example, it would rewrite @samp{2 select(a + b)^2}
- to @samp{2 select(a + b)}. This would then be returned to the
- stack as @samp{2 (a + b)} with the @samp{a + b} selected.
- The @kbd{j r} command uses one iteration by default, unlike
- @kbd{a r} which defaults to 100 iterations. A numeric prefix
- argument affects @kbd{j r} in the same way as @kbd{a r}.
- @xref{Nested Formulas with Rewrite Rules}.
- As with other selection commands, @kbd{j r} operates on the stack
- entry that contains the cursor. (If the cursor is on the top-of-stack
- @samp{.} marker, it works as if the cursor were on the formula
- at stack level 1.)
- If you don't specify a set of rules, the rules are taken from the
- top of the stack, just as with @kbd{a r}. In this case, the
- cursor must indicate stack entry 2 or above as the formula to be
- rewritten (otherwise the same formula would be used as both the
- target and the rewrite rules).
- If the indicated formula has no selection, the cursor position within
- the formula temporarily selects a sub-formula for the purposes of this
- command. If the cursor is not on any sub-formula (e.g., it is in
- the line-number area to the left of the formula), the @samp{select( )}
- markers are ignored by the rewrite mechanism and the rules are allowed
- to apply anywhere in the formula.
- As a special feature, the normal @kbd{a r} command also ignores
- @samp{select( )} calls in rewrite rules. For example, if you used the
- above rule @samp{select(a)^x := select(a)} with @kbd{a r}, it would apply
- the rule as if it were @samp{a^x := a}. Thus, you can write general
- purpose rules with @samp{select( )} hints inside them so that they
- will ``do the right thing'' in both @kbd{a r} and @kbd{j r},
- both with and without selections.
- @node Matching Commands, Automatic Rewrites, Selections with Rewrite Rules, Rewrite Rules
- @subsection Matching Commands
- @noindent
- @kindex a m
- @pindex calc-match
- @tindex match
- The @kbd{a m} (@code{calc-match}) [@code{match}] function takes a
- vector of formulas and a rewrite-rule-style pattern, and produces
- a vector of all formulas which match the pattern. The command
- prompts you to enter the pattern; as for @kbd{a r}, you can enter
- a single pattern (i.e., a formula with meta-variables), or a
- vector of patterns, or a variable which contains patterns, or
- you can give a blank response in which case the patterns are taken
- from the top of the stack. The pattern set will be compiled once
- and saved if it is stored in a variable. If there are several
- patterns in the set, vector elements are kept if they match any
- of the patterns.
- For example, @samp{match(a+b, [x, x+y, x-y, 7, x+y+z])}
- will return @samp{[x+y, x-y, x+y+z]}.
- The @code{import} mechanism is not available for pattern sets.
- The @kbd{a m} command can also be used to extract all vector elements
- which satisfy any condition: The pattern @samp{x :: x>0} will select
- all the positive vector elements.
- @kindex I a m
- @tindex matchnot
- With the Inverse flag [@code{matchnot}], this command extracts all
- vector elements which do @emph{not} match the given pattern.
- @ignore
- @starindex
- @end ignore
- @tindex matches
- There is also a function @samp{matches(@var{x}, @var{p})} which
- evaluates to 1 if expression @var{x} matches pattern @var{p}, or
- to 0 otherwise. This is sometimes useful for including into the
- conditional clauses of other rewrite rules.
- @ignore
- @starindex
- @end ignore
- @tindex vmatches
- The function @code{vmatches} is just like @code{matches}, except
- that if the match succeeds it returns a vector of assignments to
- the meta-variables instead of the number 1. For example,
- @samp{vmatches(f(1,2), f(a,b))} returns @samp{[a := 1, b := 2]}.
- If the match fails, the function returns the number 0.
- @node Automatic Rewrites, Debugging Rewrites, Matching Commands, Rewrite Rules
- @subsection Automatic Rewrites
- @noindent
- @cindex @code{EvalRules} variable
- @vindex EvalRules
- It is possible to get Calc to apply a set of rewrite rules on all
- results, effectively adding to the built-in set of default
- simplifications. To do this, simply store your rule set in the
- variable @code{EvalRules}. There is a convenient @kbd{s E} command
- for editing @code{EvalRules}; @pxref{Operations on Variables}.
- For example, suppose you want @samp{sin(a + b)} to be expanded out
- to @samp{sin(b) cos(a) + cos(b) sin(a)} wherever it appears, and
- similarly for @samp{cos(a + b)}. The corresponding rewrite rule
- set would be,
- @smallexample
- @group
- [ sin(a + b) := cos(a) sin(b) + sin(a) cos(b),
- cos(a + b) := cos(a) cos(b) - sin(a) sin(b) ]
- @end group
- @end smallexample
- To apply these manually, you could put them in a variable called
- @code{trigexp} and then use @kbd{a r trigexp} every time you wanted
- to expand trig functions. But if instead you store them in the
- variable @code{EvalRules}, they will automatically be applied to all
- sines and cosines of sums. Then, with @samp{2 x} and @samp{45} on
- the stack, typing @kbd{+ S} will (assuming degrees mode) result in
- @samp{0.7071 sin(2 x) + 0.7071 cos(2 x)} automatically.
- As each level of a formula is evaluated, the rules from
- @code{EvalRules} are applied before the default simplifications.
- Rewriting continues until no further @code{EvalRules} apply.
- Note that this is different from the usual order of application of
- rewrite rules: @code{EvalRules} works from the bottom up, simplifying
- the arguments to a function before the function itself, while @kbd{a r}
- applies rules from the top down.
- Because the @code{EvalRules} are tried first, you can use them to
- override the normal behavior of any built-in Calc function.
- It is important not to write a rule that will get into an infinite
- loop. For example, the rule set @samp{[f(0) := 1, f(n) := n f(n-1)]}
- appears to be a good definition of a factorial function, but it is
- unsafe. Imagine what happens if @samp{f(2.5)} is simplified. Calc
- will continue to subtract 1 from this argument forever without reaching
- zero. A safer second rule would be @samp{f(n) := n f(n-1) :: n>0}.
- Another dangerous rule is @samp{g(x, y) := g(y, x)}. Rewriting
- @samp{g(2, 4)}, this would bounce back and forth between that and
- @samp{g(4, 2)} forever. If an infinite loop in @code{EvalRules}
- occurs, Emacs will eventually stop with a ``Computation got stuck
- or ran too long'' message.
- Another subtle difference between @code{EvalRules} and regular rewrites
- concerns rules that rewrite a formula into an identical formula. For
- example, @samp{f(n) := f(floor(n))} ``fails to match'' when @cite{n} is
- already an integer. But in @code{EvalRules} this case is detected only
- if the righthand side literally becomes the original formula before any
- further simplification. This means that @samp{f(n) := f(floor(n))} will
- get into an infinite loop if it occurs in @code{EvalRules}. Calc will
- replace @samp{f(6)} with @samp{f(floor(6))}, which is different from
- @samp{f(6)}, so it will consider the rule to have matched and will
- continue simplifying that formula; first the argument is simplified
- to get @samp{f(6)}, then the rule matches again to get @samp{f(floor(6))}
- again, ad infinitum. A much safer rule would check its argument first,
- say, with @samp{f(n) := f(floor(n)) :: !dint(n)}.
- (What really happens is that the rewrite mechanism substitutes the
- meta-variables in the righthand side of a rule, compares to see if the
- result is the same as the original formula and fails if so, then uses
- the default simplifications to simplify the result and compares again
- (and again fails if the formula has simplified back to its original
- form). The only special wrinkle for the @code{EvalRules} is that the
- same rules will come back into play when the default simplifications
- are used. What Calc wants to do is build @samp{f(floor(6))}, see that
- this is different from the original formula, simplify to @samp{f(6)},
- see that this is the same as the original formula, and thus halt the
- rewriting. But while simplifying, @samp{f(6)} will again trigger
- the same @code{EvalRules} rule and Calc will get into a loop inside
- the rewrite mechanism itself.)
- The @code{phase}, @code{schedule}, and @code{iterations} markers do
- not work in @code{EvalRules}. If the rule set is divided into phases,
- only the phase 1 rules are applied, and the schedule is ignored.
- The rules are always repeated as many times as possible.
- The @code{EvalRules} are applied to all function calls in a formula,
- but not to numbers (and other number-like objects like error forms),
- nor to vectors or individual variable names. (Though they will apply
- to @emph{components} of vectors and error forms when appropriate.) You
- might try to make a variable @code{phihat} which automatically expands
- to its definition without the need to press @kbd{=} by writing the
- rule @samp{quote(phihat) := (1-sqrt(5))/2}, but unfortunately this rule
- will not work as part of @code{EvalRules}.
- Finally, another limitation is that Calc sometimes calls its built-in
- functions directly rather than going through the default simplifications.
- When it does this, @code{EvalRules} will not be able to override those
- functions. For example, when you take the absolute value of the complex
- number @cite{(2, 3)}, Calc computes @samp{sqrt(2*2 + 3*3)} by calling
- the multiplication, addition, and square root functions directly rather
- than applying the default simplifications to this formula. So an
- @code{EvalRules} rule that (perversely) rewrites @samp{sqrt(13) := 6}
- would not apply. (However, if you put Calc into symbolic mode so that
- @samp{sqrt(13)} will be left in symbolic form by the built-in square
- root function, your rule will be able to apply. But if the complex
- number were @cite{(3,4)}, so that @samp{sqrt(25)} must be calculated,
- then symbolic mode will not help because @samp{sqrt(25)} can be
- evaluated exactly to 5.)
- One subtle restriction that normally only manifests itself with
- @code{EvalRules} is that while a given rewrite rule is in the process
- of being checked, that same rule cannot be recursively applied. Calc
- effectively removes the rule from its rule set while checking the rule,
- then puts it back once the match succeeds or fails. (The technical
- reason for this is that compiled pattern programs are not reentrant.)
- For example, consider the rule @samp{foo(x) := x :: foo(x/2) > 0}
- attempting to match @samp{foo(8)}. This rule will be inactive while
- the condition @samp{foo(4) > 0} is checked, even though it might be
- an integral part of evaluating that condition. Note that this is not
- a problem for the more usual recursive type of rule, such as
- @samp{foo(x) := foo(x/2)}, because there the rule has succeeded and
- been reactivated by the time the righthand side is evaluated.
- If @code{EvalRules} has no stored value (its default state), or if
- anything but a vector is stored in it, then it is ignored.
- Even though Calc's rewrite mechanism is designed to compare rewrite
- rules to formulas as quickly as possible, storing rules in
- @code{EvalRules} may make Calc run substantially slower. This is
- particularly true of rules where the top-level call is a commonly used
- function, or is not fixed. The rule @samp{f(n) := n f(n-1) :: n>0} will
- only activate the rewrite mechanism for calls to the function @code{f},
- but @samp{lg(n) + lg(m) := lg(n m)} will check every @samp{+} operator.
- @smallexample
- apply(f, [a*b]) := apply(f, [a]) + apply(f, [b]) :: in(f, [ln, log10])
- @end smallexample
- @noindent
- may seem more ``efficient'' than two separate rules for @code{ln} and
- @code{log10}, but actually it is vastly less efficient because rules
- with @code{apply} as the top-level pattern must be tested against
- @emph{every} function call that is simplified.
- @cindex @code{AlgSimpRules} variable
- @vindex AlgSimpRules
- Suppose you want @samp{sin(a + b)} to be expanded out not all the time,
- but only when @kbd{a s} is used to simplify the formula. The variable
- @code{AlgSimpRules} holds rules for this purpose. The @kbd{a s} command
- will apply @code{EvalRules} and @code{AlgSimpRules} to the formula, as
- well as all of its built-in simplifications.
- Most of the special limitations for @code{EvalRules} don't apply to
- @code{AlgSimpRules}. Calc simply does an @kbd{a r AlgSimpRules}
- command with an infinite repeat count as the first step of @kbd{a s}.
- It then applies its own built-in simplifications throughout the
- formula, and then repeats these two steps (along with applying the
- default simplifications) until no further changes are possible.
- @cindex @code{ExtSimpRules} variable
- @cindex @code{UnitSimpRules} variable
- @vindex ExtSimpRules
- @vindex UnitSimpRules
- There are also @code{ExtSimpRules} and @code{UnitSimpRules} variables
- that are used by @kbd{a e} and @kbd{u s}, respectively; these commands
- also apply @code{EvalRules} and @code{AlgSimpRules}. The variable
- @code{IntegSimpRules} contains simplification rules that are used
- only during integration by @kbd{a i}.
- @node Debugging Rewrites, Examples of Rewrite Rules, Automatic Rewrites, Rewrite Rules
- @subsection Debugging Rewrites
- @noindent
- If a buffer named @samp{*Trace*} exists, the rewrite mechanism will
- record some useful information there as it operates. The original
- formula is written there, as is the result of each successful rewrite,
- and the final result of the rewriting. All phase changes are also
- noted.
- Calc always appends to @samp{*Trace*}. You must empty this buffer
- yourself periodically if it is in danger of growing unwieldy.
- Note that the rewriting mechanism is substantially slower when the
- @samp{*Trace*} buffer exists, even if the buffer is not visible on
- the screen. Once you are done, you will probably want to kill this
- buffer (with @kbd{C-x k *Trace* @key{RET}}). If you leave it in
- existence and forget about it, all your future rewrite commands will
- be needlessly slow.
- @node Examples of Rewrite Rules, , Debugging Rewrites, Rewrite Rules
- @subsection Examples of Rewrite Rules
- @noindent
- Returning to the example of substituting the pattern
- @samp{sin(x)^2 + cos(x)^2} with 1, we saw that the rule
- @samp{opt(a) sin(x)^2 + opt(a) cos(x)^2 := a} does a good job of
- finding suitable cases. Another solution would be to use the rule
- @samp{cos(x)^2 := 1 - sin(x)^2}, followed by algebraic simplification
- if necessary. This rule will be the most effective way to do the job,
- but at the expense of making some changes that you might not desire.@refill
- Another algebraic rewrite rule is @samp{exp(x+y) := exp(x) exp(y)}.
- To make this work with the @w{@kbd{j r}} command so that it can be
- easily targeted to a particular exponential in a large formula,
- you might wish to write the rule as @samp{select(exp(x+y)) :=
- select(exp(x) exp(y))}. The @samp{select} markers will be
- ignored by the regular @kbd{a r} command
- (@pxref{Selections with Rewrite Rules}).@refill
- A surprisingly useful rewrite rule is @samp{a/(b-c) := a*(b+c)/(b^2-c^2)}.
- This will simplify the formula whenever @cite{b} and/or @cite{c} can
- be made simpler by squaring. For example, applying this rule to
- @samp{2 / (sqrt(2) + 3)} yields @samp{6:7 - 2:7 sqrt(2)} (assuming
- Symbolic Mode has been enabled to keep the square root from being
- evaulated to a floating-point approximation). This rule is also
- useful when working with symbolic complex numbers, e.g.,
- @samp{(a + b i) / (c + d i)}.
- As another example, we could define our own ``triangular numbers'' function
- with the rules @samp{[tri(0) := 0, tri(n) := n + tri(n-1) :: n>0]}. Enter
- this vector and store it in a variable: @kbd{@w{s t} trirules}. Now, given
- a suitable formula like @samp{tri(5)} on the stack, type @samp{a r trirules}
- to apply these rules repeatedly. After six applications, @kbd{a r} will
- stop with 15 on the stack. Once these rules are debugged, it would probably
- be most useful to add them to @code{EvalRules} so that Calc will evaluate
- the new @code{tri} function automatically. We could then use @kbd{Z K} on
- the keyboard macro @kbd{' tri($) @key{RET}} to make a command that applies
- @code{tri} to the value on the top of the stack. @xref{Programming}.
- @cindex Quaternions
- The following rule set, contributed by @c{Fran\c cois}
- @asis{Francois} Pinard, implements
- @dfn{quaternions}, a generalization of the concept of complex numbers.
- Quaternions have four components, and are here represented by function
- calls @samp{quat(@var{w}, [@var{x}, @var{y}, @var{z}])} with ``real
- part'' @var{w} and the three ``imaginary'' parts collected into a
- vector. Various arithmetical operations on quaternions are supported.
- To use these rules, either add them to @code{EvalRules}, or create a
- command based on @kbd{a r} for simplifying quaternion formulas.
- A convenient way to enter quaternions would be a command defined by
- a keyboard macro containing: @kbd{' quat($$$$, [$$$, $$, $]) @key{RET}}.
- @smallexample
- [ quat(w, x, y, z) := quat(w, [x, y, z]),
- quat(w, [0, 0, 0]) := w,
- abs(quat(w, v)) := hypot(w, v),
- -quat(w, v) := quat(-w, -v),
- r + quat(w, v) := quat(r + w, v) :: real(r),
- r - quat(w, v) := quat(r - w, -v) :: real(r),
- quat(w1, v1) + quat(w2, v2) := quat(w1 + w2, v1 + v2),
- r * quat(w, v) := quat(r * w, r * v) :: real(r),
- plain(quat(w1, v1) * quat(w2, v2))
- := quat(w1 * w2 - v1 * v2, w1 * v2 + w2 * v1 + cross(v1, v2)),
- quat(w1, v1) / r := quat(w1 / r, v1 / r) :: real(r),
- z / quat(w, v) := z * quatinv(quat(w, v)),
- quatinv(quat(w, v)) := quat(w, -v) / (w^2 + v^2),
- quatsqr(quat(w, v)) := quat(w^2 - v^2, 2 * w * v),
- quat(w, v)^k := quatsqr(quat(w, v)^(k / 2))
- :: integer(k) :: k > 0 :: k % 2 = 0,
- quat(w, v)^k := quatsqr(quat(w, v)^((k - 1) / 2)) * quat(w, v)
- :: integer(k) :: k > 2,
- quat(w, v)^-k := quatinv(quat(w, v)^k) :: integer(k) :: k > 0 ]
- @end smallexample
- Quaternions, like matrices, have non-commutative multiplication.
- In other words, @cite{q1 * q2 = q2 * q1} is not necessarily true if
- @cite{q1} and @cite{q2} are @code{quat} forms. The @samp{quat*quat}
- rule above uses @code{plain} to prevent Calc from rearranging the
- product. It may also be wise to add the line @samp{[quat(), matrix]}
- to the @code{Decls} matrix, to ensure that Calc's other algebraic
- operations will not rearrange a quaternion product. @xref{Declarations}.
- These rules also accept a four-argument @code{quat} form, converting
- it to the preferred form in the first rule. If you would rather see
- results in the four-argument form, just append the two items
- @samp{phase(2), quat(w, [x, y, z]) := quat(w, x, y, z)} to the end
- of the rule set. (But remember that multi-phase rule sets don't work
- in @code{EvalRules}.)
- @node Units, Store and Recall, Algebra, Top
- @chapter Operating on Units
- @noindent
- One special interpretation of algebraic formulas is as numbers with units.
- For example, the formula @samp{5 m / s^2} can be read ``five meters
- per second squared.'' The commands in this chapter help you
- manipulate units expressions in this form. Units-related commands
- begin with the @kbd{u} prefix key.
- @menu
- * Basic Operations on Units::
- * The Units Table::
- * Predefined Units::
- * User-Defined Units::
- @end menu
- @node Basic Operations on Units, The Units Table, Units, Units
- @section Basic Operations on Units
- @noindent
- A @dfn{units expression} is a formula which is basically a number
- multiplied and/or divided by one or more @dfn{unit names}, which may
- optionally be raised to integer powers. Actually, the value part need not
- be a number; any product or quotient involving unit names is a units
- expression. Many of the units commands will also accept any formula,
- where the command applies to all units expressions which appear in the
- formula.
- A unit name is a variable whose name appears in the @dfn{unit table},
- or a variable whose name is a prefix character like @samp{k} (for ``kilo'')
- or @samp{u} (for ``micro'') followed by a name in the unit table.
- A substantial table of built-in units is provided with Calc;
- @pxref{Predefined Units}. You can also define your own unit names;
- @pxref{User-Defined Units}.@refill
- Note that if the value part of a units expression is exactly @samp{1},
- it will be removed by the Calculator's automatic algebra routines: The
- formula @samp{1 mm} is ``simplified'' to @samp{mm}. This is only a
- display anomaly, however; @samp{mm} will work just fine as a
- representation of one millimeter.@refill
- You may find that Algebraic Mode (@pxref{Algebraic Entry}) makes working
- with units expressions easier. Otherwise, you will have to remember
- to hit the apostrophe key every time you wish to enter units.
- @kindex u s
- @pindex calc-simplify-units
- @ignore
- @mindex usimpl@idots
- @end ignore
- @tindex usimplify
- The @kbd{u s} (@code{calc-simplify-units}) [@code{usimplify}] command
- simplifies a units
- expression. It uses @kbd{a s} (@code{calc-simplify}) to simplify the
- expression first as a regular algebraic formula; it then looks for
- features that can be further simplified by converting one object's units
- to be compatible with another's. For example, @samp{5 m + 23 mm} will
- simplify to @samp{5.023 m}. When different but compatible units are
- added, the righthand term's units are converted to match those of the
- lefthand term. @xref{Simplification Modes}, for a way to have this done
- automatically at all times.@refill
- Units simplification also handles quotients of two units with the same
- dimensionality, as in @w{@samp{2 in s/L cm}} to @samp{5.08 s/L}; fractional
- powers of unit expressions, as in @samp{sqrt(9 mm^2)} to @samp{3 mm} and
- @samp{sqrt(9 acre)} to a quantity in meters; and @code{floor},
- @code{ceil}, @code{round}, @code{rounde}, @code{roundu}, @code{trunc},
- @code{float}, @code{frac}, @code{abs}, and @code{clean}
- applied to units expressions, in which case
- the operation in question is applied only to the numeric part of the
- expression. Finally, trigonometric functions of quantities with units
- of angle are evaluated, regardless of the current angular mode.@refill
- @kindex u c
- @pindex calc-convert-units
- The @kbd{u c} (@code{calc-convert-units}) command converts a units
- expression to new, compatible units. For example, given the units
- expression @samp{55 mph}, typing @kbd{u c m/s @key{RET}} produces
- @samp{24.5872 m/s}. If the units you request are inconsistent with
- the original units, the number will be converted into your units
- times whatever ``remainder'' units are left over. For example,
- converting @samp{55 mph} into acres produces @samp{6.08e-3 acre / m s}.
- (Recall that multiplication binds more strongly than division in Calc
- formulas, so the units here are acres per meter-second.) Remainder
- units are expressed in terms of ``fundamental'' units like @samp{m} and
- @samp{s}, regardless of the input units.
- One special exception is that if you specify a single unit name, and
- a compatible unit appears somewhere in the units expression, then
- that compatible unit will be converted to the new unit and the
- remaining units in the expression will be left alone. For example,
- given the input @samp{980 cm/s^2}, the command @kbd{u c ms} will
- change the @samp{s} to @samp{ms} to get @samp{9.8e-4 cm/ms^2}.
- The ``remainder unit'' @samp{cm} is left alone rather than being
- changed to the base unit @samp{m}.
- You can use explicit unit conversion instead of the @kbd{u s} command
- to gain more control over the units of the result of an expression.
- For example, given @samp{5 m + 23 mm}, you can type @kbd{u c m} or
- @kbd{u c mm} to express the result in either meters or millimeters.
- (For that matter, you could type @kbd{u c fath} to express the result
- in fathoms, if you preferred!)
- In place of a specific set of units, you can also enter one of the
- units system names @code{si}, @code{mks} (equivalent), or @code{cgs}.
- For example, @kbd{u c si @key{RET}} converts the expression into
- International System of Units (SI) base units. Also, @kbd{u c base}
- converts to Calc's base units, which are the same as @code{si} units
- except that @code{base} uses @samp{g} as the fundamental unit of mass
- whereas @code{si} uses @samp{kg}.
- @cindex Composite units
- The @kbd{u c} command also accepts @dfn{composite units}, which
- are expressed as the sum of several compatible unit names. For
- example, converting @samp{30.5 in} to units @samp{mi+ft+in} (miles,
- feet, and inches) produces @samp{2 ft + 6.5 in}. Calc first
- sorts the unit names into order of decreasing relative size.
- It then accounts for as much of the input quantity as it can
- using an integer number times the largest unit, then moves on
- to the next smaller unit, and so on. Only the smallest unit
- may have a non-integer amount attached in the result. A few
- standard unit names exist for common combinations, such as
- @code{mfi} for @samp{mi+ft+in}, and @code{tpo} for @samp{ton+lb+oz}.
- Composite units are expanded as if by @kbd{a x}, so that
- @samp{(ft+in)/hr} is first converted to @samp{ft/hr+in/hr}.
- If the value on the stack does not contain any units, @kbd{u c} will
- prompt first for the old units which this value should be considered
- to have, then for the new units. Assuming the old and new units you
- give are consistent with each other, the result also will not contain
- any units. For example, @kbd{@w{u c} cm @key{RET} in @key{RET}} converts the number
- 2 on the stack to 5.08.
- @kindex u b
- @pindex calc-base-units
- The @kbd{u b} (@code{calc-base-units}) command is shorthand for
- @kbd{u c base}; it converts the units expression on the top of the
- stack into @code{base} units. If @kbd{u s} does not simplify a
- units expression as far as you would like, try @kbd{u b}.
- The @kbd{u c} and @kbd{u b} commands treat temperature units (like
- @samp{degC} and @samp{K}) as relative temperatures. For example,
- @kbd{u c} converts @samp{10 degC} to @samp{18 degF}: A change of 10
- degrees Celsius corresponds to a change of 18 degrees Fahrenheit.
- @kindex u t
- @pindex calc-convert-temperature
- @cindex Temperature conversion
- The @kbd{u t} (@code{calc-convert-temperature}) command converts
- absolute temperatures. The value on the stack must be a simple units
- expression with units of temperature only. This command would convert
- @samp{10 degC} to @samp{50 degF}, the equivalent temperature on the
- Fahrenheit scale.@refill
- @kindex u r
- @pindex calc-remove-units
- @kindex u x
- @pindex calc-extract-units
- The @kbd{u r} (@code{calc-remove-units}) command removes units from the
- formula at the top of the stack. The @kbd{u x}
- (@code{calc-extract-units}) command extracts only the units portion of a
- formula. These commands essentially replace every term of the formula
- that does or doesn't (respectively) look like a unit name by the
- constant 1, then resimplify the formula.@refill
- @kindex u a
- @pindex calc-autorange-units
- The @kbd{u a} (@code{calc-autorange-units}) command turns on and off a
- mode in which unit prefixes like @code{k} (``kilo'') are automatically
- applied to keep the numeric part of a units expression in a reasonable
- range. This mode affects @kbd{u s} and all units conversion commands
- except @kbd{u b}. For example, with autoranging on, @samp{12345 Hz}
- will be simplified to @samp{12.345 kHz}. Autoranging is useful for
- some kinds of units (like @code{Hz} and @code{m}), but is probably
- undesirable for non-metric units like @code{ft} and @code{tbsp}.
- (Composite units are more appropriate for those; see above.)
- Autoranging always applies the prefix to the leftmost unit name.
- Calc chooses the largest prefix that causes the number to be greater
- than or equal to 1.0. Thus an increasing sequence of adjusted times
- would be @samp{1 ms, 10 ms, 100 ms, 1 s, 10 s, 100 s, 1 ks}.
- Generally the rule of thumb is that the number will be adjusted
- to be in the interval @samp{[1 .. 1000)}, although there are several
- exceptions to this rule. First, if the unit has a power then this
- is not possible; @samp{0.1 s^2} simplifies to @samp{100000 ms^2}.
- Second, the ``centi-'' prefix is allowed to form @code{cm} (centimeters),
- but will not apply to other units. The ``deci-,'' ``deka-,'' and
- ``hecto-'' prefixes are never used. Thus the allowable interval is
- @samp{[1 .. 10)} for millimeters and @samp{[1 .. 100)} for centimeters.
- Finally, a prefix will not be added to a unit if the resulting name
- is also the actual name of another unit; @samp{1e-15 t} would normally
- be considered a ``femto-ton,'' but it is written as @samp{1000 at}
- (1000 atto-tons) instead because @code{ft} would be confused with feet.
- @node The Units Table, Predefined Units, Basic Operations on Units, Units
- @section The Units Table
- @noindent
- @kindex u v
- @pindex calc-enter-units-table
- The @kbd{u v} (@code{calc-enter-units-table}) command displays the units table
- in another buffer called @code{*Units Table*}. Each entry in this table
- gives the unit name as it would appear in an expression, the definition
- of the unit in terms of simpler units, and a full name or description of
- the unit. Fundamental units are defined as themselves; these are the
- units produced by the @kbd{u b} command. The fundamental units are
- meters, seconds, grams, kelvins, amperes, candelas, moles, radians,
- and steradians.
- The Units Table buffer also displays the Unit Prefix Table. Note that
- two prefixes, ``kilo'' and ``hecto,'' accept either upper- or lower-case
- prefix letters. @samp{Meg} is also accepted as a synonym for the @samp{M}
- prefix. Whenever a unit name can be interpreted as either a built-in name
- or a prefix followed by another built-in name, the former interpretation
- wins. For example, @samp{2 pt} means two pints, not two pico-tons.
- The Units Table buffer, once created, is not rebuilt unless you define
- new units. To force the buffer to be rebuilt, give any numeric prefix
- argument to @kbd{u v}.
- @kindex u V
- @pindex calc-view-units-table
- The @kbd{u V} (@code{calc-view-units-table}) command is like @kbd{u v} except
- that the cursor is not moved into the Units Table buffer. You can
- type @kbd{u V} again to remove the Units Table from the display. To
- return from the Units Table buffer after a @kbd{u v}, type @kbd{M-# c}
- again or use the regular Emacs @w{@kbd{C-x o}} (@code{other-window})
- command. You can also kill the buffer with @kbd{C-x k} if you wish;
- the actual units table is safely stored inside the Calculator.
- @kindex u g
- @pindex calc-get-unit-definition
- The @kbd{u g} (@code{calc-get-unit-definition}) command retrieves a unit's
- defining expression and pushes it onto the Calculator stack. For example,
- @kbd{u g in} will produce the expression @samp{2.54 cm}. This is the
- same definition for the unit that would appear in the Units Table buffer.
- Note that this command works only for actual unit names; @kbd{u g km}
- will report that no such unit exists, for example, because @code{km} is
- really the unit @code{m} with a @code{k} (``kilo'') prefix. To see a
- definition of a unit in terms of base units, it is easier to push the
- unit name on the stack and then reduce it to base units with @kbd{u b}.
- @kindex u e
- @pindex calc-explain-units
- The @kbd{u e} (@code{calc-explain-units}) command displays an English
- description of the units of the expression on the stack. For example,
- for the expression @samp{62 km^2 g / s^2 mol K}, the description is
- ``Square-Kilometer Gram per (Second-squared Mole Degree-Kelvin).'' This
- command uses the English descriptions that appear in the righthand
- column of the Units Table.
- @node Predefined Units, User-Defined Units, The Units Table, Units
- @section Predefined Units
- @noindent
- Since the exact definitions of many kinds of units have evolved over the
- years, and since certain countries sometimes have local differences in
- their definitions, it is a good idea to examine Calc's definition of a
- unit before depending on its exact value. For example, there are three
- different units for gallons, corresponding to the US (@code{gal}),
- Canadian (@code{galC}), and British (@code{galUK}) definitions. Also,
- note that @code{oz} is a standard ounce of mass, @code{ozt} is a Troy
- ounce, and @code{ozfl} is a fluid ounce.
- The temperature units corresponding to degrees Kelvin and Centigrade
- (Celsius) are the same in this table, since most units commands treat
- temperatures as being relative. The @code{calc-convert-temperature}
- command has special rules for handling the different absolute magnitudes
- of the various temperature scales.
- The unit of volume ``liters'' can be referred to by either the lower-case
- @code{l} or the upper-case @code{L}.
- The unit @code{A} stands for Amperes; the name @code{Ang} is used
- @tex
- for \AA ngstroms.
- @end tex
- @ifinfo
- for Angstroms.
- @end ifinfo
- The unit @code{pt} stands for pints; the name @code{point} stands for
- a typographical point, defined by @samp{72 point = 1 in}. There is
- also @code{tpt}, which stands for a printer's point as defined by the
- @TeX{} typesetting system: @samp{72.27 tpt = 1 in}.
- The unit @code{e} stands for the elementary (electron) unit of charge;
- because algebra command could mistake this for the special constant
- @cite{e}, Calc provides the alternate unit name @code{ech} which is
- preferable to @code{e}.
- The name @code{g} stands for one gram of mass; there is also @code{gf},
- one gram of force. (Likewise for @kbd{lb}, pounds, and @kbd{lbf}.)
- Meanwhile, one ``@cite{g}'' of acceleration is denoted @code{ga}.
- The unit @code{ton} is a U.S. ton of @samp{2000 lb}, and @code{t} is
- a metric ton of @samp{1000 kg}.
- The names @code{s} (or @code{sec}) and @code{min} refer to units of
- time; @code{arcsec} and @code{arcmin} are units of angle.
- Some ``units'' are really physical constants; for example, @code{c}
- represents the speed of light, and @code{h} represents Planck's
- constant. You can use these just like other units: converting
- @samp{.5 c} to @samp{m/s} expresses one-half the speed of light in
- meters per second. You can also use this merely as a handy reference;
- the @kbd{u g} command gets the definition of one of these constants
- in its normal terms, and @kbd{u b} expresses the definition in base
- units.
- Two units, @code{pi} and @code{fsc} (the fine structure constant,
- approximately @i{1/137}) are dimensionless. The units simplification
- commands simply treat these names as equivalent to their corresponding
- values. However you can, for example, use @kbd{u c} to convert a pure
- number into multiples of the fine structure constant, or @kbd{u b} to
- convert this back into a pure number. (When @kbd{u c} prompts for the
- ``old units,'' just enter a blank line to signify that the value
- really is unitless.)
- @c Describe angular units, luminosity vs. steradians problem.
- @node User-Defined Units, , Predefined Units, Units
- @section User-Defined Units
- @noindent
- Calc provides ways to get quick access to your selected ``favorite''
- units, as well as ways to define your own new units.
- @kindex u 0-9
- @pindex calc-quick-units
- @vindex Units
- @cindex @code{Units} variable
- @cindex Quick units
- To select your favorite units, store a vector of unit names or
- expressions in the Calc variable @code{Units}. The @kbd{u 1}
- through @kbd{u 9} commands (@code{calc-quick-units}) provide access
- to these units. If the value on the top of the stack is a plain
- number (with no units attached), then @kbd{u 1} gives it the
- specified units. (Basically, it multiplies the number by the
- first item in the @code{Units} vector.) If the number on the
- stack @emph{does} have units, then @kbd{u 1} converts that number
- to the new units. For example, suppose the vector @samp{[in, ft]}
- is stored in @code{Units}. Then @kbd{30 u 1} will create the
- expression @samp{30 in}, and @kbd{u 2} will convert that expression
- to @samp{2.5 ft}.
- The @kbd{u 0} command accesses the tenth element of @code{Units}.
- Only ten quick units may be defined at a time. If the @code{Units}
- variable has no stored value (the default), or if its value is not
- a vector, then the quick-units commands will not function. The
- @kbd{s U} command is a convenient way to edit the @code{Units}
- variable; @pxref{Operations on Variables}.
- @kindex u d
- @pindex calc-define-unit
- @cindex User-defined units
- The @kbd{u d} (@code{calc-define-unit}) command records the units
- expression on the top of the stack as the definition for a new,
- user-defined unit. For example, putting @samp{16.5 ft} on the stack and
- typing @kbd{u d rod} defines the new unit @samp{rod} to be equivalent to
- 16.5 feet. The unit conversion and simplification commands will now
- treat @code{rod} just like any other unit of length. You will also be
- prompted for an optional English description of the unit, which will
- appear in the Units Table.
- @kindex u u
- @pindex calc-undefine-unit
- The @kbd{u u} (@code{calc-undefine-unit}) command removes a user-defined
- unit. It is not possible to remove one of the predefined units,
- however.
- If you define a unit with an existing unit name, your new definition
- will replace the original definition of that unit. If the unit was a
- predefined unit, the old definition will not be replaced, only
- ``shadowed.'' The built-in definition will reappear if you later use
- @kbd{u u} to remove the shadowing definition.
- To create a new fundamental unit, use either 1 or the unit name itself
- as the defining expression. Otherwise the expression can involve any
- other units that you like (except for composite units like @samp{mfi}).
- You can create a new composite unit with a sum of other units as the
- defining expression. The next unit operation like @kbd{u c} or @kbd{u v}
- will rebuild the internal unit table incorporating your modifications.
- Note that erroneous definitions (such as two units defined in terms of
- each other) will not be detected until the unit table is next rebuilt;
- @kbd{u v} is a convenient way to force this to happen.
- Temperature units are treated specially inside the Calculator; it is not
- possible to create user-defined temperature units.
- @kindex u p
- @pindex calc-permanent-units
- @cindex @file{.emacs} file, user-defined units
- The @kbd{u p} (@code{calc-permanent-units}) command stores the user-defined
- units in your @file{.emacs} file, so that the units will still be
- available in subsequent Emacs sessions. If there was already a set of
- user-defined units in your @file{.emacs} file, it is replaced by the
- new set. (@xref{General Mode Commands}, for a way to tell Calc to use
- a different file instead of @file{.emacs}.)
- @node Store and Recall, Graphics, Units, Top
- @chapter Storing and Recalling
- @noindent
- Calculator variables are really just Lisp variables that contain numbers
- or formulas in a form that Calc can understand. The commands in this
- section allow you to manipulate variables conveniently. Commands related
- to variables use the @kbd{s} prefix key.
- @menu
- * Storing Variables::
- * Recalling Variables::
- * Operations on Variables::
- * Let Command::
- * Evaluates-To Operator::
- @end menu
- @node Storing Variables, Recalling Variables, Store and Recall, Store and Recall
- @section Storing Variables
- @noindent
- @kindex s s
- @pindex calc-store
- @cindex Storing variables
- @cindex Quick variables
- @vindex q0
- @vindex q9
- The @kbd{s s} (@code{calc-store}) command stores the value at the top of
- the stack into a specified variable. It prompts you to enter the
- name of the variable. If you press a single digit, the value is stored
- immediately in one of the ``quick'' variables @code{var-q0} through
- @code{var-q9}. Or you can enter any variable name. The prefix @samp{var-}
- is supplied for you; when a name appears in a formula (as in @samp{a+q2})
- the prefix @samp{var-} is also supplied there, so normally you can simply
- forget about @samp{var-} everywhere. Its only purpose is to enable you to
- use Calc variables without fear of accidentally clobbering some variable in
- another Emacs package. If you really want to store in an arbitrary Lisp
- variable, just backspace over the @samp{var-}.
- @kindex s t
- @pindex calc-store-into
- The @kbd{s s} command leaves the stored value on the stack. There is
- also an @kbd{s t} (@code{calc-store-into}) command, which removes a
- value from the stack and stores it in a variable.
- If the top of stack value is an equation @samp{a = 7} or assignment
- @samp{a := 7} with a variable on the lefthand side, then Calc will
- assign that variable with that value by default, i.e., if you type
- @kbd{s s @key{RET}} or @kbd{s t @key{RET}}. In this example, the
- value 7 would be stored in the variable @samp{a}. (If you do type
- a variable name at the prompt, the top-of-stack value is stored in
- its entirety, even if it is an equation: @samp{s s b @key{RET}}
- with @samp{a := 7} on the stack stores @samp{a := 7} in @code{b}.)
- In fact, the top of stack value can be a vector of equations or
- assignments with different variables on their lefthand sides; the
- default will be to store all the variables with their corresponding
- righthand sides simultaneously.
- It is also possible to type an equation or assignment directly at
- the prompt for the @kbd{s s} or @kbd{s t} command: @kbd{s s foo = 7}.
- In this case the expression to the right of the @kbd{=} or @kbd{:=}
- symbol is evaluated as if by the @kbd{=} command, and that value is
- stored in the variable. No value is taken from the stack; @kbd{s s}
- and @kbd{s t} are equivalent when used in this way.
- @kindex s 0-9
- @kindex t 0-9
- The prefix keys @kbd{s} and @kbd{t} may be followed immediately by a
- digit; @kbd{s 9} is equivalent to @kbd{s s 9}, and @kbd{t 9} is
- equivalent to @kbd{s t 9}. (The @kbd{t} prefix is otherwise used
- for trail and time/date commands.)
- @kindex s +
- @kindex s -
- @ignore
- @mindex @idots
- @end ignore
- @kindex s *
- @ignore
- @mindex @null
- @end ignore
- @kindex s /
- @ignore
- @mindex @null
- @end ignore
- @kindex s ^
- @ignore
- @mindex @null
- @end ignore
- @kindex s |
- @ignore
- @mindex @null
- @end ignore
- @kindex s n
- @ignore
- @mindex @null
- @end ignore
- @kindex s &
- @ignore
- @mindex @null
- @end ignore
- @kindex s [
- @ignore
- @mindex @null
- @end ignore
- @kindex s ]
- @pindex calc-store-plus
- @pindex calc-store-minus
- @pindex calc-store-times
- @pindex calc-store-div
- @pindex calc-store-power
- @pindex calc-store-concat
- @pindex calc-store-neg
- @pindex calc-store-inv
- @pindex calc-store-decr
- @pindex calc-store-incr
- There are also several ``arithmetic store'' commands. For example,
- @kbd{s +} removes a value from the stack and adds it to the specified
- variable. The other arithmetic stores are @kbd{s -}, @kbd{s *}, @kbd{s /},
- @kbd{s ^}, and @w{@kbd{s |}} (vector concatenation), plus @kbd{s n} and
- @kbd{s &} which negate or invert the value in a variable, and @w{@kbd{s [}}
- and @kbd{s ]} which decrease or increase a variable by one.
- All the arithmetic stores accept the Inverse prefix to reverse the
- order of the operands. If @cite{v} represents the contents of the
- variable, and @cite{a} is the value drawn from the stack, then regular
- @w{@kbd{s -}} assigns @c{$v \coloneq v - a$}
- @cite{v := v - a}, but @kbd{I s -} assigns
- @c{$v \coloneq a - v$}
- @cite{v := a - v}. While @kbd{I s *} might seem pointless, it is
- useful if matrix multiplication is involved. Actually, all the
- arithmetic stores use formulas designed to behave usefully both
- forwards and backwards:
- @example
- @group
- s + v := v + a v := a + v
- s - v := v - a v := a - v
- s * v := v * a v := a * v
- s / v := v / a v := a / v
- s ^ v := v ^ a v := a ^ v
- s | v := v | a v := a | v
- s n v := v / (-1) v := (-1) / v
- s & v := v ^ (-1) v := (-1) ^ v
- s [ v := v - 1 v := 1 - v
- s ] v := v - (-1) v := (-1) - v
- @end group
- @end example
- In the last four cases, a numeric prefix argument will be used in
- place of the number one. (For example, @kbd{M-2 s ]} increases
- a variable by 2, and @kbd{M-2 I s ]} replaces a variable by
- minus-two minus the variable.
- The first six arithmetic stores can also be typed @kbd{s t +}, @kbd{s t -},
- etc. The commands @kbd{s s +}, @kbd{s s -}, and so on are analogous
- arithmetic stores that don't remove the value @cite{a} from the stack.
- All arithmetic stores report the new value of the variable in the
- Trail for your information. They signal an error if the variable
- previously had no stored value. If default simplifications have been
- turned off, the arithmetic stores temporarily turn them on for numeric
- arguments only (i.e., they temporarily do an @kbd{m N} command).
- @xref{Simplification Modes}. Large vectors put in the trail by
- these commands always use abbreviated (@kbd{t .}) mode.
- @kindex s m
- @pindex calc-store-map
- The @kbd{s m} command is a general way to adjust a variable's value
- using any Calc function. It is a ``mapping'' command analogous to
- @kbd{V M}, @kbd{V R}, etc. @xref{Reducing and Mapping}, to see
- how to specify a function for a mapping command. Basically,
- all you do is type the Calc command key that would invoke that
- function normally. For example, @kbd{s m n} applies the @kbd{n}
- key to negate the contents of the variable, so @kbd{s m n} is
- equivalent to @kbd{s n}. Also, @kbd{s m Q} takes the square root
- of the value stored in a variable, @kbd{s m v v} uses @kbd{v v} to
- reverse the vector stored in the variable, and @kbd{s m H I S}
- takes the hyperbolic arcsine of the variable contents.
- If the mapping function takes two or more arguments, the additional
- arguments are taken from the stack; the old value of the variable
- is provided as the first argument. Thus @kbd{s m -} with @cite{a}
- on the stack computes @cite{v - a}, just like @kbd{s -}. With the
- Inverse prefix, the variable's original value becomes the @emph{last}
- argument instead of the first. Thus @kbd{I s m -} is also
- equivalent to @kbd{I s -}.
- @kindex s x
- @pindex calc-store-exchange
- The @kbd{s x} (@code{calc-store-exchange}) command exchanges the value
- of a variable with the value on the top of the stack. Naturally, the
- variable must already have a stored value for this to work.
- You can type an equation or assignment at the @kbd{s x} prompt. The
- command @kbd{s x a=6} takes no values from the stack; instead, it
- pushes the old value of @samp{a} on the stack and stores @samp{a = 6}.
- @kindex s u
- @pindex calc-unstore
- @cindex Void variables
- @cindex Un-storing variables
- Until you store something in them, variables are ``void,'' that is, they
- contain no value at all. If they appear in an algebraic formula they
- will be left alone even if you press @kbd{=} (@code{calc-evaluate}).
- The @kbd{s u} (@code{calc-unstore}) command returns a variable to the
- void state.@refill
- The only variables with predefined values are the ``special constants''
- @code{pi}, @code{e}, @code{i}, @code{phi}, and @code{gamma}. You are free
- to unstore these variables or to store new values into them if you like,
- although some of the algebraic-manipulation functions may assume these
- variables represent their standard values. Calc displays a warning if
- you change the value of one of these variables, or of one of the other
- special variables @code{inf}, @code{uinf}, and @code{nan} (which are
- normally void).
- Note that @code{var-pi} doesn't actually have 3.14159265359 stored
- in it, but rather a special magic value that evaluates to @c{$\pi$}
- @cite{pi}
- at the current precision. Likewise @code{var-e}, @code{var-i}, and
- @code{var-phi} evaluate according to the current precision or polar mode.
- If you recall a value from @code{pi} and store it back, this magic
- property will be lost.
- @kindex s c
- @pindex calc-copy-variable
- The @kbd{s c} (@code{calc-copy-variable}) command copies the stored
- value of one variable to another. It differs from a simple @kbd{s r}
- followed by an @kbd{s t} in two important ways. First, the value never
- goes on the stack and thus is never rounded, evaluated, or simplified
- in any way; it is not even rounded down to the current precision.
- Second, the ``magic'' contents of a variable like @code{var-e} can
- be copied into another variable with this command, perhaps because
- you need to unstore @code{var-e} right now but you wish to put it
- back when you're done. The @kbd{s c} command is the only way to
- manipulate these magic values intact.
- @node Recalling Variables, Operations on Variables, Storing Variables, Store and Recall
- @section Recalling Variables
- @noindent
- @kindex s r
- @pindex calc-recall
- @cindex Recalling variables
- The most straightforward way to extract the stored value from a variable
- is to use the @kbd{s r} (@code{calc-recall}) command. This command prompts
- for a variable name (similarly to @code{calc-store}), looks up the value
- of the specified variable, and pushes that value onto the stack. It is
- an error to try to recall a void variable.
- It is also possible to recall the value from a variable by evaluating a
- formula containing that variable. For example, @kbd{' a @key{RET} =} is
- the same as @kbd{s r a @key{RET}} except that if the variable is void, the
- former will simply leave the formula @samp{a} on the stack whereas the
- latter will produce an error message.
- @kindex r 0-9
- The @kbd{r} prefix may be followed by a digit, so that @kbd{r 9} is
- equivalent to @kbd{s r 9}. (The @kbd{r} prefix is otherwise unused
- in the current version of Calc.)
- @node Operations on Variables, Let Command, Recalling Variables, Store and Recall
- @section Other Operations on Variables
- @noindent
- @kindex s e
- @pindex calc-edit-variable
- The @kbd{s e} (@code{calc-edit-variable}) command edits the stored
- value of a variable without ever putting that value on the stack
- or simplifying or evaluating the value. It prompts for the name of
- the variable to edit. If the variable has no stored value, the
- editing buffer will start out empty. If the editing buffer is
- empty when you press @kbd{M-# M-#} to finish, the variable will
- be made void. @xref{Editing Stack Entries}, for a general
- description of editing.
- The @kbd{s e} command is especially useful for creating and editing
- rewrite rules which are stored in variables. Sometimes these rules
- contain formulas which must not be evaluated until the rules are
- actually used. (For example, they may refer to @samp{deriv(x,y)},
- where @code{x} will someday become some expression involving @code{y};
- if you let Calc evaluate the rule while you are defining it, Calc will
- replace @samp{deriv(x,y)} with 0 because the formula @code{x} does
- not itself refer to @code{y}.) By contrast, recalling the variable,
- editing with @kbd{`}, and storing will evaluate the variable's value
- as a side effect of putting the value on the stack.
- @kindex s A
- @kindex s D
- @ignore
- @mindex @idots
- @end ignore
- @kindex s E
- @ignore
- @mindex @null
- @end ignore
- @kindex s F
- @ignore
- @mindex @null
- @end ignore
- @kindex s G
- @ignore
- @mindex @null
- @end ignore
- @kindex s H
- @ignore
- @mindex @null
- @end ignore
- @kindex s I
- @ignore
- @mindex @null
- @end ignore
- @kindex s L
- @ignore
- @mindex @null
- @end ignore
- @kindex s P
- @ignore
- @mindex @null
- @end ignore
- @kindex s R
- @ignore
- @mindex @null
- @end ignore
- @kindex s T
- @ignore
- @mindex @null
- @end ignore
- @kindex s U
- @ignore
- @mindex @null
- @end ignore
- @kindex s X
- @pindex calc-store-AlgSimpRules
- @pindex calc-store-Decls
- @pindex calc-store-EvalRules
- @pindex calc-store-FitRules
- @pindex calc-store-GenCount
- @pindex calc-store-Holidays
- @pindex calc-store-IntegLimit
- @pindex calc-store-LineStyles
- @pindex calc-store-PointStyles
- @pindex calc-store-PlotRejects
- @pindex calc-store-TimeZone
- @pindex calc-store-Units
- @pindex calc-store-ExtSimpRules
- There are several special-purpose variable-editing commands that
- use the @kbd{s} prefix followed by a shifted letter:
- @table @kbd
- @item s A
- Edit @code{AlgSimpRules}. @xref{Algebraic Simplifications}.
- @item s D
- Edit @code{Decls}. @xref{Declarations}.
- @item s E
- Edit @code{EvalRules}. @xref{Default Simplifications}.
- @item s F
- Edit @code{FitRules}. @xref{Curve Fitting}.
- @item s G
- Edit @code{GenCount}. @xref{Solving Equations}.
- @item s H
- Edit @code{Holidays}. @xref{Business Days}.
- @item s I
- Edit @code{IntegLimit}. @xref{Calculus}.
- @item s L
- Edit @code{LineStyles}. @xref{Graphics}.
- @item s P
- Edit @code{PointStyles}. @xref{Graphics}.
- @item s R
- Edit @code{PlotRejects}. @xref{Graphics}.
- @item s T
- Edit @code{TimeZone}. @xref{Time Zones}.
- @item s U
- Edit @code{Units}. @xref{User-Defined Units}.
- @item s X
- Edit @code{ExtSimpRules}. @xref{Unsafe Simplifications}.
- @end table
- These commands are just versions of @kbd{s e} that use fixed variable
- names rather than prompting for the variable name.
- @kindex s p
- @pindex calc-permanent-variable
- @cindex Storing variables
- @cindex Permanent variables
- @cindex @file{.emacs} file, veriables
- The @kbd{s p} (@code{calc-permanent-variable}) command saves a
- variable's value permanently in your @file{.emacs} file, so that its
- value will still be available in future Emacs sessions. You can
- re-execute @w{@kbd{s p}} later on to update the saved value, but the
- only way to remove a saved variable is to edit your @file{.emacs} file
- by hand. (@xref{General Mode Commands}, for a way to tell Calc to
- use a different file instead of @file{.emacs}.)
- If you do not specify the name of a variable to save (i.e.,
- @kbd{s p @key{RET}}), all @samp{var-} variables with defined values
- are saved except for the special constants @code{pi}, @code{e},
- @code{i}, @code{phi}, and @code{gamma}; the variables @code{TimeZone}
- and @code{PlotRejects};
- @code{FitRules}, @code{DistribRules}, and other built-in rewrite
- rules; and @code{PlotData@var{n}} variables generated
- by the graphics commands. (You can still save these variables by
- explicitly naming them in an @kbd{s p} command.)@refill
- @kindex s i
- @pindex calc-insert-variables
- The @kbd{s i} (@code{calc-insert-variables}) command writes
- the values of all @samp{var-} variables into a specified buffer.
- The variables are written in the form of Lisp @code{setq} commands
- which store the values in string form. You can place these commands
- in your @file{.emacs} buffer if you wish, though in this case it
- would be easier to use @kbd{s p @key{RET}}. (Note that @kbd{s i}
- omits the same set of variables as @w{@kbd{s p @key{RET}}}; the difference
- is that @kbd{s i} will store the variables in any buffer, and it also
- stores in a more human-readable format.)
- @node Let Command, Evaluates-To Operator, Operations on Variables, Store and Recall
- @section The Let Command
- @noindent
- @kindex s l
- @pindex calc-let
- @cindex Variables, temporary assignment
- @cindex Temporary assignment to variables
- If you have an expression like @samp{a+b^2} on the stack and you wish to
- compute its value where @cite{b=3}, you can simply store 3 in @cite{b} and
- then press @kbd{=} to reevaluate the formula. This has the side-effect
- of leaving the stored value of 3 in @cite{b} for future operations.
- The @kbd{s l} (@code{calc-let}) command evaluates a formula under a
- @emph{temporary} assignment of a variable. It stores the value on the
- top of the stack into the specified variable, then evaluates the
- second-to-top stack entry, then restores the original value (or lack of one)
- in the variable. Thus after @kbd{'@w{ }a+b^2 @key{RET} 3 s l b @key{RET}},
- the stack will contain the formula @samp{a + 9}. The subsequent command
- @kbd{@w{5 s l a} @key{RET}} will replace this formula with the number 14.
- The variables @samp{a} and @samp{b} are not permanently affected in any way
- by these commands.
- The value on the top of the stack may be an equation or assignment, or
- a vector of equations or assignments, in which case the default will be
- analogous to the case of @kbd{s t @key{RET}}. @xref{Storing Variables}.
- Also, you can answer the variable-name prompt with an equation or
- assignment: @kbd{s l b=3 @key{RET}} is the same as storing 3 on the stack
- and typing @kbd{s l b @key{RET}}.
- The @kbd{a b} (@code{calc-substitute}) command is another way to substitute
- a variable with a value in a formula. It does an actual substitution
- rather than temporarily assigning the variable and evaluating. For
- example, letting @cite{n=2} in @samp{f(n pi)} with @kbd{a b} will
- produce @samp{f(2 pi)}, whereas @kbd{s l} would give @samp{f(6.28)}
- since the evaluation step will also evaluate @code{pi}.
- @node Evaluates-To Operator, , Let Command, Store and Recall
- @section The Evaluates-To Operator
- @noindent
- @tindex evalto
- @tindex =>
- @cindex Evaluates-to operator
- @cindex @samp{=>} operator
- The special algebraic symbol @samp{=>} is known as the @dfn{evaluates-to
- operator}. (It will show up as an @code{evalto} function call in
- other language modes like Pascal and @TeX{}.) This is a binary
- operator, that is, it has a lefthand and a righthand argument,
- although it can be entered with the righthand argument omitted.
- A formula like @samp{@var{a} => @var{b}} is evaluated by Calc as
- follows: First, @var{a} is not simplified or modified in any
- way. The previous value of argument @var{b} is thrown away; the
- formula @var{a} is then copied and evaluated as if by the @kbd{=}
- command according to all current modes and stored variable values,
- and the result is installed as the new value of @var{b}.
- For example, suppose you enter the algebraic formula @samp{2 + 3 => 17}.
- The number 17 is ignored, and the lefthand argument is left in its
- unevaluated form; the result is the formula @samp{2 + 3 => 5}.
- @kindex s =
- @pindex calc-evalto
- You can enter an @samp{=>} formula either directly using algebraic
- entry (in which case the righthand side may be omitted since it is
- going to be replaced right away anyhow), or by using the @kbd{s =}
- (@code{calc-evalto}) command, which takes @var{a} from the stack
- and replaces it with @samp{@var{a} => @var{b}}.
- Calc keeps track of all @samp{=>} operators on the stack, and
- recomputes them whenever anything changes that might affect their
- values, i.e., a mode setting or variable value. This occurs only
- if the @samp{=>} operator is at the top level of the formula, or
- if it is part of a top-level vector. In other words, pushing
- @samp{2 + (a => 17)} will change the 17 to the actual value of
- @samp{a} when you enter the formula, but the result will not be
- dynamically updated when @samp{a} is changed later because the
- @samp{=>} operator is buried inside a sum. However, a vector
- of @samp{=>} operators will be recomputed, since it is convenient
- to push a vector like @samp{[a =>, b =>, c =>]} on the stack to
- make a concise display of all the variables in your problem.
- (Another way to do this would be to use @samp{[a, b, c] =>},
- which provides a slightly different format of display. You
- can use whichever you find easiest to read.)
- @kindex m C
- @pindex calc-auto-recompute
- The @kbd{m C} (@code{calc-auto-recompute}) command allows you to
- turn this automatic recomputation on or off. If you turn
- recomputation off, you must explicitly recompute an @samp{=>}
- operator on the stack in one of the usual ways, such as by
- pressing @kbd{=}. Turning recomputation off temporarily can save
- a lot of time if you will be changing several modes or variables
- before you look at the @samp{=>} entries again.
- Most commands are not especially useful with @samp{=>} operators
- as arguments. For example, given @samp{x + 2 => 17}, it won't
- work to type @kbd{1 +} to get @samp{x + 3 => 18}. If you want
- to operate on the lefthand side of the @samp{=>} operator on
- the top of the stack, type @kbd{j 1} (that's the digit ``one'')
- to select the lefthand side, execute your commands, then type
- @kbd{j u} to unselect.
- All current modes apply when an @samp{=>} operator is computed,
- including the current simplification mode. Recall that the
- formula @samp{x + y + x} is not handled by Calc's default
- simplifications, but the @kbd{a s} command will reduce it to
- the simpler form @samp{y + 2 x}. You can also type @kbd{m A}
- to enable an algebraic-simplification mode in which the
- equivalent of @kbd{a s} is used on all of Calc's results.
- If you enter @samp{x + y + x =>} normally, the result will
- be @samp{x + y + x => x + y + x}. If you change to
- algebraic-simplification mode, the result will be
- @samp{x + y + x => y + 2 x}. However, just pressing @kbd{a s}
- once will have no effect on @samp{x + y + x => x + y + x},
- because the righthand side depends only on the lefthand side
- and the current mode settings, and the lefthand side is not
- affected by commands like @kbd{a s}.
- The ``let'' command (@kbd{s l}) has an interesting interaction
- with the @samp{=>} operator. The @kbd{s l} command evaluates the
- second-to-top stack entry with the top stack entry supplying
- a temporary value for a given variable. As you might expect,
- if that stack entry is an @samp{=>} operator its righthand
- side will temporarily show this value for the variable. In
- fact, all @samp{=>}s on the stack will be updated if they refer
- to that variable. But this change is temporary in the sense
- that the next command that causes Calc to look at those stack
- entries will make them revert to the old variable value.
- @smallexample
- @group
- 2: a => a 2: a => 17 2: a => a
- 1: a + 1 => a + 1 1: a + 1 => 18 1: a + 1 => a + 1
- . . .
- 17 s l a @key{RET} p 8 @key{RET}
- @end group
- @end smallexample
- Here the @kbd{p 8} command changes the current precision,
- thus causing the @samp{=>} forms to be recomputed after the
- influence of the ``let'' is gone. The @kbd{d @key{SPC}} command
- (@code{calc-refresh}) is a handy way to force the @samp{=>}
- operators on the stack to be recomputed without any other
- side effects.
- @kindex s :
- @pindex calc-assign
- @tindex assign
- @tindex :=
- Embedded Mode also uses @samp{=>} operators. In embedded mode,
- the lefthand side of an @samp{=>} operator can refer to variables
- assigned elsewhere in the file by @samp{:=} operators. The
- assignment operator @samp{a := 17} does not actually do anything
- by itself. But Embedded Mode recognizes it and marks it as a sort
- of file-local definition of the variable. You can enter @samp{:=}
- operators in algebraic mode, or by using the @kbd{s :}
- (@code{calc-assign}) [@code{assign}] command which takes a variable
- and value from the stack and replaces them with an assignment.
- @xref{TeX Language Mode}, for the way @samp{=>} appears in
- @TeX{} language output. The @dfn{eqn} mode gives similar
- treatment to @samp{=>}.
- @node Graphics, Kill and Yank, Store and Recall, Top
- @chapter Graphics
- @noindent
- The commands for graphing data begin with the @kbd{g} prefix key. Calc
- uses GNUPLOT 2.0 or 3.0 to do graphics. These commands will only work
- if GNUPLOT is available on your system. (While GNUPLOT sounds like
- a relative of GNU Emacs, it is actually completely unrelated.
- However, it is free software and can be obtained from the Free
- Software Foundation's machine @samp{prep.ai.mit.edu}.)
- @vindex calc-gnuplot-name
- If you have GNUPLOT installed on your system but Calc is unable to
- find it, you may need to set the @code{calc-gnuplot-name} variable
- in your @file{.emacs} file. You may also need to set some Lisp
- variables to show Calc how to run GNUPLOT on your system; these
- are described under @kbd{g D} and @kbd{g O} below. If you are
- using the X window system, Calc will configure GNUPLOT for you
- automatically. If you have GNUPLOT 3.0 and you are not using X,
- Calc will configure GNUPLOT to display graphs using simple character
- graphics that will work on any terminal.
- @menu
- * Basic Graphics::
- * Three Dimensional Graphics::
- * Managing Curves::
- * Graphics Options::
- * Devices::
- @end menu
- @node Basic Graphics, Three Dimensional Graphics, Graphics, Graphics
- @section Basic Graphics
- @noindent
- @kindex g f
- @pindex calc-graph-fast
- The easiest graphics command is @kbd{g f} (@code{calc-graph-fast}).
- This command takes two vectors of equal length from the stack.
- The vector at the top of the stack represents the ``y'' values of
- the various data points. The vector in the second-to-top position
- represents the corresponding ``x'' values. This command runs
- GNUPLOT (if it has not already been started by previous graphing
- commands) and displays the set of data points. The points will
- be connected by lines, and there will also be some kind of symbol
- to indicate the points themselves.
- The ``x'' entry may instead be an interval form, in which case suitable
- ``x'' values are interpolated between the minimum and maximum values of
- the interval (whether the interval is open or closed is ignored).
- The ``x'' entry may also be a number, in which case Calc uses the
- sequence of ``x'' values @cite{x}, @cite{x+1}, @cite{x+2}, etc.
- (Generally the number 0 or 1 would be used for @cite{x} in this case.)
- The ``y'' entry may be any formula instead of a vector. Calc effectively
- uses @kbd{N} (@code{calc-eval-num}) to evaluate variables in the formula;
- the result of this must be a formula in a single (unassigned) variable.
- The formula is plotted with this variable taking on the various ``x''
- values. Graphs of formulas by default use lines without symbols at the
- computed data points. Note that if neither ``x'' nor ``y'' is a vector,
- Calc guesses at a reasonable number of data points to use. See the
- @kbd{g N} command below. (The ``x'' values must be either a vector
- or an interval if ``y'' is a formula.)
- @ignore
- @starindex
- @end ignore
- @tindex xy
- If ``y'' is (or evaluates to) a formula of the form
- @samp{xy(@var{x}, @var{y})} then the result is a
- parametric plot. The two arguments of the fictitious @code{xy} function
- are used as the ``x'' and ``y'' coordinates of the curve, respectively.
- In this case the ``x'' vector or interval you specified is not directly
- visible in the graph. For example, if ``x'' is the interval @samp{[0..360]}
- and ``y'' is the formula @samp{xy(sin(t), cos(t))}, the resulting graph
- will be a circle.@refill
- Also, ``x'' and ``y'' may each be variable names, in which case Calc
- looks for suitable vectors, intervals, or formulas stored in those
- variables.
- The ``x'' and ``y'' values for the data points (as pulled from the vectors,
- calculated from the formulas, or interpolated from the intervals) should
- be real numbers (integers, fractions, or floats). If either the ``x''
- value or the ``y'' value of a given data point is not a real number, that
- data point will be omitted from the graph. The points on either side
- of the invalid point will @emph{not} be connected by a line.
- See the documentation for @kbd{g a} below for a description of the way
- numeric prefix arguments affect @kbd{g f}.
- @cindex @code{PlotRejects} variable
- @vindex PlotRejects
- If you store an empty vector in the variable @code{PlotRejects}
- (i.e., @kbd{[ ] s t PlotRejects}), Calc will append information to
- this vector for every data point which was rejected because its
- ``x'' or ``y'' values were not real numbers. The result will be
- a matrix where each row holds the curve number, data point number,
- ``x'' value, and ``y'' value for a rejected data point.
- @xref{Evaluates-To Operator}, for a handy way to keep tabs on the
- current value of @code{PlotRejects}. @xref{Operations on Variables},
- for the @kbd{s R} command which is another easy way to examine
- @code{PlotRejects}.
- @kindex g c
- @pindex calc-graph-clear
- To clear the graphics display, type @kbd{g c} (@code{calc-graph-clear}).
- If the GNUPLOT output device is an X window, the window will go away.
- Effects on other kinds of output devices will vary. You don't need
- to use @kbd{g c} if you don't want to---if you give another @kbd{g f}
- or @kbd{g p} command later on, it will reuse the existing graphics
- window if there is one.
- @node Three Dimensional Graphics, Managing Curves, Basic Graphics, Graphics
- @section Three-Dimensional Graphics
- @kindex g F
- @pindex calc-graph-fast-3d
- The @kbd{g F} (@code{calc-graph-fast-3d}) command makes a three-dimensional
- graph. It works only if you have GNUPLOT 3.0 or later; with GNUPLOT 2.0,
- you will see a GNUPLOT error message if you try this command.
- The @kbd{g F} command takes three values from the stack, called ``x'',
- ``y'', and ``z'', respectively. As was the case for 2D graphs, there
- are several options for these values.
- In the first case, ``x'' and ``y'' are each vectors (not necessarily of
- the same length); either or both may instead be interval forms. The
- ``z'' value must be a matrix with the same number of rows as elements
- in ``x'', and the same number of columns as elements in ``y''. The
- result is a surface plot where @c{$z_{ij}$}
- @cite{z_ij} is the height of the point
- at coordinate @cite{(x_i, y_j)} on the surface. The 3D graph will
- be displayed from a certain default viewpoint; you can change this
- viewpoint by adding a @samp{set view} to the @samp{*Gnuplot Commands*}
- buffer as described later. See the GNUPLOT 3.0 documentation for a
- description of the @samp{set view} command.
- Each point in the matrix will be displayed as a dot in the graph,
- and these points will be connected by a grid of lines (@dfn{isolines}).
- In the second case, ``x'', ``y'', and ``z'' are all vectors of equal
- length. The resulting graph displays a 3D line instead of a surface,
- where the coordinates of points along the line are successive triplets
- of values from the input vectors.
- In the third case, ``x'' and ``y'' are vectors or interval forms, and
- ``z'' is any formula involving two variables (not counting variables
- with assigned values). These variables are sorted into alphabetical
- order; the first takes on values from ``x'' and the second takes on
- values from ``y'' to form a matrix of results that are graphed as a
- 3D surface.
- @ignore
- @starindex
- @end ignore
- @tindex xyz
- If the ``z'' formula evaluates to a call to the fictitious function
- @samp{xyz(@var{x}, @var{y}, @var{z})}, then the result is a
- ``parametric surface.'' In this case, the axes of the graph are
- taken from the @var{x} and @var{y} values in these calls, and the
- ``x'' and ``y'' values from the input vectors or intervals are used only
- to specify the range of inputs to the formula. For example, plotting
- @samp{[0..360], [0..180], xyz(sin(x)*sin(y), cos(x)*sin(y), cos(y))}
- will draw a sphere. (Since the default resolution for 3D plots is
- 5 steps in each of ``x'' and ``y'', this will draw a very crude
- sphere. You could use the @kbd{g N} command, described below, to
- increase this resolution, or specify the ``x'' and ``y'' values as
- vectors with more than 5 elements.
- It is also possible to have a function in a regular @kbd{g f} plot
- evaluate to an @code{xyz} call. Since @kbd{g f} plots a line, not
- a surface, the result will be a 3D parametric line. For example,
- @samp{[[0..720], xyz(sin(x), cos(x), x)]} will plot two turns of a
- helix (a three-dimensional spiral).
- As for @kbd{g f}, each of ``x'', ``y'', and ``z'' may instead be
- variables containing the relevant data.
- @node Managing Curves, Graphics Options, Three Dimensional Graphics, Graphics
- @section Managing Curves
- @noindent
- The @kbd{g f} command is really shorthand for the following commands:
- @kbd{C-u g d g a g p}. Likewise, @w{@kbd{g F}} is shorthand for
- @kbd{C-u g d g A g p}. You can gain more control over your graph
- by using these commands directly.
- @kindex g a
- @pindex calc-graph-add
- The @kbd{g a} (@code{calc-graph-add}) command adds the ``curve''
- represented by the two values on the top of the stack to the current
- graph. You can have any number of curves in the same graph. When
- you give the @kbd{g p} command, all the curves will be drawn superimposed
- on the same axes.
- The @kbd{g a} command (and many others that affect the current graph)
- will cause a special buffer, @samp{*Gnuplot Commands*}, to be displayed
- in another window. This buffer is a template of the commands that will
- be sent to GNUPLOT when it is time to draw the graph. The first
- @kbd{g a} command adds a @code{plot} command to this buffer. Succeeding
- @kbd{g a} commands add extra curves onto that @code{plot} command.
- Other graph-related commands put other GNUPLOT commands into this
- buffer. In normal usage you never need to work with this buffer
- directly, but you can if you wish. The only constraint is that there
- must be only one @code{plot} command, and it must be the last command
- in the buffer. If you want to save and later restore a complete graph
- configuration, you can use regular Emacs commands to save and restore
- the contents of the @samp{*Gnuplot Commands*} buffer.
- @vindex PlotData1
- @vindex PlotData2
- If the values on the stack are not variable names, @kbd{g a} will invent
- variable names for them (of the form @samp{PlotData@var{n}}) and store
- the values in those variables. The ``x'' and ``y'' variables are what
- go into the @code{plot} command in the template. If you add a curve
- that uses a certain variable and then later change that variable, you
- can replot the graph without having to delete and re-add the curve.
- That's because the variable name, not the vector, interval or formula
- itself, is what was added by @kbd{g a}.
- A numeric prefix argument on @kbd{g a} or @kbd{g f} changes the way
- stack entries are interpreted as curves. With a positive prefix
- argument @cite{n}, the top @cite{n} stack entries are ``y'' values
- for @cite{n} different curves which share a common ``x'' value in
- the @cite{n+1}st stack entry. (Thus @kbd{g a} with no prefix
- argument is equivalent to @kbd{C-u 1 g a}.)
- A prefix of zero or plain @kbd{C-u} means to take two stack entries,
- ``x'' and ``y'' as usual, but to interpret ``y'' as a vector of
- ``y'' values for several curves that share a common ``x''.
- A negative prefix argument tells Calc to read @cite{n} vectors from
- the stack; each vector @cite{[x, y]} describes an independent curve.
- This is the only form of @kbd{g a} that creates several curves at once
- that don't have common ``x'' values. (Of course, the range of ``x''
- values covered by all the curves ought to be roughly the same if
- they are to look nice on the same graph.)
- For example, to plot @c{$\sin n x$}
- @cite{sin(n x)} for integers @cite{n}
- from 1 to 5, you could use @kbd{v x} to create a vector of integers
- (@cite{n}), then @kbd{V M '} or @kbd{V M $} to map @samp{sin(n x)}
- across this vector. The resulting vector of formulas is suitable
- for use as the ``y'' argument to a @kbd{C-u g a} or @kbd{C-u g f}
- command.
- @kindex g A
- @pindex calc-graph-add-3d
- The @kbd{g A} (@code{calc-graph-add-3d}) command adds a 3D curve
- to the graph. It is not legal to intermix 2D and 3D curves in a
- single graph. This command takes three arguments, ``x'', ``y'',
- and ``z'', from the stack. With a positive prefix @cite{n}, it
- takes @cite{n+2} arguments (common ``x'' and ``y'', plus @cite{n}
- separate ``z''s). With a zero prefix, it takes three stack entries
- but the ``z'' entry is a vector of curve values. With a negative
- prefix @cite{-n}, it takes @cite{n} vectors of the form @cite{[x, y, z]}.
- The @kbd{g A} command works by adding a @code{splot} (surface-plot)
- command to the @samp{*Gnuplot Commands*} buffer.
- (Although @kbd{g a} adds a 2D @code{plot} command to the
- @samp{*Gnuplot Commands*} buffer, Calc changes this to @code{splot}
- before sending it to GNUPLOT if it notices that the data points are
- evaluating to @code{xyz} calls. It will not work to mix 2D and 3D
- @kbd{g a} curves in a single graph, although Calc does not currently
- check for this.)
- @kindex g d
- @pindex calc-graph-delete
- The @kbd{g d} (@code{calc-graph-delete}) command deletes the most
- recently added curve from the graph. It has no effect if there are
- no curves in the graph. With a numeric prefix argument of any kind,
- it deletes all of the curves from the graph.
- @kindex g H
- @pindex calc-graph-hide
- The @kbd{g H} (@code{calc-graph-hide}) command ``hides'' or ``unhides''
- the most recently added curve. A hidden curve will not appear in
- the actual plot, but information about it such as its name and line and
- point styles will be retained.
- @kindex g j
- @pindex calc-graph-juggle
- The @kbd{g j} (@code{calc-graph-juggle}) command moves the curve
- at the end of the list (the ``most recently added curve'') to the
- front of the list. The next-most-recent curve is thus exposed for
- @w{@kbd{g d}} or similar commands to use. With @kbd{g j} you can work
- with any curve in the graph even though curve-related commands only
- affect the last curve in the list.
- @kindex g p
- @pindex calc-graph-plot
- The @kbd{g p} (@code{calc-graph-plot}) command uses GNUPLOT to draw
- the graph described in the @samp{*Gnuplot Commands*} buffer. Any
- GNUPLOT parameters which are not defined by commands in this buffer
- are reset to their default values. The variables named in the @code{plot}
- command are written to a temporary data file and the variable names
- are then replaced by the file name in the template. The resulting
- plotting commands are fed to the GNUPLOT program. See the documentation
- for the GNUPLOT program for more specific information. All temporary
- files are removed when Emacs or GNUPLOT exits.
- If you give a formula for ``y'', Calc will remember all the values that
- it calculates for the formula so that later plots can reuse these values.
- Calc throws out these saved values when you change any circumstances
- that may affect the data, such as switching from Degrees to Radians
- mode, or changing the value of a parameter in the formula. You can
- force Calc to recompute the data from scratch by giving a negative
- numeric prefix argument to @kbd{g p}.
- Calc uses a fairly rough step size when graphing formulas over intervals.
- This is to ensure quick response. You can ``refine'' a plot by giving
- a positive numeric prefix argument to @kbd{g p}. Calc goes through
- the data points it has computed and saved from previous plots of the
- function, and computes and inserts a new data point midway between
- each of the existing points. You can refine a plot any number of times,
- but beware that the amount of calculation involved doubles each time.
- Calc does not remember computed values for 3D graphs. This means the
- numerix prefix argument, if any, to @kbd{g p} is effectively ignored if
- the current graph is three-dimensional.
- @kindex g P
- @pindex calc-graph-print
- The @kbd{g P} (@code{calc-graph-print}) command is like @kbd{g p},
- except that it sends the output to a printer instead of to the
- screen. More precisely, @kbd{g p} looks for @samp{set terminal}
- or @samp{set output} commands in the @samp{*Gnuplot Commands*} buffer;
- lacking these it uses the default settings. However, @kbd{g P}
- ignores @samp{set terminal} and @samp{set output} commands and
- uses a different set of default values. All of these values are
- controlled by the @kbd{g D} and @kbd{g O} commands discussed below.
- Provided everything is set up properly, @kbd{g p} will plot to
- the screen unless you have specified otherwise and @kbd{g P} will
- always plot to the printer.
- @node Graphics Options, Devices, Managing Curves, Graphics
- @section Graphics Options
- @noindent
- @kindex g g
- @pindex calc-graph-grid
- The @kbd{g g} (@code{calc-graph-grid}) command turns the ``grid''
- on and off. It is off by default; tick marks appear only at the
- edges of the graph. With the grid turned on, dotted lines appear
- across the graph at each tick mark. Note that this command only
- changes the setting in @samp{*Gnuplot Commands*}; to see the effects
- of the change you must give another @kbd{g p} command.
- @kindex g b
- @pindex calc-graph-border
- The @kbd{g b} (@code{calc-graph-border}) command turns the border
- (the box that surrounds the graph) on and off. It is on by default.
- This command will only work with GNUPLOT 3.0 and later versions.
- @kindex g k
- @pindex calc-graph-key
- The @kbd{g k} (@code{calc-graph-key}) command turns the ``key''
- on and off. The key is a chart in the corner of the graph that
- shows the correspondence between curves and line styles. It is
- off by default, and is only really useful if you have several
- curves on the same graph.
- @kindex g N
- @pindex calc-graph-num-points
- The @kbd{g N} (@code{calc-graph-num-points}) command allows you
- to select the number of data points in the graph. This only affects
- curves where neither ``x'' nor ``y'' is specified as a vector.
- Enter a blank line to revert to the default value (initially 15).
- With no prefix argument, this command affects only the current graph.
- With a positive prefix argument this command changes or, if you enter
- a blank line, displays the default number of points used for all
- graphs created by @kbd{g a} that don't specify the resolution explicitly.
- With a negative prefix argument, this command changes or displays
- the default value (initially 5) used for 3D graphs created by @kbd{g A}.
- Note that a 3D setting of 5 means that a total of @cite{5^2 = 25} points
- will be computed for the surface.
- Data values in the graph of a function are normally computed to a
- precision of five digits, regardless of the current precision at the
- time. This is usually more than adequate, but there are cases where
- it will not be. For example, plotting @cite{1 + x} with @cite{x} in the
- interval @samp{[0 ..@: 1e-6]} will round all the data points down
- to 1.0! Putting the command @samp{set precision @var{n}} in the
- @samp{*Gnuplot Commands*} buffer will cause the data to be computed
- at precision @var{n} instead of 5. Since this is such a rare case,
- there is no keystroke-based command to set the precision.
- @kindex g h
- @pindex calc-graph-header
- The @kbd{g h} (@code{calc-graph-header}) command sets the title
- for the graph. This will show up centered above the graph.
- The default title is blank (no title).
- @kindex g n
- @pindex calc-graph-name
- The @kbd{g n} (@code{calc-graph-name}) command sets the title of an
- individual curve. Like the other curve-manipulating commands, it
- affects the most recently added curve, i.e., the last curve on the
- list in the @samp{*Gnuplot Commands*} buffer. To set the title of
- the other curves you must first juggle them to the end of the list
- with @kbd{g j}, or edit the @samp{*Gnuplot Commands*} buffer by hand.
- Curve titles appear in the key; if the key is turned off they are
- not used.
- @kindex g t
- @kindex g T
- @pindex calc-graph-title-x
- @pindex calc-graph-title-y
- The @kbd{g t} (@code{calc-graph-title-x}) and @kbd{g T}
- (@code{calc-graph-title-y}) commands set the titles on the ``x''
- and ``y'' axes, respectively. These titles appear next to the
- tick marks on the left and bottom edges of the graph, respectively.
- Calc does not have commands to control the tick marks themselves,
- but you can edit them into the @samp{*Gnuplot Commands*} buffer if
- you wish. See the GNUPLOT documentation for details.
- @kindex g r
- @kindex g R
- @pindex calc-graph-range-x
- @pindex calc-graph-range-y
- The @kbd{g r} (@code{calc-graph-range-x}) and @kbd{g R}
- (@code{calc-graph-range-y}) commands set the range of values on the
- ``x'' and ``y'' axes, respectively. You are prompted to enter a
- suitable range. This should be either a pair of numbers of the
- form, @samp{@var{min}:@var{max}}, or a blank line to revert to the
- default behavior of setting the range based on the range of values
- in the data, or @samp{$} to take the range from the top of the stack.
- Ranges on the stack can be represented as either interval forms or
- vectors: @samp{[@var{min} ..@: @var{max}]} or @samp{[@var{min}, @var{max}]}.
- @kindex g l
- @kindex g L
- @pindex calc-graph-log-x
- @pindex calc-graph-log-y
- The @kbd{g l} (@code{calc-graph-log-x}) and @kbd{g L} (@code{calc-graph-log-y})
- commands allow you to set either or both of the axes of the graph to
- be logarithmic instead of linear.
- @kindex g C-l
- @kindex g C-r
- @kindex g C-t
- @pindex calc-graph-log-z
- @pindex calc-graph-range-z
- @pindex calc-graph-title-z
- For 3D plots, @kbd{g C-t}, @kbd{g C-r}, and @kbd{g C-l} (those are
- letters with the Control key held down) are the corresponding commands
- for the ``z'' axis.
- @kindex g z
- @kindex g Z
- @pindex calc-graph-zero-x
- @pindex calc-graph-zero-y
- The @kbd{g z} (@code{calc-graph-zero-x}) and @kbd{g Z}
- (@code{calc-graph-zero-y}) commands control whether a dotted line is
- drawn to indicate the ``x'' and/or ``y'' zero axes. (These are the same
- dotted lines that would be drawn there anyway if you used @kbd{g g} to
- turn the ``grid'' feature on.) Zero-axis lines are on by default, and
- may be turned off only in GNUPLOT 3.0 and later versions. They are
- not available for 3D plots.
- @kindex g s
- @pindex calc-graph-line-style
- The @kbd{g s} (@code{calc-graph-line-style}) command turns the connecting
- lines on or off for the most recently added curve, and optionally selects
- the style of lines to be used for that curve. Plain @kbd{g s} simply
- toggles the lines on and off. With a numeric prefix argument, @kbd{g s}
- turns lines on and sets a particular line style. Line style numbers
- start at one and their meanings vary depending on the output device.
- GNUPLOT guarantees that there will be at least six different line styles
- available for any device.
- @kindex g S
- @pindex calc-graph-point-style
- The @kbd{g S} (@code{calc-graph-point-style}) command similarly turns
- the symbols at the data points on or off, or sets the point style.
- If you turn both lines and points off, the data points will show as
- tiny dots.
- @cindex @code{LineStyles} variable
- @cindex @code{PointStyles} variable
- @vindex LineStyles
- @vindex PointStyles
- Another way to specify curve styles is with the @code{LineStyles} and
- @code{PointStyles} variables. These variables initially have no stored
- values, but if you store a vector of integers in one of these variables,
- the @kbd{g a} and @kbd{g f} commands will use those style numbers
- instead of the defaults for new curves that are added to the graph.
- An entry should be a positive integer for a specific style, or 0 to let
- the style be chosen automatically, or @i{-1} to turn off lines or points
- altogether. If there are more curves than elements in the vector, the
- last few curves will continue to have the default styles. Of course,
- you can later use @kbd{g s} and @kbd{g S} to change any of these styles.
- For example, @kbd{'[2 -1 3] @key{RET} s t LineStyles} causes the first curve
- to have lines in style number 2, the second curve to have no connecting
- lines, and the third curve to have lines in style 3. Point styles will
- still be assigned automatically, but you could store another vector in
- @code{PointStyles} to define them, too.
- @node Devices, , Graphics Options, Graphics
- @section Graphical Devices
- @noindent
- @kindex g D
- @pindex calc-graph-device
- The @kbd{g D} (@code{calc-graph-device}) command sets the device name
- (or ``terminal name'' in GNUPLOT lingo) to be used by @kbd{g p} commands
- on this graph. It does not affect the permanent default device name.
- If you enter a blank name, the device name reverts to the default.
- Enter @samp{?} to see a list of supported devices.
- With a positive numeric prefix argument, @kbd{g D} instead sets
- the default device name, used by all plots in the future which do
- not override it with a plain @kbd{g D} command. If you enter a
- blank line this command shows you the current default. The special
- name @code{default} signifies that Calc should choose @code{x11} if
- the X window system is in use (as indicated by the presence of a
- @code{DISPLAY} environment variable), or otherwise @code{dumb} under
- GNUPLOT 3.0 and later, or @code{postscript} under GNUPLOT 2.0.
- This is the initial default value.
- The @code{dumb} device is an interface to ``dumb terminals,'' i.e.,
- terminals with no special graphics facilities. It writes a crude
- picture of the graph composed of characters like @code{-} and @code{|}
- to a buffer called @samp{*Gnuplot Trail*}, which Calc then displays.
- The graph is made the same size as the Emacs screen, which on most
- dumb terminals will be @c{$80\times24$}
- @asis{80x24} characters. The graph is displayed in
- an Emacs ``recursive edit''; type @kbd{q} or @kbd{M-# M-#} to exit
- the recursive edit and return to Calc. Note that the @code{dumb}
- device is present only in GNUPLOT 3.0 and later versions.
- The word @code{dumb} may be followed by two numbers separated by
- spaces. These are the desired width and height of the graph in
- characters. Also, the device name @code{big} is like @code{dumb}
- but creates a graph four times the width and height of the Emacs
- screen. You will then have to scroll around to view the entire
- graph. In the @samp{*Gnuplot Trail*} buffer, @key{SPC}, @key{DEL},
- @kbd{<}, and @kbd{>} are defined to scroll by one screenful in each
- of the four directions.
- With a negative numeric prefix argument, @kbd{g D} sets or displays
- the device name used by @kbd{g P} (@code{calc-graph-print}). This
- is initially @code{postscript}. If you don't have a PostScript
- printer, you may decide once again to use @code{dumb} to create a
- plot on any text-only printer.
- @kindex g O
- @pindex calc-graph-output
- The @kbd{g O} (@code{calc-graph-output}) command sets the name of
- the output file used by GNUPLOT. For some devices, notably @code{x11},
- there is no output file and this information is not used. Many other
- ``devices'' are really file formats like @code{postscript}; in these
- cases the output in the desired format goes into the file you name
- with @kbd{g O}. Type @kbd{g O stdout @key{RET}} to set GNUPLOT to write
- to its standard output stream, i.e., to @samp{*Gnuplot Trail*}.
- This is the default setting.
- Another special output name is @code{tty}, which means that GNUPLOT
- is going to write graphics commands directly to its standard output,
- which you wish Emacs to pass through to your terminal. Tektronix
- graphics terminals, among other devices, operate this way. Calc does
- this by telling GNUPLOT to write to a temporary file, then running a
- sub-shell executing the command @samp{cat tempfile >/dev/tty}. On
- typical Unix systems, this will copy the temporary file directly to
- the terminal, bypassing Emacs entirely. You will have to type @kbd{C-l}
- to Emacs afterwards to refresh the screen.
- Once again, @kbd{g O} with a positive or negative prefix argument
- sets the default or printer output file names, respectively. In each
- case you can specify @code{auto}, which causes Calc to invent a temporary
- file name for each @kbd{g p} (or @kbd{g P}) command. This temporary file
- will be deleted once it has been displayed or printed. If the output file
- name is not @code{auto}, the file is not automatically deleted.
- The default and printer devices and output files can be saved
- permanently by the @kbd{m m} (@code{calc-save-modes}) command. The
- default number of data points (see @kbd{g N}) and the X geometry
- (see @kbd{g X}) are also saved. Other graph information is @emph{not}
- saved; you can save a graph's configuration simply by saving the contents
- of the @samp{*Gnuplot Commands*} buffer.
- @vindex calc-gnuplot-plot-command
- @vindex calc-gnuplot-default-device
- @vindex calc-gnuplot-default-output
- @vindex calc-gnuplot-print-command
- @vindex calc-gnuplot-print-device
- @vindex calc-gnuplot-print-output
- If you are installing Calc you may wish to configure the default and
- printer devices and output files for the whole system. The relevant
- Lisp variables are @code{calc-gnuplot-default-device} and @code{-output},
- and @code{calc-gnuplot-print-device} and @code{-output}. The output
- file names must be either strings as described above, or Lisp
- expressions which are evaluated on the fly to get the output file names.
- Other important Lisp variables are @code{calc-gnuplot-plot-command} and
- @code{calc-gnuplot-print-command}, which give the system commands to
- display or print the output of GNUPLOT, respectively. These may be
- @code{nil} if no command is necessary, or strings which can include
- @samp{%s} to signify the name of the file to be displayed or printed.
- Or, these variables may contain Lisp expressions which are evaluated
- to display or print the output.
- @kindex g x
- @pindex calc-graph-display
- The @kbd{g x} (@code{calc-graph-display}) command lets you specify
- on which X window system display your graphs should be drawn. Enter
- a blank line to see the current display name. This command has no
- effect unless the current device is @code{x11}.
- @kindex g X
- @pindex calc-graph-geometry
- The @kbd{g X} (@code{calc-graph-geometry}) command is a similar
- command for specifying the position and size of the X window.
- The normal value is @code{default}, which generally means your
- window manager will let you place the window interactively.
- Entering @samp{800x500+0+0} would create an 800-by-500 pixel
- window in the upper-left corner of the screen.
- The buffer called @samp{*Gnuplot Trail*} holds a transcript of the
- session with GNUPLOT. This shows the commands Calc has ``typed'' to
- GNUPLOT and the responses it has received. Calc tries to notice when an
- error message has appeared here and display the buffer for you when
- this happens. You can check this buffer yourself if you suspect
- something has gone wrong.
- @kindex g C
- @pindex calc-graph-command
- The @kbd{g C} (@code{calc-graph-command}) command prompts you to
- enter any line of text, then simply sends that line to the current
- GNUPLOT process. The @samp{*Gnuplot Trail*} buffer looks deceptively
- like a Shell buffer but you can't type commands in it yourself.
- Instead, you must use @kbd{g C} for this purpose.
- @kindex g v
- @kindex g V
- @pindex calc-graph-view-commands
- @pindex calc-graph-view-trail
- The @kbd{g v} (@code{calc-graph-view-commands}) and @kbd{g V}
- (@code{calc-graph-view-trail}) commands display the @samp{*Gnuplot Commands*}
- and @samp{*Gnuplot Trail*} buffers, respectively, in another window.
- This happens automatically when Calc thinks there is something you
- will want to see in either of these buffers. If you type @kbd{g v}
- or @kbd{g V} when the relevant buffer is already displayed, the
- buffer is hidden again.
- One reason to use @kbd{g v} is to add your own commands to the
- @samp{*Gnuplot Commands*} buffer. Press @kbd{g v}, then use
- @kbd{C-x o} to switch into that window. For example, GNUPLOT has
- @samp{set label} and @samp{set arrow} commands that allow you to
- annotate your plots. Since Calc doesn't understand these commands,
- you have to add them to the @samp{*Gnuplot Commands*} buffer
- yourself, then use @w{@kbd{g p}} to replot using these new commands. Note
- that your commands must appear @emph{before} the @code{plot} command.
- To get help on any GNUPLOT feature, type, e.g., @kbd{g C help set label}.
- You may have to type @kbd{g C @key{RET}} a few times to clear the
- ``press return for more'' or ``subtopic of @dots{}'' requests.
- Note that Calc always sends commands (like @samp{set nolabel}) to
- reset all plotting parameters to the defaults before each plot, so
- to delete a label all you need to do is delete the @samp{set label}
- line you added (or comment it out with @samp{#}) and then replot
- with @kbd{g p}.
- @kindex g q
- @pindex calc-graph-quit
- You can use @kbd{g q} (@code{calc-graph-quit}) to kill the GNUPLOT
- process that is running. The next graphing command you give will
- start a fresh GNUPLOT process. The word @samp{Graph} appears in
- the Calc window's mode line whenever a GNUPLOT process is currently
- running. The GNUPLOT process is automatically killed when you
- exit Emacs if you haven't killed it manually by then.
- @kindex g K
- @pindex calc-graph-kill
- The @kbd{g K} (@code{calc-graph-kill}) command is like @kbd{g q}
- except that it also views the @samp{*Gnuplot Trail*} buffer so that
- you can see the process being killed. This is better if you are
- killing GNUPLOT because you think it has gotten stuck.
- @node Kill and Yank, Keypad Mode, Graphics, Top
- @chapter Kill and Yank Functions
- @noindent
- The commands in this chapter move information between the Calculator and
- other Emacs editing buffers.
- In many cases Embedded Mode is an easier and more natural way to
- work with Calc from a regular editing buffer. @xref{Embedded Mode}.
- @menu
- * Killing From Stack::
- * Yanking Into Stack::
- * Grabbing From Buffers::
- * Yanking Into Buffers::
- * X Cut and Paste::
- @end menu
- @node Killing From Stack, Yanking Into Stack, Kill and Yank, Kill and Yank
- @section Killing from the Stack
- @noindent
- @kindex C-k
- @pindex calc-kill
- @kindex M-k
- @pindex calc-copy-as-kill
- @kindex C-w
- @pindex calc-kill-region
- @kindex M-w
- @pindex calc-copy-region-as-kill
- @cindex Kill ring
- @dfn{Kill} commands are Emacs commands that insert text into the
- ``kill ring,'' from which it can later be ``yanked'' by a @kbd{C-y}
- command. Three common kill commands in normal Emacs are @kbd{C-k}, which
- kills one line, @kbd{C-w}, which kills the region between mark and point,
- and @kbd{M-w}, which puts the region into the kill ring without actually
- deleting it. All of these commands work in the Calculator, too. Also,
- @kbd{M-k} has been provided to complete the set; it puts the current line
- into the kill ring without deleting anything.
- The kill commands are unusual in that they pay attention to the location
- of the cursor in the Calculator buffer. If the cursor is on or below the
- bottom line, the kill commands operate on the top of the stack. Otherwise,
- they operate on whatever stack element the cursor is on. Calc's kill
- commands always operate on whole stack entries. (They act the same as their
- standard Emacs cousins except they ``round up'' the specified region to
- encompass full lines.) The text is copied into the kill ring exactly as
- it appears on the screen, including line numbers if they are enabled.
- A numeric prefix argument to @kbd{C-k} or @kbd{M-k} affects the number
- of lines killed. A positive argument kills the current line and @cite{n-1}
- lines below it. A negative argument kills the @cite{-n} lines above the
- current line. Again this mirrors the behavior of the standard Emacs
- @kbd{C-k} command. Although a whole line is always deleted, @kbd{C-k}
- with no argument copies only the number itself into the kill ring, whereas
- @kbd{C-k} with a prefix argument of 1 copies the number with its trailing
- newline.
- @node Yanking Into Stack, Grabbing From Buffers, Killing From Stack, Kill and Yank
- @section Yanking into the Stack
- @noindent
- @kindex C-y
- @pindex calc-yank
- The @kbd{C-y} command yanks the most recently killed text back into the
- Calculator. It pushes this value onto the top of the stack regardless of
- the cursor position. In general it re-parses the killed text as a number
- or formula (or a list of these separated by commas or newlines). However if
- the thing being yanked is something that was just killed from the Calculator
- itself, its full internal structure is yanked. For example, if you have
- set the floating-point display mode to show only four significant digits,
- then killing and re-yanking 3.14159 (which displays as 3.142) will yank the
- full 3.14159, even though yanking it into any other buffer would yank the
- number in its displayed form, 3.142. (Since the default display modes
- show all objects to their full precision, this feature normally makes no
- difference.)
- @node Grabbing From Buffers, Yanking Into Buffers, Yanking Into Stack, Kill and Yank
- @section Grabbing from Other Buffers
- @noindent
- @kindex M-# g
- @pindex calc-grab-region
- The @kbd{M-# g} (@code{calc-grab-region}) command takes the text between
- point and mark in the current buffer and attempts to parse it as a
- vector of values. Basically, it wraps the text in vector brackets
- @samp{[ ]} unless the text already is enclosed in vector brackets,
- then reads the text as if it were an algebraic entry. The contents
- of the vector may be numbers, formulas, or any other Calc objects.
- If the @kbd{M-# g} command works successfully, it does an automatic
- @kbd{M-# c} to enter the Calculator buffer.
- A numeric prefix argument grabs the specified number of lines around
- point, ignoring the mark. A positive prefix grabs from point to the
- @cite{n}th following newline (so that @kbd{M-1 M-# g} grabs from point
- to the end of the current line); a negative prefix grabs from point
- back to the @cite{n+1}st preceding newline. In these cases the text
- that is grabbed is exactly the same as the text that @kbd{C-k} would
- delete given that prefix argument.
- A prefix of zero grabs the current line; point may be anywhere on the
- line.
- A plain @kbd{C-u} prefix interprets the region between point and mark
- as a single number or formula rather than a vector. For example,
- @kbd{M-# g} on the text @samp{2 a b} produces the vector of three
- values @samp{[2, a, b]}, but @kbd{C-u M-# g} on the same region
- reads a formula which is a product of three things: @samp{2 a b}.
- (The text @samp{a + b}, on the other hand, will be grabbed as a
- vector of one element by plain @kbd{M-# g} because the interpretation
- @samp{[a, +, b]} would be a syntax error.)
- If a different language has been specified (@pxref{Language Modes}),
- the grabbed text will be interpreted according to that language.
- @kindex M-# r
- @pindex calc-grab-rectangle
- The @kbd{M-# r} (@code{calc-grab-rectangle}) command takes the text between
- point and mark and attempts to parse it as a matrix. If point and mark
- are both in the leftmost column, the lines in between are parsed in their
- entirety. Otherwise, point and mark define the corners of a rectangle
- whose contents are parsed.
- Each line of the grabbed area becomes a row of the matrix. The result
- will actually be a vector of vectors, which Calc will treat as a matrix
- only if every row contains the same number of values.
- If a line contains a portion surrounded by square brackets (or curly
- braces), that portion is interpreted as a vector which becomes a row
- of the matrix. Any text surrounding the bracketed portion on the line
- is ignored.
- Otherwise, the entire line is interpreted as a row vector as if it
- were surrounded by square brackets. Leading line numbers (in the
- format used in the Calc stack buffer) are ignored. If you wish to
- force this interpretation (even if the line contains bracketed
- portions), give a negative numeric prefix argument to the
- @kbd{M-# r} command.
- If you give a numeric prefix argument of zero or plain @kbd{C-u}, each
- line is instead interpreted as a single formula which is converted into
- a one-element vector. Thus the result of @kbd{C-u M-# r} will be a
- one-column matrix. For example, suppose one line of the data is the
- expression @samp{2 a}. A plain @w{@kbd{M-# r}} will interpret this as
- @samp{[2 a]}, which in turn is read as a two-element vector that forms
- one row of the matrix. But a @kbd{C-u M-# r} will interpret this row
- as @samp{[2*a]}.
- If you give a positive numeric prefix argument @var{n}, then each line
- will be split up into columns of width @var{n}; each column is parsed
- separately as a matrix element. If a line contained
- @w{@samp{2 +/- 3 4 +/- 5}}, then grabbing with a prefix argument of 8
- would correctly split the line into two error forms.@refill
- @xref{Matrix Functions}, to see how to pull the matrix apart into its
- constituent rows and columns. (If it is a @c{$1\times1$}
- @asis{1x1} matrix, just hit @kbd{v u}
- (@code{calc-unpack}) twice.)
- @kindex M-# :
- @kindex M-# _
- @pindex calc-grab-sum-across
- @pindex calc-grab-sum-down
- @cindex Summing rows and columns of data
- The @kbd{M-# :} (@code{calc-grab-sum-down}) command is a handy way to
- grab a rectangle of data and sum its columns. It is equivalent to
- typing @kbd{M-# r}, followed by @kbd{V R : +} (the vector reduction
- command that sums the columns of a matrix; @pxref{Reducing}). The
- result of the command will be a vector of numbers, one for each column
- in the input data. The @kbd{M-# _} (@code{calc-grab-sum-across}) command
- similarly grabs a rectangle and sums its rows by executing @w{@kbd{V R _ +}}.
- As well as being more convenient, @kbd{M-# :} and @kbd{M-# _} are also
- much faster because they don't actually place the grabbed vector on
- the stack. In a @kbd{M-# r V R : +} sequence, formatting the vector
- for display on the stack takes a large fraction of the total time
- (unless you have planned ahead and used @kbd{v .} and @kbd{t .} modes).
- For example, suppose we have a column of numbers in a file which we
- wish to sum. Go to one corner of the column and press @kbd{C-@@} to
- set the mark; go to the other corner and type @kbd{M-# :}. Since there
- is only one column, the result will be a vector of one number, the sum.
- (You can type @kbd{v u} to unpack this vector into a plain number if
- you want to do further arithmetic with it.)
- To compute the product of the column of numbers, we would have to do
- it ``by hand'' since there's no special grab-and-multiply command.
- Use @kbd{M-# r} to grab the column of numbers into the calculator in
- the form of a column matrix. The statistics command @kbd{u *} is a
- handy way to find the product of a vector or matrix of numbers.
- @xref{Statistical Operations}. Another approach would be to use
- an explicit column reduction command, @kbd{V R : *}.
- @node Yanking Into Buffers, X Cut and Paste, Grabbing From Buffers, Kill and Yank
- @section Yanking into Other Buffers
- @noindent
- @kindex y
- @pindex calc-copy-to-buffer
- The plain @kbd{y} (@code{calc-copy-to-buffer}) command inserts the number
- at the top of the stack into the most recently used normal editing buffer.
- (More specifically, this is the most recently used buffer which is displayed
- in a window and whose name does not begin with @samp{*}. If there is no
- such buffer, this is the most recently used buffer except for Calculator
- and Calc Trail buffers.) The number is inserted exactly as it appears and
- without a newline. (If line-numbering is enabled, the line number is
- normally not included.) The number is @emph{not} removed from the stack.
- With a prefix argument, @kbd{y} inserts several numbers, one per line.
- A positive argument inserts the specified number of values from the top
- of the stack. A negative argument inserts the @cite{n}th value from the
- top of the stack. An argument of zero inserts the entire stack. Note
- that @kbd{y} with an argument of 1 is slightly different from @kbd{y}
- with no argument; the former always copies full lines, whereas the
- latter strips off the trailing newline.
- With a lone @kbd{C-u} as a prefix argument, @kbd{y} @emph{replaces} the
- region in the other buffer with the yanked text, then quits the
- Calculator, leaving you in that buffer. A typical use would be to use
- @kbd{M-# g} to read a region of data into the Calculator, operate on the
- data to produce a new matrix, then type @kbd{C-u y} to replace the
- original data with the new data. One might wish to alter the matrix
- display style (@pxref{Vector and Matrix Formats}) or change the current
- display language (@pxref{Language Modes}) before doing this. Also, note
- that this command replaces a linear region of text (as grabbed by
- @kbd{M-# g}), not a rectangle (as grabbed by @kbd{M-# r}).@refill
- If the editing buffer is in overwrite (as opposed to insert) mode,
- and the @kbd{C-u} prefix was not used, then the yanked number will
- overwrite the characters following point rather than being inserted
- before those characters. The usual conventions of overwrite mode
- are observed; for example, characters will be inserted at the end of
- a line rather than overflowing onto the next line. Yanking a multi-line
- object such as a matrix in overwrite mode overwrites the next @var{n}
- lines in the buffer, lengthening or shortening each line as necessary.
- Finally, if the thing being yanked is a simple integer or floating-point
- number (like @samp{-1.2345e-3}) and the characters following point also
- make up such a number, then Calc will replace that number with the new
- number, lengthening or shortening as necessary. The concept of
- ``overwrite mode'' has thus been generalized from overwriting characters
- to overwriting one complete number with another.
- @kindex M-# y
- The @kbd{M-# y} key sequence is equivalent to @kbd{y} except that
- it can be typed anywhere, not just in Calc. This provides an easy
- way to guarantee that Calc knows which editing buffer you want to use!
- @node X Cut and Paste, , Yanking Into Buffers, Kill and Yank
- @section X Cut and Paste
- @noindent
- If you are using Emacs with the X window system, there is an easier
- way to move small amounts of data into and out of the calculator:
- Use the mouse-oriented cut and paste facilities of X.
- The default bindings for a three-button mouse cause the left button
- to move the Emacs cursor to the given place, the right button to
- select the text between the cursor and the clicked location, and
- the middle button to yank the selection into the buffer at the
- clicked location. So, if you have a Calc window and an editing
- window on your Emacs screen, you can use left-click/right-click
- to select a number, vector, or formula from one window, then
- middle-click to paste that value into the other window. When you
- paste text into the Calc window, Calc interprets it as an algebraic
- entry. It doesn't matter where you click in the Calc window; the
- new value is always pushed onto the top of the stack.
- The @code{xterm} program that is typically used for general-purpose
- shell windows in X interprets the mouse buttons in the same way.
- So you can use the mouse to move data between Calc and any other
- Unix program. One nice feature of @code{xterm} is that a double
- left-click selects one word, and a triple left-click selects a
- whole line. So you can usually transfer a single number into Calc
- just by double-clicking on it in the shell, then middle-clicking
- in the Calc window.
- @node Keypad Mode, Embedded Mode, Kill and Yank, Introduction
- @chapter ``Keypad'' Mode
- @noindent
- @kindex M-# k
- @pindex calc-keypad
- The @kbd{M-# k} (@code{calc-keypad}) command starts the Calculator
- and displays a picture of a calculator-style keypad. If you are using
- the X window system, you can click on any of the ``keys'' in the
- keypad using the left mouse button to operate the calculator.
- The original window remains the selected window; in keypad mode
- you can type in your file while simultaneously performing
- calculations with the mouse.
- @pindex full-calc-keypad
- If you have used @kbd{M-# b} first, @kbd{M-# k} instead invokes
- the @code{full-calc-keypad} command, which takes over the whole
- Emacs screen and displays the keypad, the Calc stack, and the Calc
- trail all at once. This mode would normally be used when running
- Calc standalone (@pxref{Standalone Operation}).
- If you aren't using the X window system, you must switch into
- the @samp{*Calc Keypad*} window, place the cursor on the desired
- ``key,'' and type @key{SPC} or @key{RET}. If you think this
- is easier than using Calc normally, go right ahead.
- Calc commands are more or less the same in keypad mode. Certain
- keypad keys differ slightly from the corresponding normal Calc
- keystrokes; all such deviations are described below.
- Keypad Mode includes many more commands than will fit on the keypad
- at once. Click the right mouse button [@code{calc-keypad-menu}]
- to switch to the next menu. The bottom five rows of the keypad
- stay the same; the top three rows change to a new set of commands.
- To return to earlier menus, click the middle mouse button
- [@code{calc-keypad-menu-back}] or simply advance through the menus
- until you wrap around. Typing @key{TAB} inside the keypad window
- is equivalent to clicking the right mouse button there.
- You can always click the @key{EXEC} button and type any normal
- Calc key sequence. This is equivalent to switching into the
- Calc buffer, typing the keys, then switching back to your
- original buffer.
- @menu
- * Keypad Main Menu::
- * Keypad Functions Menu::
- * Keypad Binary Menu::
- * Keypad Vectors Menu::
- * Keypad Modes Menu::
- @end menu
- @node Keypad Main Menu, Keypad Functions Menu, Keypad Mode, Keypad Mode
- @section Main Menu
- @smallexample
- @group
- |----+-----Calc 2.00-----+----1
- |FLR |CEIL|RND |TRNC|CLN2|FLT |
- |----+----+----+----+----+----|
- | LN |EXP | |ABS |IDIV|MOD |
- |----+----+----+----+----+----|
- |SIN |COS |TAN |SQRT|y^x |1/x |
- |----+----+----+----+----+----|
- | ENTER |+/- |EEX |UNDO| <- |
- |-----+---+-+--+--+-+---++----|
- | INV | 7 | 8 | 9 | / |
- |-----+-----+-----+-----+-----|
- | HYP | 4 | 5 | 6 | * |
- |-----+-----+-----+-----+-----|
- |EXEC | 1 | 2 | 3 | - |
- |-----+-----+-----+-----+-----|
- | OFF | 0 | . | PI | + |
- |-----+-----+-----+-----+-----+
- @end group
- @end smallexample
- @noindent
- This is the menu that appears the first time you start Keypad Mode.
- It will show up in a vertical window on the right side of your screen.
- Above this menu is the traditional Calc stack display. On a 24-line
- screen you will be able to see the top three stack entries.
- The ten digit keys, decimal point, and @key{EEX} key are used for
- entering numbers in the obvious way. @key{EEX} begins entry of an
- exponent in scientific notation. Just as with regular Calc, the
- number is pushed onto the stack as soon as you press @key{ENTER}
- or any other function key.
- The @key{+/-} key corresponds to normal Calc's @kbd{n} key. During
- numeric entry it changes the sign of the number or of the exponent.
- At other times it changes the sign of the number on the top of the
- stack.
- The @key{INV} and @key{HYP} keys modify other keys. As well as
- having the effects described elsewhere in this manual, Keypad Mode
- defines several other ``inverse'' operations. These are described
- below and in the following sections.
- The @key{ENTER} key finishes the current numeric entry, or otherwise
- duplicates the top entry on the stack.
- The @key{UNDO} key undoes the most recent Calc operation.
- @kbd{INV UNDO} is the ``redo'' command, and @kbd{HYP UNDO} is
- ``last arguments'' (@kbd{M-@key{RET}}).
- The @key{<-} key acts as a ``backspace'' during numeric entry.
- At other times it removes the top stack entry. @kbd{INV <-}
- clears the entire stack. @kbd{HYP <-} takes an integer from
- the stack, then removes that many additional stack elements.
- The @key{EXEC} key prompts you to enter any keystroke sequence
- that would normally work in Calc mode. This can include a
- numeric prefix if you wish. It is also possible simply to
- switch into the Calc window and type commands in it; there is
- nothing ``magic'' about this window when Keypad Mode is active.
- The other keys in this display perform their obvious calculator
- functions. @key{CLN2} rounds the top-of-stack by temporarily
- reducing the precision by 2 digits. @key{FLT} converts an
- integer or fraction on the top of the stack to floating-point.
- The @key{INV} and @key{HYP} keys combined with several of these keys
- give you access to some common functions even if the appropriate menu
- is not displayed. Obviously you don't need to learn these keys
- unless you find yourself wasting time switching among the menus.
- @table @kbd
- @item INV +/-
- is the same as @key{1/x}.
- @item INV +
- is the same as @key{SQRT}.
- @item INV -
- is the same as @key{CONJ}.
- @item INV *
- is the same as @key{y^x}.
- @item INV /
- is the same as @key{INV y^x} (the @cite{x}th root of @cite{y}).
- @item HYP/INV 1
- are the same as @key{SIN} / @kbd{INV SIN}.
- @item HYP/INV 2
- are the same as @key{COS} / @kbd{INV COS}.
- @item HYP/INV 3
- are the same as @key{TAN} / @kbd{INV TAN}.
- @item INV/HYP 4
- are the same as @key{LN} / @kbd{HYP LN}.
- @item INV/HYP 5
- are the same as @key{EXP} / @kbd{HYP EXP}.
- @item INV 6
- is the same as @key{ABS}.
- @item INV 7
- is the same as @key{RND} (@code{calc-round}).
- @item INV 8
- is the same as @key{CLN2}.
- @item INV 9
- is the same as @key{FLT} (@code{calc-float}).
- @item INV 0
- is the same as @key{IMAG}.
- @item INV .
- is the same as @key{PREC}.
- @item INV ENTER
- is the same as @key{SWAP}.
- @item HYP ENTER
- is the same as @key{RLL3}.
- @item INV HYP ENTER
- is the same as @key{OVER}.
- @item HYP +/-
- packs the top two stack entries as an error form.
- @item HYP EEX
- packs the top two stack entries as a modulo form.
- @item INV EEX
- creates an interval form; this removes an integer which is one
- of 0 @samp{[]}, 1 @samp{[)}, 2 @samp{(]} or 3 @samp{()}, followed
- by the two limits of the interval.
- @end table
- The @kbd{OFF} key turns Calc off; typing @kbd{M-# k} or @kbd{M-# M-#}
- again has the same effect. This is analogous to typing @kbd{q} or
- hitting @kbd{M-# c} again in the normal calculator. If Calc is
- running standalone (the @code{full-calc-keypad} command appeared in the
- command line that started Emacs), then @kbd{OFF} is replaced with
- @kbd{EXIT}; clicking on this actually exits Emacs itself.
- @node Keypad Functions Menu, Keypad Binary Menu, Keypad Main Menu, Keypad Mode
- @section Functions Menu
- @smallexample
- @group
- |----+----+----+----+----+----2
- |IGAM|BETA|IBET|ERF |BESJ|BESY|
- |----+----+----+----+----+----|
- |IMAG|CONJ| RE |ATN2|RAND|RAGN|
- |----+----+----+----+----+----|
- |GCD |FACT|DFCT|BNOM|PERM|NXTP|
- |----+----+----+----+----+----|
- @end group
- @end smallexample
- @noindent
- This menu provides various operations from the @kbd{f} and @kbd{k}
- prefix keys.
- @key{IMAG} multiplies the number on the stack by the imaginary
- number @cite{i = (0, 1)}.
- @key{RE} extracts the real part a complex number. @kbd{INV RE}
- extracts the imaginary part.
- @key{RAND} takes a number from the top of the stack and computes
- a random number greater than or equal to zero but less than that
- number. (@xref{Random Numbers}.) @key{RAGN} is the ``random
- again'' command; it computes another random number using the
- same limit as last time.
- @key{INV GCD} computes the LCM (least common multiple) function.
- @key{INV FACT} is the gamma function. @c{$\Gamma(x) = (x-1)!$}
- @cite{gamma(x) = (x-1)!}.
- @key{PERM} is the number-of-permutations function, which is on the
- @kbd{H k c} key in normal Calc.
- @key{NXTP} finds the next prime after a number. @kbd{INV NXTP}
- finds the previous prime.
- @node Keypad Binary Menu, Keypad Vectors Menu, Keypad Functions Menu, Keypad Mode
- @section Binary Menu
- @smallexample
- @group
- |----+----+----+----+----+----3
- |AND | OR |XOR |NOT |LSH |RSH |
- |----+----+----+----+----+----|
- |DEC |HEX |OCT |BIN |WSIZ|ARSH|
- |----+----+----+----+----+----|
- | A | B | C | D | E | F |
- |----+----+----+----+----+----|
- @end group
- @end smallexample
- @noindent
- The keys in this menu perform operations on binary integers.
- Note that both logical and arithmetic right-shifts are provided.
- @key{INV LSH} rotates one bit to the left.
- The ``difference'' function (normally on @kbd{b d}) is on @key{INV AND}.
- The ``clip'' function (normally on @w{@kbd{b c}}) is on @key{INV NOT}.
- The @key{DEC}, @key{HEX}, @key{OCT}, and @key{BIN} keys select the
- current radix for display and entry of numbers: Decimal, hexadecimal,
- octal, or binary. The six letter keys @key{A} through @key{F} are used
- for entering hexadecimal numbers.
- The @key{WSIZ} key displays the current word size for binary operations
- and allows you to enter a new word size. You can respond to the prompt
- using either the keyboard or the digits and @key{ENTER} from the keypad.
- The initial word size is 32 bits.
- @node Keypad Vectors Menu, Keypad Modes Menu, Keypad Binary Menu, Keypad Mode
- @section Vectors Menu
- @smallexample
- @group
- |----+----+----+----+----+----4
- |SUM |PROD|MAX |MAP*|MAP^|MAP$|
- |----+----+----+----+----+----|
- |MINV|MDET|MTRN|IDNT|CRSS|"x" |
- |----+----+----+----+----+----|
- |PACK|UNPK|INDX|BLD |LEN |... |
- |----+----+----+----+----+----|
- @end group
- @end smallexample
- @noindent
- The keys in this menu operate on vectors and matrices.
- @key{PACK} removes an integer @var{n} from the top of the stack;
- the next @var{n} stack elements are removed and packed into a vector,
- which is replaced onto the stack. Thus the sequence
- @kbd{1 ENTER 3 ENTER 5 ENTER 3 PACK} enters the vector
- @samp{[1, 3, 5]} onto the stack. To enter a matrix, build each row
- on the stack as a vector, then use a final @key{PACK} to collect the
- rows into a matrix.
- @key{UNPK} unpacks the vector on the stack, pushing each of its
- components separately.
- @key{INDX} removes an integer @var{n}, then builds a vector of
- integers from 1 to @var{n}. @kbd{INV INDX} takes three numbers
- from the stack: The vector size @var{n}, the starting number,
- and the increment. @kbd{BLD} takes an integer @var{n} and any
- value @var{x} and builds a vector of @var{n} copies of @var{x}.
- @key{IDNT} removes an integer @var{n}, then builds an @var{n}-by-@var{n}
- identity matrix.
- @key{LEN} replaces a vector by its length, an integer.
- @key{...} turns on or off ``abbreviated'' display mode for large vectors.
- @key{MINV}, @key{MDET}, @key{MTRN}, and @key{CROSS} are the matrix
- inverse, determinant, and transpose, and vector cross product.
- @key{SUM} replaces a vector by the sum of its elements. It is
- equivalent to @kbd{u +} in normal Calc (@pxref{Statistical Operations}).
- @key{PROD} computes the product of the elements of a vector, and
- @key{MAX} computes the maximum of all the elements of a vector.
- @key{INV SUM} computes the alternating sum of the first element
- minus the second, plus the third, minus the fourth, and so on.
- @key{INV MAX} computes the minimum of the vector elements.
- @key{HYP SUM} computes the mean of the vector elements.
- @key{HYP PROD} computes the sample standard deviation.
- @key{HYP MAX} computes the median.
- @key{MAP*} multiplies two vectors elementwise. It is equivalent
- to the @kbd{V M *} command. @key{MAP^} computes powers elementwise.
- The arguments must be vectors of equal length, or one must be a vector
- and the other must be a plain number. For example, @kbd{2 MAP^} squares
- all the elements of a vector.
- @key{MAP$} maps the formula on the top of the stack across the
- vector in the second-to-top position. If the formula contains
- several variables, Calc takes that many vectors starting at the
- second-to-top position and matches them to the variables in
- alphabetical order. The result is a vector of the same size as
- the input vectors, whose elements are the formula evaluated with
- the variables set to the various sets of numbers in those vectors.
- For example, you could simulate @key{MAP^} using @key{MAP$} with
- the formula @samp{x^y}.
- The @kbd{"x"} key pushes the variable name @cite{x} onto the
- stack. To build the formula @cite{x^2 + 6}, you would use the
- key sequence @kbd{"x" 2 y^x 6 +}. This formula would then be
- suitable for use with the @key{MAP$} key described above.
- With @key{INV}, @key{HYP}, or @key{INV} and @key{HYP}, the
- @kbd{"x"} key pushes the variable names @cite{y}, @cite{z}, and
- @cite{t}, respectively.
- @node Keypad Modes Menu, , Keypad Vectors Menu, Keypad Mode
- @section Modes Menu
- @smallexample
- @group
- |----+----+----+----+----+----5
- |FLT |FIX |SCI |ENG |GRP | |
- |----+----+----+----+----+----|
- |RAD |DEG |FRAC|POLR|SYMB|PREC|
- |----+----+----+----+----+----|
- |SWAP|RLL3|RLL4|OVER|STO |RCL |
- |----+----+----+----+----+----|
- @end group
- @end smallexample
- @noindent
- The keys in this menu manipulate modes, variables, and the stack.
- The @key{FLT}, @key{FIX}, @key{SCI}, and @key{ENG} keys select
- floating-point, fixed-point, scientific, or engineering notation.
- @key{FIX} displays two digits after the decimal by default; the
- others display full precision. With the @key{INV} prefix, these
- keys pop a number-of-digits argument from the stack.
- The @key{GRP} key turns grouping of digits with commas on or off.
- @kbd{INV GRP} enables grouping to the right of the decimal point as
- well as to the left.
- The @key{RAD} and @key{DEG} keys switch between radians and degrees
- for trigonometric functions.
- The @key{FRAC} key turns Fraction mode on or off. This affects
- whether commands like @kbd{/} with integer arguments produce
- fractional or floating-point results.
- The @key{POLR} key turns Polar mode on or off, determining whether
- polar or rectangular complex numbers are used by default.
- The @key{SYMB} key turns Symbolic mode on or off, in which
- operations that would produce inexact floating-point results
- are left unevaluated as algebraic formulas.
- The @key{PREC} key selects the current precision. Answer with
- the keyboard or with the keypad digit and @key{ENTER} keys.
- The @key{SWAP} key exchanges the top two stack elements.
- The @key{RLL3} key rotates the top three stack elements upwards.
- The @key{RLL4} key rotates the top four stack elements upwards.
- The @key{OVER} key duplicates the second-to-top stack element.
- The @key{STO} and @key{RCL} keys are analogous to @kbd{s t} and
- @kbd{s r} in regular Calc. @xref{Store and Recall}. Click the
- @key{STO} or @key{RCL} key, then one of the ten digits. (Named
- variables are not available in Keypad Mode.) You can also use,
- for example, @kbd{STO + 3} to add to register 3.
- @node Embedded Mode, Programming, Keypad Mode, Top
- @chapter Embedded Mode
- @noindent
- Embedded Mode in Calc provides an alternative to copying numbers
- and formulas back and forth between editing buffers and the Calc
- stack. In Embedded Mode, your editing buffer becomes temporarily
- linked to the stack and this copying is taken care of automatically.
- @menu
- * Basic Embedded Mode::
- * More About Embedded Mode::
- * Assignments in Embedded Mode::
- * Mode Settings in Embedded Mode::
- * Customizing Embedded Mode::
- @end menu
- @node Basic Embedded Mode, More About Embedded Mode, Embedded Mode, Embedded Mode
- @section Basic Embedded Mode
- @noindent
- @kindex M-# e
- @pindex calc-embedded
- To enter Embedded mode, position the Emacs point (cursor) on a
- formula in any buffer and press @kbd{M-# e} (@code{calc-embedded}).
- Note that @kbd{M-# e} is not to be used in the Calc stack buffer
- like most Calc commands, but rather in regular editing buffers that
- are visiting your own files.
- Calc normally scans backward and forward in the buffer for the
- nearest opening and closing @dfn{formula delimiters}. The simplest
- delimiters are blank lines. Other delimiters that Embedded Mode
- understands are:
- @enumerate
- @item
- The @TeX{} and La@TeX{} math delimiters @samp{$ $}, @samp{$$ $$},
- @samp{\[ \]}, and @samp{\( \)};
- @item
- Lines beginning with @samp{\begin} and @samp{\end};
- @item
- Lines beginning with @samp{@@} (Texinfo delimiters).
- @item
- Lines beginning with @samp{.EQ} and @samp{.EN} (@dfn{eqn} delimiters);
- @item
- Lines containing a single @samp{%} or @samp{.\"} symbol and nothing else.
- @end enumerate
- @xref{Customizing Embedded Mode}, to see how to make Calc recognize
- your own favorite delimiters. Delimiters like @samp{$ $} can appear
- on their own separate lines or in-line with the formula.
- If you give a positive or negative numeric prefix argument, Calc
- instead uses the current point as one end of the formula, and moves
- forward or backward (respectively) by that many lines to find the
- other end. Explicit delimiters are not necessary in this case.
- With a prefix argument of zero, Calc uses the current region
- (delimited by point and mark) instead of formula delimiters.
- @kindex M-# w
- @pindex calc-embedded-word
- With a prefix argument of @kbd{C-u} only, Calc scans for the first
- non-numeric character (i.e., the first character that is not a
- digit, sign, decimal point, or upper- or lower-case @samp{e})
- forward and backward to delimit the formula. @kbd{M-# w}
- (@code{calc-embedded-word}) is equivalent to @kbd{C-u M-# e}.
- When you enable Embedded mode for a formula, Calc reads the text
- between the delimiters and tries to interpret it as a Calc formula.
- It's best if the current Calc language mode is correct for the
- formula, but Calc can generally identify @TeX{} formulas and
- Big-style formulas even if the language mode is wrong. If Calc
- can't make sense of the formula, it beeps and refuses to enter
- Embedded mode. But if the current language is wrong, Calc can
- sometimes parse the formula successfully (but incorrectly);
- for example, the C expression @samp{atan(a[1])} can be parsed
- in Normal language mode, but the @code{atan} won't correspond to
- the built-in @code{arctan} function, and the @samp{a[1]} will be
- interpreted as @samp{a} times the vector @samp{[1]}!
- If you press @kbd{M-# e} or @kbd{M-# w} to activate an embedded
- formula which is blank, say with the cursor on the space between
- the two delimiters @samp{$ $}, Calc will immediately prompt for
- an algebraic entry.
- Only one formula in one buffer can be enabled at a time. If you
- move to another area of the current buffer and give Calc commands,
- Calc turns Embedded mode off for the old formula and then tries
- to restart Embedded mode at the new position. Other buffers are
- not affected by Embedded mode.
- When Embedded mode begins, Calc pushes the current formula onto
- the stack. No Calc stack window is created; however, Calc copies
- the top-of-stack position into the original buffer at all times.
- You can create a Calc window by hand with @kbd{M-# o} if you
- find you need to see the entire stack.
- For example, typing @kbd{M-# e} while somewhere in the formula
- @samp{n>2} in the following line enables Embedded mode on that
- inequality:
- @example
- We define $F_n = F_(n-1)+F_(n-2)$ for all $n>2$.
- @end example
- @noindent
- The formula @cite{n>2} will be pushed onto the Calc stack, and
- the top of stack will be copied back into the editing buffer.
- This means that spaces will appear around the @samp{>} symbol
- to match Calc's usual display style:
- @example
- We define $F_n = F_(n-1)+F_(n-2)$ for all $n > 2$.
- @end example
- @noindent
- No spaces have appeared around the @samp{+} sign because it's
- in a different formula, one which we have not yet touched with
- Embedded mode.
- Now that Embedded mode is enabled, keys you type in this buffer
- are interpreted as Calc commands. At this point we might use
- the ``commute'' command @kbd{j C} to reverse the inequality.
- This is a selection-based command for which we first need to
- move the cursor onto the operator (@samp{>} in this case) that
- needs to be commuted.
- @example
- We define $F_n = F_(n-1)+F_(n-2)$ for all $2 < n$.
- @end example
- The @kbd{M-# o} command is a useful way to open a Calc window
- without actually selecting that window. Giving this command
- verifies that @samp{2 < n} is also on the Calc stack. Typing
- @kbd{17 @key{RET}} would produce:
- @example
- We define $F_n = F_(n-1)+F_(n-2)$ for all $17$.
- @end example
- @noindent
- with @samp{2 < n} and @samp{17} on the stack; typing @key{TAB}
- at this point will exchange the two stack values and restore
- @samp{2 < n} to the embedded formula. Even though you can't
- normally see the stack in Embedded mode, it is still there and
- it still operates in the same way. But, as with old-fashioned
- RPN calculators, you can only see the value at the top of the
- stack at any given time (unless you use @kbd{M-# o}).
- Typing @kbd{M-# e} again turns Embedded mode off. The Calc
- window reveals that the formula @w{@samp{2 < n}} is automatically
- removed from the stack, but the @samp{17} is not. Entering
- Embedded mode always pushes one thing onto the stack, and
- leaving Embedded mode always removes one thing. Anything else
- that happens on the stack is entirely your business as far as
- Embedded mode is concerned.
- If you press @kbd{M-# e} in the wrong place by accident, it is
- possible that Calc will be able to parse the nearby text as a
- formula and will mangle that text in an attempt to redisplay it
- ``properly'' in the current language mode. If this happens,
- press @kbd{M-# e} again to exit Embedded mode, then give the
- regular Emacs ``undo'' command (@kbd{C-_} or @kbd{C-x u}) to put
- the text back the way it was before Calc edited it. Note that Calc's
- own Undo command (typed before you turn Embedded mode back off)
- will not do you any good, because as far as Calc is concerned
- you haven't done anything with this formula yet.
- @node More About Embedded Mode, Assignments in Embedded Mode, Basic Embedded Mode, Embedded Mode
- @section More About Embedded Mode
- @noindent
- When Embedded mode ``activates'' a formula, i.e., when it examines
- the formula for the first time since the buffer was created or
- loaded, Calc tries to sense the language in which the formula was
- written. If the formula contains any @TeX{}-like @samp{\} sequences,
- it is parsed (i.e., read) in @TeX{} mode. If the formula appears to
- be written in multi-line Big mode, it is parsed in Big mode. Otherwise,
- it is parsed according to the current language mode.
- Note that Calc does not change the current language mode according
- to what it finds. Even though it can read a @TeX{} formula when
- not in @TeX{} mode, it will immediately rewrite this formula using
- whatever language mode is in effect. You must then type @kbd{d T}
- to switch Calc permanently into @TeX{} mode if that is what you
- desire.
- @tex
- \bigskip
- @end tex
- @kindex d p
- @pindex calc-show-plain
- Calc's parser is unable to read certain kinds of formulas. For
- example, with @kbd{v ]} (@code{calc-matrix-brackets}) you can
- specify matrix display styles which the parser is unable to
- recognize as matrices. The @kbd{d p} (@code{calc-show-plain})
- command turns on a mode in which a ``plain'' version of a
- formula is placed in front of the fully-formatted version.
- When Calc reads a formula that has such a plain version in
- front, it reads the plain version and ignores the formatted
- version.
- Plain formulas are preceded and followed by @samp{%%%} signs
- by default. This notation has the advantage that the @samp{%}
- character begins a comment in @TeX{}, so if your formula is
- embedded in a @TeX{} document its plain version will be
- invisible in the final printed copy. @xref{Customizing
- Embedded Mode}, to see how to change the ``plain'' formula
- delimiters, say to something that @dfn{eqn} or some other
- formatter will treat as a comment.
- There are several notations which Calc's parser for ``big''
- formatted formulas can't yet recognize. In particular, it can't
- read the large symbols for @code{sum}, @code{prod}, and @code{integ},
- and it can't handle @samp{=>} with the righthand argument omitted.
- Also, Calc won't recognize special formats you have defined with
- the @kbd{Z C} command (@pxref{User-Defined Compositions}). In
- these cases it is important to use ``plain'' mode to make sure
- Calc will be able to read your formula later.
- Another example where ``plain'' mode is important is if you have
- specified a float mode with few digits of precision. Normally
- any digits that are computed but not displayed will simply be
- lost when you save and re-load your embedded buffer, but ``plain''
- mode allows you to make sure that the complete number is present
- in the file as well as the rounded-down number.
- @tex
- \bigskip
- @end tex
- Embedded buffers remember active formulas for as long as they
- exist in Emacs memory. Suppose you have an embedded formula
- which is @c{$\pi$}
- @cite{pi} to the normal 12 decimal places, and then
- type @w{@kbd{C-u 5 d n}} to display only five decimal places.
- If you then type @kbd{d n}, all 12 places reappear because the
- full number is still there on the Calc stack. More surprisingly,
- even if you exit Embedded mode and later re-enter it for that
- formula, typing @kbd{d n} will restore all 12 places because
- each buffer remembers all its active formulas. However, if you
- save the buffer in a file and reload it in a new Emacs session,
- all non-displayed digits will have been lost unless you used
- ``plain'' mode.
- @tex
- \bigskip
- @end tex
- In some applications of Embedded mode, you will want to have a
- sequence of copies of a formula that show its evolution as you
- work on it. For example, you might want to have a sequence
- like this in your file (elaborating here on the example from
- the ``Getting Started'' chapter):
- @smallexample
- The derivative of
- ln(ln(x))
- is
- @r{(the derivative of }ln(ln(x))@r{)}
- whose value at x = 2 is
- @r{(the value)}
- and at x = 3 is
- @r{(the value)}
- @end smallexample
- @kindex M-# d
- @pindex calc-embedded-duplicate
- The @kbd{M-# d} (@code{calc-embedded-duplicate}) command is a
- handy way to make sequences like this. If you type @kbd{M-# d},
- the formula under the cursor (which may or may not have Embedded
- mode enabled for it at the time) is copied immediately below and
- Embedded mode is then enabled for that copy.
- For this example, you would start with just
- @smallexample
- The derivative of
- ln(ln(x))
- @end smallexample
- @noindent
- and press @kbd{M-# d} with the cursor on this formula. The result
- is
- @smallexample
- The derivative of
- ln(ln(x))
- ln(ln(x))
- @end smallexample
- @noindent
- with the second copy of the formula enabled in Embedded mode.
- You can now press @kbd{a d x @key{RET}} to take the derivative, and
- @kbd{M-# d M-# d} to make two more copies of the derivative.
- To complete the computations, type @kbd{3 s l x @key{RET}} to evaluate
- the last formula, then move up to the second-to-last formula
- and type @kbd{2 s l x @key{RET}}.
- Finally, you would want to press @kbd{M-# e} to exit Embedded
- mode, then go up and insert the necessary text in between the
- various formulas and numbers.
- @tex
- \bigskip
- @end tex
- @kindex M-# f
- @kindex M-# '
- @pindex calc-embedded-new-formula
- The @kbd{M-# f} (@code{calc-embedded-new-formula}) command
- creates a new embedded formula at the current point. It inserts
- some default delimiters, which are usually just blank lines,
- and then does an algebraic entry to get the formula (which is
- then enabled for Embedded mode). This is just shorthand for
- typing the delimiters yourself, positioning the cursor between
- the new delimiters, and pressing @kbd{M-# e}. The key sequence
- @kbd{M-# '} is equivalent to @kbd{M-# f}.
- @kindex M-# n
- @kindex M-# p
- @pindex calc-embedded-next
- @pindex calc-embedded-previous
- The @kbd{M-# n} (@code{calc-embedded-next}) and @kbd{M-# p}
- (@code{calc-embedded-previous}) commands move the cursor to the
- next or previous active embedded formula in the buffer. They
- can take positive or negative prefix arguments to move by several
- formulas. Note that these commands do not actually examine the
- text of the buffer looking for formulas; they only see formulas
- which have previously been activated in Embedded mode. In fact,
- @kbd{M-# n} and @kbd{M-# p} are a useful way to tell which
- embedded formulas are currently active. Also, note that these
- commands do not enable Embedded mode on the next or previous
- formula, they just move the cursor. (By the way, @kbd{M-# n} is
- not as awkward to type as it may seem, because @kbd{M-#} ignores
- Shift and Meta on the second keystroke: @kbd{M-# M-N} can be typed
- by holding down Shift and Meta and alternately typing two keys.)
- @kindex M-# `
- @pindex calc-embedded-edit
- The @kbd{M-# `} (@code{calc-embedded-edit}) command edits the
- embedded formula at the current point as if by @kbd{`} (@code{calc-edit}).
- Embedded mode does not have to be enabled for this to work. Press
- @kbd{M-# M-#} to finish the edit, or @kbd{M-# x} to cancel.
- @node Assignments in Embedded Mode, Mode Settings in Embedded Mode, More About Embedded Mode, Embedded Mode
- @section Assignments in Embedded Mode
- @noindent
- The @samp{:=} (assignment) and @samp{=>} (``evaluates-to'') operators
- are especially useful in Embedded mode. They allow you to make
- a definition in one formula, then refer to that definition in
- other formulas embedded in the same buffer.
- An embedded formula which is an assignment to a variable, as in
- @example
- foo := 5
- @end example
- @noindent
- records @cite{5} as the stored value of @code{foo} for the
- purposes of Embedded mode operations in the current buffer. It
- does @emph{not} actually store @cite{5} as the ``global'' value
- of @code{foo}, however. Regular Calc operations, and Embedded
- formulas in other buffers, will not see this assignment.
- One way to use this assigned value is simply to create an
- Embedded formula elsewhere that refers to @code{foo}, and to press
- @kbd{=} in that formula. However, this permanently replaces the
- @code{foo} in the formula with its current value. More interesting
- is to use @samp{=>} elsewhere:
- @example
- foo + 7 => 12
- @end example
- @xref{Evaluates-To Operator}, for a general discussion of @samp{=>}.
- If you move back and change the assignment to @code{foo}, any
- @samp{=>} formulas which refer to it are automatically updated.
- @example
- foo := 17
- foo + 7 => 24
- @end example
- The obvious question then is, @emph{how} can one easily change the
- assignment to @code{foo}? If you simply select the formula in
- Embedded mode and type 17, the assignment itself will be replaced
- by the 17. The effect on the other formula will be that the
- variable @code{foo} becomes unassigned:
- @example
- 17
- foo + 7 => foo + 7
- @end example
- The right thing to do is first to use a selection command (@kbd{j 2}
- will do the trick) to select the righthand side of the assignment.
- Then, @kbd{17 @key{TAB} @key{DEL}} will swap the 17 into place (@pxref{Selecting
- Subformulas}, to see how this works).
- @kindex M-# j
- @pindex calc-embedded-select
- The @kbd{M-# j} (@code{calc-embedded-select}) command provides an
- easy way to operate on assigments. It is just like @kbd{M-# e},
- except that if the enabled formula is an assignment, it uses
- @kbd{j 2} to select the righthand side. If the enabled formula
- is an evaluates-to, it uses @kbd{j 1} to select the lefthand side.
- A formula can also be a combination of both:
- @example
- bar := foo + 3 => 20
- @end example
- @noindent
- in which case @kbd{M-# j} will select the middle part (@samp{foo + 3}).
- The formula is automatically deselected when you leave Embedded
- mode.
- @kindex M-# u
- @kindex M-# =
- @pindex calc-embedded-update
- Another way to change the assignment to @code{foo} would simply be
- to edit the number using regular Emacs editing rather than Embedded
- mode. Then, we have to find a way to get Embedded mode to notice
- the change. The @kbd{M-# u} or @kbd{M-# =}
- (@code{calc-embedded-update-formula}) command is a convenient way
- to do this.@refill
- @example
- foo := 6
- foo + 7 => 13
- @end example
- Pressing @kbd{M-# u} is much like pressing @kbd{M-# e = M-# e}, that
- is, temporarily enabling Embedded mode for the formula under the
- cursor and then evaluating it with @kbd{=}. But @kbd{M-# u} does
- not actually use @kbd{M-# e}, and in fact another formula somewhere
- else can be enabled in Embedded mode while you use @kbd{M-# u} and
- that formula will not be disturbed.
- With a numeric prefix argument, @kbd{M-# u} updates all active
- @samp{=>} formulas in the buffer. Formulas which have not yet
- been activated in Embedded mode, and formulas which do not have
- @samp{=>} as their top-level operator, are not affected by this.
- (This is useful only if you have used @kbd{m C}; see below.)
- With a plain @kbd{C-u} prefix, @kbd{C-u M-# u} updates only in the
- region between mark and point rather than in the whole buffer.
- @kbd{M-# u} is also a handy way to activate a formula, such as an
- @samp{=>} formula that has freshly been typed in or loaded from a
- file.
- @kindex M-# a
- @pindex calc-embedded-activate
- The @kbd{M-# a} (@code{calc-embedded-activate}) command scans
- through the current buffer and activates all embedded formulas
- that contain @samp{:=} or @samp{=>} symbols. This does not mean
- that Embedded mode is actually turned on, but only that the
- formulas' positions are registered with Embedded mode so that
- the @samp{=>} values can be properly updated as assignments are
- changed.
- It is a good idea to type @kbd{M-# a} right after loading a file
- that uses embedded @samp{=>} operators. Emacs includes a nifty
- ``buffer-local variables'' feature that you can use to do this
- automatically. The idea is to place near the end of your file
- a few lines that look like this:
- @example
- --- Local Variables: ---
- --- eval:(calc-embedded-activate) ---
- --- End: ---
- @end example
- @noindent
- where the leading and trailing @samp{---} can be replaced by
- any suitable strings (which must be the same on all three lines)
- or omitted altogether; in a @TeX{} file, @samp{%} would be a good
- leading string and no trailing string would be necessary. In a
- C program, @samp{/*} and @samp{*/} would be good leading and
- trailing strings.
- When Emacs loads a file into memory, it checks for a Local Variables
- section like this one at the end of the file. If it finds this
- section, it does the specified things (in this case, running
- @kbd{M-# a} automatically) before editing of the file begins.
- The Local Variables section must be within 3000 characters of the
- end of the file for Emacs to find it, and it must be in the last
- page of the file if the file has any page separators.
- @xref{File Variables, , Local Variables in Files, emacs, the
- Emacs manual}.
- Note that @kbd{M-# a} does not update the formulas it finds.
- To do this, type, say, @kbd{M-1 M-# u} after @w{@kbd{M-# a}}.
- Generally this should not be a problem, though, because the
- formulas will have been up-to-date already when the file was
- saved.
- Normally, @kbd{M-# a} activates all the formulas it finds, but
- any previous active formulas remain active as well. With a
- positive numeric prefix argument, @kbd{M-# a} first deactivates
- all current active formulas, then actives the ones it finds in
- its scan of the buffer. With a negative prefix argument,
- @kbd{M-# a} simply deactivates all formulas.
- Embedded mode has two symbols, @samp{Active} and @samp{~Active},
- which it puts next to the major mode name in a buffer's mode line.
- It puts @samp{Active} if it has reason to believe that all
- formulas in the buffer are active, because you have typed @kbd{M-# a}
- and Calc has not since had to deactivate any formulas (which can
- happen if Calc goes to update an @samp{=>} formula somewhere because
- a variable changed, and finds that the formula is no longer there
- due to some kind of editing outside of Embedded mode). Calc puts
- @samp{~Active} in the mode line if some, but probably not all,
- formulas in the buffer are active. This happens if you activate
- a few formulas one at a time but never use @kbd{M-# a}, or if you
- used @kbd{M-# a} but then Calc had to deactivate a formula
- because it lost track of it. If neither of these symbols appears
- in the mode line, no embedded formulas are active in the buffer
- (e.g., before Embedded mode has been used, or after a @kbd{M-- M-# a}).
- Embedded formulas can refer to assignments both before and after them
- in the buffer. If there are several assignments to a variable, the
- nearest preceding assignment is used if there is one, otherwise the
- following assignment is used.
- @example
- x => 1
- x := 1
- x => 1
- x := 2
- x => 2
- @end example
- As well as simple variables, you can also assign to subscript
- expressions of the form @samp{@var{var}_@var{number}} (as in
- @code{x_0}), or @samp{@var{var}_@var{var}} (as in @code{x_max}).
- Assignments to other kinds of objects can be represented by Calc,
- but the automatic linkage between assignments and references works
- only for plain variables and these two kinds of subscript expressions.
- If there are no assignments to a given variable, the global
- stored value for the variable is used (@pxref{Storing Variables}),
- or, if no value is stored, the variable is left in symbolic form.
- Note that global stored values will be lost when the file is saved
- and loaded in a later Emacs session, unless you have used the
- @kbd{s p} (@code{calc-permanent-variable}) command to save them;
- @pxref{Operations on Variables}.
- The @kbd{m C} (@code{calc-auto-recompute}) command turns automatic
- recomputation of @samp{=>} forms on and off. If you turn automatic
- recomputation off, you will have to use @kbd{M-# u} to update these
- formulas manually after an assignment has been changed. If you
- plan to change several assignments at once, it may be more efficient
- to type @kbd{m C}, change all the assignments, then use @kbd{M-1 M-# u}
- to update the entire buffer afterwards. The @kbd{m C} command also
- controls @samp{=>} formulas on the stack; @pxref{Evaluates-To
- Operator}. When you turn automatic recomputation back on, the
- stack will be updated but the Embedded buffer will not; you must
- use @kbd{M-# u} to update the buffer by hand.
- @node Mode Settings in Embedded Mode, Customizing Embedded Mode, Assignments in Embedded Mode, Embedded Mode
- @section Mode Settings in Embedded Mode
- @noindent
- Embedded Mode has a rather complicated mechanism for handling mode
- settings in Embedded formulas. It is possible to put annotations
- in the file that specify mode settings either global to the entire
- file or local to a particular formula or formulas. In the latter
- case, different modes can be specified for use when a formula
- is the enabled Embedded Mode formula.
- When you give any mode-setting command, like @kbd{m f} (for fraction
- mode) or @kbd{d s} (for scientific notation), Embedded Mode adds
- a line like the following one to the file just before the opening
- delimiter of the formula.
- @example
- % [calc-mode: fractions: t]
- % [calc-mode: float-format: (sci 0)]
- @end example
- When Calc interprets an embedded formula, it scans the text before
- the formula for mode-setting annotations like these and sets the
- Calc buffer to match these modes. Modes not explicitly described
- in the file are not changed. Calc scans all the way to the top of
- the file, or up to a line of the form
- @example
- % [calc-defaults]
- @end example
- @noindent
- which you can insert at strategic places in the file if this backward
- scan is getting too slow, or just to provide a barrier between one
- ``zone'' of mode settings and another.
- If the file contains several annotations for the same mode, the
- closest one before the formula is used. Annotations after the
- formula are never used (except for global annotations, described
- below).
- The scan does not look for the leading @samp{% }, only for the
- square brackets and the text they enclose. You can edit the mode
- annotations to a style that works better in context if you wish.
- @xref{Customizing Embedded Mode}, to see how to change the style
- that Calc uses when it generates the annotations. You can write
- mode annotations into the file yourself if you know the syntax;
- the easiest way to find the syntax for a given mode is to let
- Calc write the annotation for it once and see what it does.
- If you give a mode-changing command for a mode that already has
- a suitable annotation just above the current formula, Calc will
- modify that annotation rather than generating a new, conflicting
- one.
- Mode annotations have three parts, separated by colons. (Spaces
- after the colons are optional.) The first identifies the kind
- of mode setting, the second is a name for the mode itself, and
- the third is the value in the form of a Lisp symbol, number,
- or list. Annotations with unrecognizable text in the first or
- second parts are ignored. The third part is not checked to make
- sure the value is of a legal type or range; if you write an
- annotation by hand, be sure to give a proper value or results
- will be unpredictable. Mode-setting annotations are case-sensitive.
- While Embedded Mode is enabled, the word @code{Local} appears in
- the mode line. This is to show that mode setting commands generate
- annotations that are ``local'' to the current formula or set of
- formulas. The @kbd{m R} (@code{calc-mode-record-mode}) command
- causes Calc to generate different kinds of annotations. Pressing
- @kbd{m R} repeatedly cycles through the possible modes.
- @code{LocEdit} and @code{LocPerm} modes generate annotations
- that look like this, respectively:
- @example
- % [calc-edit-mode: float-format: (sci 0)]
- % [calc-perm-mode: float-format: (sci 5)]
- @end example
- The first kind of annotation will be used only while a formula
- is enabled in Embedded Mode. The second kind will be used only
- when the formula is @emph{not} enabled. (Whether the formula
- is ``active'' or not, i.e., whether Calc has seen this formula
- yet, is not relevant here.)
- @code{Global} mode generates an annotation like this at the end
- of the file:
- @example
- % [calc-global-mode: fractions t]
- @end example
- Global mode annotations affect all formulas throughout the file,
- and may appear anywhere in the file. This allows you to tuck your
- mode annotations somewhere out of the way, say, on a new page of
- the file, as long as those mode settings are suitable for all
- formulas in the file.
- Enabling a formula with @kbd{M-# e} causes a fresh scan for local
- mode annotations; you will have to use this after adding annotations
- above a formula by hand to get the formula to notice them. Updating
- a formula with @kbd{M-# u} will also re-scan the local modes, but
- global modes are only re-scanned by @kbd{M-# a}.
- Another way that modes can get out of date is if you add a local
- mode annotation to a formula that has another formula after it.
- In this example, we have used the @kbd{d s} command while the
- first of the two embedded formulas is active. But the second
- formula has not changed its style to match, even though by the
- rules of reading annotations the @samp{(sci 0)} applies to it, too.
- @example
- % [calc-mode: float-format: (sci 0)]
- 1.23e2
- 456.
- @end example
- We would have to go down to the other formula and press @kbd{M-# u}
- on it in order to get it to notice the new annotation.
- Two more mode-recording modes selectable by @kbd{m R} are @code{Save}
- (which works even outside of Embedded Mode), in which mode settings
- are recorded permanently in your Emacs startup file @file{~/.emacs}
- rather than by annotating the current document, and no-recording
- mode (where there is no symbol like @code{Save} or @code{Local} in
- the mode line), in which mode-changing commands do not leave any
- annotations at all.
- When Embedded Mode is not enabled, mode-recording modes except
- for @code{Save} have no effect.
- @node Customizing Embedded Mode, , Mode Settings in Embedded Mode, Embedded Mode
- @section Customizing Embedded Mode
- @noindent
- You can modify Embedded Mode's behavior by setting various Lisp
- variables described here. Use @kbd{M-x set-variable} or
- @kbd{M-x edit-options} to adjust a variable on the fly, or
- put a suitable @code{setq} statement in your @file{~/.emacs}
- file to set a variable permanently. (Another possibility would
- be to use a file-local variable annotation at the end of the
- file; @pxref{File Variables, , Local Variables in Files, emacs, the
- Emacs manual}.)
- While none of these variables will be buffer-local by default, you
- can make any of them local to any embedded-mode buffer. (Their
- values in the @samp{*Calculator*} buffer are never used.)
- @vindex calc-embedded-open-formula
- The @code{calc-embedded-open-formula} variable holds a regular
- expression for the opening delimiter of a formula. @xref{Regexp Search,
- , Regular Expression Search, emacs, the Emacs manual}, to see
- how regular expressions work. Basically, a regular expression is a
- pattern that Calc can search for. A regular expression that considers
- blank lines, @samp{$}, and @samp{$$} to be opening delimiters is
- @code{"\\`\\|^\n\\|\\$\\$?"}. Just in case the meaning of this
- regular expression is not completely plain, let's go through it
- in detail.
- The surrounding @samp{" "} marks quote the text between them as a
- Lisp string. If you left them off, @code{set-variable} or
- @code{edit-options} would try to read the regular expression as a
- Lisp program.
- The most obvious property of this regular expression is that it
- contains indecently many backslashes. There are actually two levels
- of backslash usage going on here. First, when Lisp reads a quoted
- string, all pairs of characters beginning with a backslash are
- interpreted as special characters. Here, @code{\n} changes to a
- new-line character, and @code{\\} changes to a single backslash.
- So the actual regular expression seen by Calc is
- @samp{\`\|^ @r{(newline)} \|\$\$?}.
- Regular expressions also consider pairs beginning with backslash
- to have special meanings. Sometimes the backslash is used to quote
- a character that otherwise would have a special meaning in a regular
- expression, like @samp{$}, which normally means ``end-of-line,''
- or @samp{?}, which means that the preceding item is optional. So
- @samp{\$\$?} matches either one or two dollar signs.
- The other codes in this regular expression are @samp{^}, which matches
- ``beginning-of-line,'' @samp{\|}, which means ``or,'' and @samp{\`},
- which matches ``beginning-of-buffer.'' So the whole pattern means
- that a formula begins at the beginning of the buffer, or on a newline
- that occurs at the beginning of a line (i.e., a blank line), or at
- one or two dollar signs.
- The default value of @code{calc-embedded-open-formula} looks just
- like this example, with several more alternatives added on to
- recognize various other common kinds of delimiters.
- By the way, the reason to use @samp{^\n} rather than @samp{^$}
- or @samp{\n\n}, which also would appear to match blank lines,
- is that the former expression actually ``consumes'' only one
- newline character as @emph{part of} the delimiter, whereas the
- latter expressions consume zero or two newlines, respectively.
- The former choice gives the most natural behavior when Calc
- must operate on a whole formula including its delimiters.
- See the Emacs manual for complete details on regular expressions.
- But just for your convenience, here is a list of all characters
- which must be quoted with backslash (like @samp{\$}) to avoid
- some special interpretation: @samp{. * + ? [ ] ^ $ \}. (Note
- the backslash in this list; for example, to match @samp{\[} you
- must use @code{"\\\\\\["}. An exercise for the reader is to
- account for each of these six backslashes!)
- @vindex calc-embedded-close-formula
- The @code{calc-embedded-close-formula} variable holds a regular
- expression for the closing delimiter of a formula. A closing
- regular expression to match the above example would be
- @code{"\\'\\|\n$\\|\\$\\$?"}. This is almost the same as the
- other one, except it now uses @samp{\'} (``end-of-buffer'') and
- @samp{\n$} (newline occurring at end of line, yet another way
- of describing a blank line that is more appropriate for this
- case).
- @vindex calc-embedded-open-word
- @vindex calc-embedded-close-word
- The @code{calc-embedded-open-word} and @code{calc-embedded-close-word}
- variables are similar expressions used when you type @kbd{M-# w}
- instead of @kbd{M-# e} to enable Embedded mode.
- @vindex calc-embedded-open-plain
- The @code{calc-embedded-open-plain} variable is a string which
- begins a ``plain'' formula written in front of the formatted
- formula when @kbd{d p} mode is turned on. Note that this is an
- actual string, not a regular expression, because Calc must be able
- to write this string into a buffer as well as to recognize it.
- The default string is @code{"%%% "} (note the trailing space).
- @vindex calc-embedded-close-plain
- The @code{calc-embedded-close-plain} variable is a string which
- ends a ``plain'' formula. The default is @code{" %%%\n"}. Without
- the trailing newline here, the first line of a ``big'' mode formula
- that followed might be shifted over with respect to the other lines.
- @vindex calc-embedded-open-new-formula
- The @code{calc-embedded-open-new-formula} variable is a string
- which is inserted at the front of a new formula when you type
- @kbd{M-# f}. Its default value is @code{"\n\n"}. If this
- string begins with a newline character and the @kbd{M-# f} is
- typed at the beginning of a line, @kbd{M-# f} will skip this
- first newline to avoid introducing unnecessary blank lines in
- the file.
- @vindex calc-embedded-close-new-formula
- The @code{calc-embedded-close-new-formula} variable is the corresponding
- string which is inserted at the end of a new formula. Its default
- value is also @code{"\n\n"}. The final newline is omitted by
- @w{@kbd{M-# f}} if typed at the end of a line. (It follows that if
- @kbd{M-# f} is typed on a blank line, both a leading opening
- newline and a trailing closing newline are omitted.)
- @vindex calc-embedded-announce-formula
- The @code{calc-embedded-announce-formula} variable is a regular
- expression which is sure to be followed by an embedded formula.
- The @kbd{M-# a} command searches for this pattern as well as for
- @samp{=>} and @samp{:=} operators. Note that @kbd{M-# a} will
- not activate just anything surrounded by formula delimiters; after
- all, blank lines are considered formula delimiters by default!
- But if your language includes a delimiter which can only occur
- actually in front of a formula, you can take advantage of it here.
- The default pattern is @code{"%Embed\n\\(% .*\n\\)*"}, which
- checks for @samp{%Embed} followed by any number of lines beginning
- with @samp{%} and a space. This last is important to make Calc
- consider mode annotations part of the pattern, so that the formula's
- opening delimiter really is sure to follow the pattern.
- @vindex calc-embedded-open-mode
- The @code{calc-embedded-open-mode} variable is a string (not a
- regular expression) which should precede a mode annotation.
- Calc never scans for this string; Calc always looks for the
- annotation itself. But this is the string that is inserted before
- the opening bracket when Calc adds an annotation on its own.
- The default is @code{"% "}.
- @vindex calc-embedded-close-mode
- The @code{calc-embedded-close-mode} variable is a string which
- follows a mode annotation written by Calc. Its default value
- is simply a newline, @code{"\n"}. If you change this, it is a
- good idea still to end with a newline so that mode annotations
- will appear on lines by themselves.
- @node Programming, Installation, Embedded Mode, Top
- @chapter Programming
- @noindent
- There are several ways to ``program'' the Emacs Calculator, depending
- on the nature of the problem you need to solve.
- @enumerate
- @item
- @dfn{Keyboard macros} allow you to record a sequence of keystrokes
- and play them back at a later time. This is just the standard Emacs
- keyboard macro mechanism, dressed up with a few more features such
- as loops and conditionals.
- @item
- @dfn{Algebraic definitions} allow you to use any formula to define a
- new function. This function can then be used in algebraic formulas or
- as an interactive command.
- @item
- @dfn{Rewrite rules} are discussed in the section on algebra commands.
- @xref{Rewrite Rules}. If you put your rewrite rules in the variable
- @code{EvalRules}, they will be applied automatically to all Calc
- results in just the same way as an internal ``rule'' is applied to
- evaluate @samp{sqrt(9)} to 3 and so on. @xref{Automatic Rewrites}.
- @item
- @dfn{Lisp} is the programming language that Calc (and most of Emacs)
- is written in. If the above techniques aren't powerful enough, you
- can write Lisp functions to do anything that built-in Calc commands
- can do. Lisp code is also somewhat faster than keyboard macros or
- rewrite rules.
- @end enumerate
- @kindex z
- Programming features are available through the @kbd{z} and @kbd{Z}
- prefix keys. New commands that you define are two-key sequences
- beginning with @kbd{z}. Commands for managing these definitions
- use the shift-@kbd{Z} prefix. (The @kbd{Z T} (@code{calc-timing})
- command is described elsewhere; @pxref{Troubleshooting Commands}.
- The @kbd{Z C} (@code{calc-user-define-composition}) command is also
- described elsewhere; @pxref{User-Defined Compositions}.)
- @menu
- * Creating User Keys::
- * Keyboard Macros::
- * Invocation Macros::
- * Algebraic Definitions::
- * Lisp Definitions::
- @end menu
- @node Creating User Keys, Keyboard Macros, Programming, Programming
- @section Creating User Keys
- @noindent
- @kindex Z D
- @pindex calc-user-define
- Any Calculator command may be bound to a key using the @kbd{Z D}
- (@code{calc-user-define}) command. Actually, it is bound to a two-key
- sequence beginning with the lower-case @kbd{z} prefix.
- The @kbd{Z D} command first prompts for the key to define. For example,
- press @kbd{Z D a} to define the new key sequence @kbd{z a}. You are then
- prompted for the name of the Calculator command that this key should
- run. For example, the @code{calc-sincos} command is not normally
- available on a key. Typing @kbd{Z D s sincos @key{RET}} programs the
- @kbd{z s} key sequence to run @code{calc-sincos}. This definition will remain
- in effect for the rest of this Emacs session, or until you redefine
- @kbd{z s} to be something else.
- You can actually bind any Emacs command to a @kbd{z} key sequence by
- backspacing over the @samp{calc-} when you are prompted for the command name.
- As with any other prefix key, you can type @kbd{z ?} to see a list of
- all the two-key sequences you have defined that start with @kbd{z}.
- Initially, no @kbd{z} sequences (except @kbd{z ?} itself) are defined.
- User keys are typically letters, but may in fact be any key.
- (@key{META}-keys are not permitted, nor are a terminal's special
- function keys which generate multi-character sequences when pressed.)
- You can define different commands on the shifted and unshifted versions
- of a letter if you wish.
- @kindex Z U
- @pindex calc-user-undefine
- The @kbd{Z U} (@code{calc-user-undefine}) command unbinds a user key.
- For example, the key sequence @kbd{Z U s} will undefine the @code{sincos}
- key we defined above.
- @kindex Z P
- @pindex calc-user-define-permanent
- @cindex Storing user definitions
- @cindex Permanent user definitions
- @cindex @file{.emacs} file, user-defined commands
- The @kbd{Z P} (@code{calc-user-define-permanent}) command makes a key
- binding permanent so that it will remain in effect even in future Emacs
- sessions. (It does this by adding a suitable bit of Lisp code into
- your @file{.emacs} file.) For example, @kbd{Z P s} would register
- our @code{sincos} command permanently. If you later wish to unregister
- this command you must edit your @file{.emacs} file by hand.
- (@xref{General Mode Commands}, for a way to tell Calc to use a
- different file instead of @file{.emacs}.)
- The @kbd{Z P} command also saves the user definition, if any, for the
- command bound to the key. After @kbd{Z F} and @kbd{Z C}, a given user
- key could invoke a command, which in turn calls an algebraic function,
- which might have one or more special display formats. A single @kbd{Z P}
- command will save all of these definitions.
- To save a command or function without its key binding (or if there is
- no key binding for the command or function), type @kbd{'} (the apostrophe)
- when prompted for a key. Then, type the function name, or backspace
- to change the @samp{calcFunc-} prefix to @samp{calc-} and enter a
- command name. (If the command you give implies a function, the function
- will be saved, and if the function has any display formats, those will
- be saved, but not the other way around: Saving a function will not save
- any commands or key bindings associated with the function.)
- @kindex Z E
- @pindex calc-user-define-edit
- @cindex Editing user definitions
- The @kbd{Z E} (@code{calc-user-define-edit}) command edits the definition
- of a user key. This works for keys that have been defined by either
- keyboard macros or formulas; further details are contained in the relevant
- following sections.
- @node Keyboard Macros, Invocation Macros, Creating User Keys, Programming
- @section Programming with Keyboard Macros
- @noindent
- @kindex X
- @cindex Programming with keyboard macros
- @cindex Keyboard macros
- The easiest way to ``program'' the Emacs Calculator is to use standard
- keyboard macros. Press @w{@kbd{C-x (}} to begin recording a macro. From
- this point on, keystrokes you type will be saved away as well as
- performing their usual functions. Press @kbd{C-x )} to end recording.
- Press shift-@kbd{X} (or the standard Emacs key sequence @kbd{C-x e}) to
- execute your keyboard macro by replaying the recorded keystrokes.
- @xref{Keyboard Macros, , , emacs, the Emacs Manual}, for further
- information.@refill
- When you use @kbd{X} to invoke a keyboard macro, the entire macro is
- treated as a single command by the undo and trail features. The stack
- display buffer is not updated during macro execution, but is instead
- fixed up once the macro completes. Thus, commands defined with keyboard
- macros are convenient and efficient. The @kbd{C-x e} command, on the
- other hand, invokes the keyboard macro with no special treatment: Each
- command in the macro will record its own undo information and trail entry,
- and update the stack buffer accordingly. If your macro uses features
- outside of Calc's control to operate on the contents of the Calc stack
- buffer, or if it includes Undo, Redo, or last-arguments commands, you
- must use @kbd{C-x e} to make sure the buffer and undo list are up-to-date
- at all times. You could also consider using @kbd{K} (@code{calc-keep-args})
- instead of @kbd{M-@key{RET}} (@code{calc-last-args}).
- Calc extends the standard Emacs keyboard macros in several ways.
- Keyboard macros can be used to create user-defined commands. Keyboard
- macros can include conditional and iteration structures, somewhat
- analogous to those provided by a traditional programmable calculator.
- @menu
- * Naming Keyboard Macros::
- * Conditionals in Macros::
- * Loops in Macros::
- * Local Values in Macros::
- * Queries in Macros::
- @end menu
- @node Naming Keyboard Macros, Conditionals in Macros, Keyboard Macros, Keyboard Macros
- @subsection Naming Keyboard Macros
- @noindent
- @kindex Z K
- @pindex calc-user-define-kbd-macro
- Once you have defined a keyboard macro, you can bind it to a @kbd{z}
- key sequence with the @kbd{Z K} (@code{calc-user-define-kbd-macro}) command.
- This command prompts first for a key, then for a command name. For
- example, if you type @kbd{C-x ( n @key{TAB} n @key{TAB} C-x )} you will
- define a keyboard macro which negates the top two numbers on the stack
- (@key{TAB} swaps the top two stack elements). Now you can type
- @kbd{Z K n @key{RET}} to define this keyboard macro onto the @kbd{z n} key
- sequence. The default command name (if you answer the second prompt with
- just the @key{RET} key as in this example) will be something like
- @samp{calc-User-n}. The keyboard macro will now be available as both
- @kbd{z n} and @kbd{M-x calc-User-n}. You can backspace and enter a more
- descriptive command name if you wish.@refill
- Macros defined by @kbd{Z K} act like single commands; they are executed
- in the same way as by the @kbd{X} key. If you wish to define the macro
- as a standard no-frills Emacs macro (to be executed as if by @kbd{C-x e}),
- give a negative prefix argument to @kbd{Z K}.
- Once you have bound your keyboard macro to a key, you can use
- @kbd{Z P} to register it permanently with Emacs. @xref{Creating User Keys}.
- @cindex Keyboard macros, editing
- The @kbd{Z E} (@code{calc-user-define-edit}) command on a key that has
- been defined by a keyboard macro tries to use the @code{edit-kbd-macro}
- command to edit the macro. This command may be found in the
- @file{macedit} package, a copy of which comes with Calc. It decomposes
- the macro definition into full Emacs command names, like @code{calc-pop}
- and @code{calc-add}. Type @kbd{M-# M-#} to finish editing and update
- the definition stored on the key, or, to cancel the edit, type
- @kbd{M-# x}.@refill
- If you give a negative numeric prefix argument to @kbd{Z E}, the keyboard
- macro is edited in spelled-out keystroke form. For example, the editing
- buffer might contain the nine characters @w{@samp{1 @key{RET} 2 +}}. When you press
- @kbd{M-# M-#}, the @code{read-kbd-macro} feature of the @file{macedit}
- package is used to reinterpret these key names. The
- notations @code{RET}, @code{LFD}, @code{TAB}, @code{SPC}, @code{DEL}, and
- @code{NUL} must be written in all uppercase, as must the prefixes @code{C-}
- and @code{M-}. Spaces and line breaks are ignored. Other characters are
- copied verbatim into the keyboard macro. Basically, the notation is the
- same as is used in all of this manual's examples, except that the manual
- takes some liberties with spaces: When we say @kbd{' [1 2 3] @key{RET}}, we take
- it for granted that it is clear we really mean @kbd{' [1 @key{SPC} 2 @key{SPC} 3] @key{RET}},
- which is what @code{read-kbd-macro} wants to see.@refill
- If @file{macedit} is not available, @kbd{Z E} edits the keyboard macro
- in ``raw'' form; the editing buffer simply contains characters like
- @samp{1^M2+} (here @samp{^M} represents the carriage-return character).
- Editing in this mode, you will have to use @kbd{C-q} to enter new
- control characters into the buffer.@refill
- @kindex M-# m
- @pindex read-kbd-macro
- The @kbd{M-# m} (@code{read-kbd-macro}) command reads an Emacs ``region''
- of spelled-out keystrokes and defines it as the current keyboard macro.
- It is a convenient way to define a keyboard macro that has been stored
- in a file, or to define a macro without executing it at the same time.
- The @kbd{M-# m} command works only if @file{macedit} is present.
- @node Conditionals in Macros, Loops in Macros, Naming Keyboard Macros, Keyboard Macros
- @subsection Conditionals in Keyboard Macros
- @noindent
- @kindex Z [
- @kindex Z ]
- @pindex calc-kbd-if
- @pindex calc-kbd-else
- @pindex calc-kbd-else-if
- @pindex calc-kbd-end-if
- @cindex Conditional structures
- The @kbd{Z [} (@code{calc-kbd-if}) and @kbd{Z ]} (@code{calc-kbd-end-if})
- commands allow you to put simple tests in a keyboard macro. When Calc
- sees the @kbd{Z [}, it pops an object from the stack and, if the object is
- a non-zero value, continues executing keystrokes. But if the object is
- zero, or if it is not provably nonzero, Calc skips ahead to the matching
- @kbd{Z ]} keystroke. @xref{Logical Operations}, for a set of commands for
- performing tests which conveniently produce 1 for true and 0 for false.
- For example, @kbd{@key{RET} 0 a < Z [ n Z ]} implements an absolute-value
- function in the form of a keyboard macro. This macro duplicates the
- number on the top of the stack, pushes zero and compares using @kbd{a <}
- (@code{calc-less-than}), then, if the number was less than zero,
- executes @kbd{n} (@code{calc-change-sign}). Otherwise, the change-sign
- command is skipped.
- To program this macro, type @kbd{C-x (}, type the above sequence of
- keystrokes, then type @kbd{C-x )}. Note that the keystrokes will be
- executed while you are making the definition as well as when you later
- re-execute the macro by typing @kbd{X}. Thus you should make sure a
- suitable number is on the stack before defining the macro so that you
- don't get a stack-underflow error during the definition process.
- Conditionals can be nested arbitrarily. However, there should be exactly
- one @kbd{Z ]} for each @kbd{Z [} in a keyboard macro.
- @kindex Z :
- The @kbd{Z :} (@code{calc-kbd-else}) command allows you to choose between
- two keystroke sequences. The general format is @kbd{@var{cond} Z [
- @var{then-part} Z : @var{else-part} Z ]}. If @var{cond} is true
- (i.e., if the top of stack contains a non-zero number after @var{cond}
- has been executed), the @var{then-part} will be executed and the
- @var{else-part} will be skipped. Otherwise, the @var{then-part} will
- be skipped and the @var{else-part} will be executed.
- @kindex Z |
- The @kbd{Z |} (@code{calc-kbd-else-if}) command allows you to choose
- between any number of alternatives. For example,
- @kbd{@var{cond1} Z [ @var{part1} Z : @var{cond2} Z | @var{part2} Z :
- @var{part3} Z ]} will execute @var{part1} if @var{cond1} is true,
- otherwise it will execute @var{part2} if @var{cond2} is true, otherwise
- it will execute @var{part3}.
- More precisely, @kbd{Z [} pops a number and conditionally skips to the
- next matching @kbd{Z :} or @kbd{Z ]} key. @w{@kbd{Z ]}} has no effect when
- actually executed. @kbd{Z :} skips to the next matching @kbd{Z ]}.
- @kbd{Z |} pops a number and conditionally skips to the next matching
- @kbd{Z :} or @kbd{Z ]}; thus, @kbd{Z [} and @kbd{Z |} are functionally
- equivalent except that @kbd{Z [} participates in nesting but @kbd{Z |}
- does not.
- Calc's conditional and looping constructs work by scanning the
- keyboard macro for occurrences of character sequences like @samp{Z:}
- and @samp{Z]}. One side-effect of this is that if you use these
- constructs you must be careful that these character pairs do not
- occur by accident in other parts of the macros. Since Calc rarely
- uses shift-@kbd{Z} for any purpose except as a prefix character, this
- is not likely to be a problem. Another side-effect is that it will
- not work to define your own custom key bindings for these commands.
- Only the standard shift-@kbd{Z} bindings will work correctly.
- @kindex Z C-g
- If Calc gets stuck while skipping characters during the definition of a
- macro, type @kbd{Z C-g} to cancel the definition. (Typing plain @kbd{C-g}
- actually adds a @kbd{C-g} keystroke to the macro.)
- @node Loops in Macros, Local Values in Macros, Conditionals in Macros, Keyboard Macros
- @subsection Loops in Keyboard Macros
- @noindent
- @kindex Z <
- @kindex Z >
- @pindex calc-kbd-repeat
- @pindex calc-kbd-end-repeat
- @cindex Looping structures
- @cindex Iterative structures
- The @kbd{Z <} (@code{calc-kbd-repeat}) and @kbd{Z >}
- (@code{calc-kbd-end-repeat}) commands pop a number from the stack,
- which must be an integer, then repeat the keystrokes between the brackets
- the specified number of times. If the integer is zero or negative, the
- body is skipped altogether. For example, @kbd{1 @key{TAB} Z < 2 * Z >}
- computes two to a nonnegative integer power. First, we push 1 on the
- stack and then swap the integer argument back to the top. The @kbd{Z <}
- pops that argument leaving the 1 back on top of the stack. Then, we
- repeat a multiply-by-two step however many times.@refill
- Once again, the keyboard macro is executed as it is being entered.
- In this case it is especially important to set up reasonable initial
- conditions before making the definition: Suppose the integer 1000 just
- happened to be sitting on the stack before we typed the above definition!
- Another approach is to enter a harmless dummy definition for the macro,
- then go back and edit in the real one with a @kbd{Z E} command. Yet
- another approach is to type the macro as written-out keystroke names
- in a buffer, then use @kbd{M-# m} (@code{read-kbd-macro}) to read the
- macro.
- @kindex Z /
- @pindex calc-break
- The @kbd{Z /} (@code{calc-kbd-break}) command allows you to break out
- of a keyboard macro loop prematurely. It pops an object from the stack;
- if that object is true (a non-zero number), control jumps out of the
- innermost enclosing @kbd{Z <} @dots{} @kbd{Z >} loop and continues
- after the @kbd{Z >}. If the object is false, the @kbd{Z /} has no
- effect. Thus @kbd{@var{cond} Z /} is similar to @samp{if (@var{cond}) break;}
- in the C language.@refill
- @kindex Z (
- @kindex Z )
- @pindex calc-kbd-for
- @pindex calc-kbd-end-for
- The @kbd{Z (} (@code{calc-kbd-for}) and @kbd{Z )} (@code{calc-kbd-end-for})
- commands are similar to @kbd{Z <} and @kbd{Z >}, except that they make the
- value of the counter available inside the loop. The general layout is
- @kbd{@var{init} @var{final} Z ( @var{body} @var{step} Z )}. The @kbd{Z (}
- command pops initial and final values from the stack. It then creates
- a temporary internal counter and initializes it with the value @var{init}.
- The @kbd{Z (} command then repeatedly pushes the counter value onto the
- stack and executes @var{body} and @var{step}, adding @var{step} to the
- counter each time until the loop finishes.@refill
- @cindex Summations (by keyboard macros)
- By default, the loop finishes when the counter becomes greater than (or
- less than) @var{final}, assuming @var{initial} is less than (greater
- than) @var{final}. If @var{initial} is equal to @var{final}, the body
- executes exactly once. The body of the loop always executes at least
- once. For example, @kbd{0 1 10 Z ( 2 ^ + 1 Z )} computes the sum of the
- squares of the integers from 1 to 10, in steps of 1.
- If you give a numeric prefix argument of 1 to @kbd{Z (}, the loop is
- forced to use upward-counting conventions. In this case, if @var{initial}
- is greater than @var{final} the body will not be executed at all.
- Note that @var{step} may still be negative in this loop; the prefix
- argument merely constrains the loop-finished test. Likewise, a prefix
- argument of @i{-1} forces downward-counting conventions.
- @kindex Z @{
- @kindex Z @}
- @pindex calc-kbd-loop
- @pindex calc-kbd-end-loop
- The @kbd{Z @{} (@code{calc-kbd-loop}) and @kbd{Z @}}
- (@code{calc-kbd-end-loop}) commands are similar to @kbd{Z <} and
- @kbd{Z >}, except that they do not pop a count from the stack---they
- effectively create an infinite loop. Every @kbd{Z @{} @dots{} @kbd{Z @}}
- loop ought to include at least one @kbd{Z /} to make sure the loop
- doesn't run forever. (If any error message occurs which causes Emacs
- to beep, the keyboard macro will also be halted; this is a standard
- feature of Emacs. You can also generally press @kbd{C-g} to halt a
- running keyboard macro, although not all versions of Unix support
- this feature.)
- The conditional and looping constructs are not actually tied to
- keyboard macros, but they are most often used in that context.
- For example, the keystrokes @kbd{10 Z < 23 @key{RET} Z >} push
- ten copies of 23 onto the stack. This can be typed ``live'' just
- as easily as in a macro definition.
- @xref{Conditionals in Macros}, for some additional notes about
- conditional and looping commands.
- @node Local Values in Macros, Queries in Macros, Loops in Macros, Keyboard Macros
- @subsection Local Values in Macros
- @noindent
- @cindex Local variables
- @cindex Restoring saved modes
- Keyboard macros sometimes want to operate under known conditions
- without affecting surrounding conditions. For example, a keyboard
- macro may wish to turn on Fraction Mode, or set a particular
- precision, independent of the user's normal setting for those
- modes.
- @kindex Z `
- @kindex Z '
- @pindex calc-kbd-push
- @pindex calc-kbd-pop
- Macros also sometimes need to use local variables. Assignments to
- local variables inside the macro should not affect any variables
- outside the macro. The @kbd{Z `} (@code{calc-kbd-push}) and @kbd{Z '}
- (@code{calc-kbd-pop}) commands give you both of these capabilities.
- When you type @kbd{Z `} (with a backquote or accent grave character),
- the values of various mode settings are saved away. The ten ``quick''
- variables @code{q0} through @code{q9} are also saved. When
- you type @w{@kbd{Z '}} (with an apostrophe), these values are restored.
- Pairs of @kbd{Z `} and @kbd{Z '} commands may be nested.
- If a keyboard macro halts due to an error in between a @kbd{Z `} and
- a @kbd{Z '}, the saved values will be restored correctly even though
- the macro never reaches the @kbd{Z '} command. Thus you can use
- @kbd{Z `} and @kbd{Z '} without having to worry about what happens
- in exceptional conditions.
- If you type @kbd{Z `} ``live'' (not in a keyboard macro), Calc puts
- you into a ``recursive edit.'' You can tell you are in a recursive
- edit because there will be extra square brackets in the mode line,
- as in @samp{[(Calculator)]}. These brackets will go away when you
- type the matching @kbd{Z '} command. The modes and quick variables
- will be saved and restored in just the same way as if actual keyboard
- macros were involved.
- The modes saved by @kbd{Z `} and @kbd{Z '} are the current precision
- and binary word size, the angular mode (Deg, Rad, or HMS), the
- simplification mode, Algebraic mode, Symbolic mode, Infinite mode,
- Matrix or Scalar mode, Fraction mode, and the current complex mode
- (Polar or Rectangular). The ten ``quick'' variables' values (or lack
- thereof) are also saved.
- Most mode-setting commands act as toggles, but with a numeric prefix
- they force the mode either on (positive prefix) or off (negative
- or zero prefix). Since you don't know what the environment might
- be when you invoke your macro, it's best to use prefix arguments
- for all mode-setting commands inside the macro.
- In fact, @kbd{C-u Z `} is like @kbd{Z `} except that it sets the modes
- listed above to their default values. As usual, the matching @kbd{Z '}
- will restore the modes to their settings from before the @kbd{C-u Z `}.
- Also, @w{@kbd{Z `}} with a negative prefix argument resets algebraic mode
- to its default (off) but leaves the other modes the same as they were
- outside the construct.
- The contents of the stack and trail, values of non-quick variables, and
- other settings such as the language mode and the various display modes,
- are @emph{not} affected by @kbd{Z `} and @kbd{Z '}.
- @node Queries in Macros, , Local Values in Macros, Keyboard Macros
- @subsection Queries in Keyboard Macros
- @noindent
- @kindex Z =
- @pindex calc-kbd-report
- The @kbd{Z =} (@code{calc-kbd-report}) command displays an informative
- message including the value on the top of the stack. You are prompted
- to enter a string. That string, along with the top-of-stack value,
- is displayed unless @kbd{m w} (@code{calc-working}) has been used
- to turn such messages off.
- @kindex Z #
- @pindex calc-kbd-query
- The @kbd{Z #} (@code{calc-kbd-query}) command displays a prompt message
- (which you enter during macro definition), then does an algebraic entry
- which takes its input from the keyboard, even during macro execution.
- This command allows your keyboard macros to accept numbers or formulas
- as interactive input. All the normal conventions of algebraic input,
- including the use of @kbd{$} characters, are supported.
- @xref{Kbd Macro Query, , , emacs, the Emacs Manual}, for a description of
- @kbd{C-x q} (@code{kbd-macro-query}), the standard Emacs way to accept
- keyboard input during a keyboard macro. In particular, you can use
- @kbd{C-x q} to enter a recursive edit, which allows the user to perform
- any Calculator operations interactively before pressing @kbd{C-M-c} to
- return control to the keyboard macro.
- @node Invocation Macros, Algebraic Definitions, Keyboard Macros, Programming
- @section Invocation Macros
- @kindex M-# z
- @kindex Z I
- @pindex calc-user-invocation
- @pindex calc-user-define-invocation
- Calc provides one special keyboard macro, called up by @kbd{M-# z}
- (@code{calc-user-invocation}), that is intended to allow you to define
- your own special way of starting Calc. To define this ``invocation
- macro,'' create the macro in the usual way with @kbd{C-x (} and
- @kbd{C-x )}, then type @kbd{Z I} (@code{calc-user-define-invocation}).
- There is only one invocation macro, so you don't need to type any
- additional letters after @kbd{Z I}. From now on, you can type
- @kbd{M-# z} at any time to execute your invocation macro.
- For example, suppose you find yourself often grabbing rectangles of
- numbers into Calc and multiplying their columns. You can do this
- by typing @kbd{M-# r} to grab, and @kbd{V R : *} to multiply columns.
- To make this into an invocation macro, just type @kbd{C-x ( M-# r
- V R : * C-x )}, then @kbd{Z I}. Then, to multiply a rectangle of data,
- just mark the data in its buffer in the usual way and type @kbd{M-# z}.
- Invocation macros are treated like regular Emacs keyboard macros;
- all the special features described above for @kbd{Z K}-style macros
- do not apply. @kbd{M-# z} is just like @kbd{C-x e}, except that it
- uses the macro that was last stored by @kbd{Z I}. (In fact, the
- macro does not even have to have anything to do with Calc!)
- The @kbd{m m} command saves the last invocation macro defined by
- @kbd{Z I} along with all the other Calc mode settings.
- @xref{General Mode Commands}.
- @node Algebraic Definitions, Lisp Definitions, Invocation Macros, Programming
- @section Programming with Formulas
- @noindent
- @kindex Z F
- @pindex calc-user-define-formula
- @cindex Programming with algebraic formulas
- Another way to create a new Calculator command uses algebraic formulas.
- The @kbd{Z F} (@code{calc-user-define-formula}) command stores the
- formula at the top of the stack as the definition for a key. This
- command prompts for five things: The key, the command name, the function
- name, the argument list, and the behavior of the command when given
- non-numeric arguments.
- For example, suppose we type @kbd{' a+2b @key{RET}} to push the formula
- @samp{a + 2*b} onto the stack. We now type @kbd{Z F m} to define this
- formula on the @kbd{z m} key sequence. The next prompt is for a command
- name, beginning with @samp{calc-}, which should be the long (@kbd{M-x}) form
- for the new command. If you simply press @key{RET}, a default name like
- @code{calc-User-m} will be constructed. In our example, suppose we enter
- @kbd{spam @key{RET}} to define the new command as @code{calc-spam}.
- If you want to give the formula a long-style name only, you can press
- @key{SPC} or @key{RET} when asked which single key to use. For example
- @kbd{Z F @key{RET} spam @key{RET}} defines the new command as
- @kbd{M-x calc-spam}, with no keyboard equivalent.
- The third prompt is for a function name. The default is to use the same
- name as the command name but with @samp{calcFunc-} in place of
- @samp{calc-}. This is the name you will use if you want to enter your
- new function in an algebraic formula. Suppose we enter @kbd{yow @key{RET}}.
- Then the new function can be invoked by pushing two numbers on the
- stack and typing @kbd{z m} or @kbd{x spam}, or by entering the algebraic
- formula @samp{yow(x,y)}.@refill
- The fourth prompt is for the function's argument list. This is used to
- associate values on the stack with the variables that appear in the formula.
- The default is a list of all variables which appear in the formula, sorted
- into alphabetical order. In our case, the default would be @samp{(a b)}.
- This means that, when the user types @kbd{z m}, the Calculator will remove
- two numbers from the stack, substitute these numbers for @samp{a} and
- @samp{b} (respectively) in the formula, then simplify the formula and
- push the result on the stack. In other words, @kbd{10 @key{RET} 100 z m}
- would replace the 10 and 100 on the stack with the number 210, which is
- @cite{a + 2 b} with @cite{a=10} and @cite{b=100}. Likewise, the formula
- @samp{yow(10, 100)} will be evaluated by substituting @cite{a=10} and
- @cite{b=100} in the definition.
- You can rearrange the order of the names before pressing @key{RET} to
- control which stack positions go to which variables in the formula. If
- you remove a variable from the argument list, that variable will be left
- in symbolic form by the command. Thus using an argument list of @samp{(b)}
- for our function would cause @kbd{10 z m} to replace the 10 on the stack
- with the formula @samp{a + 20}. If we had used an argument list of
- @samp{(b a)}, the result with inputs 10 and 100 would have been 120.
- You can also put a nameless function on the stack instead of just a
- formula, as in @samp{<a, b : a + 2 b>}. @xref{Specifying Operators}.
- In this example, the command will be defined by the formula @samp{a + 2 b}
- using the argument list @samp{(a b)}.
- The final prompt is a y-or-n question concerning what to do if symbolic
- arguments are given to your function. If you answer @kbd{y}, then
- executing @kbd{z m} (using the original argument list @samp{(a b)}) with
- arguments @cite{10} and @cite{x} will leave the function in symbolic
- form, i.e., @samp{yow(10,x)}. On the other hand, if you answer @kbd{n},
- then the formula will always be expanded, even for non-constant
- arguments: @samp{10 + 2 x}. If you never plan to feed algebraic
- formulas to your new function, it doesn't matter how you answer this
- question.@refill
- If you answered @kbd{y} to this question you can still cause a function
- call to be expanded by typing @kbd{a "} (@code{calc-expand-formula}).
- Also, Calc will expand the function if necessary when you take a
- derivative or integral or solve an equation involving the function.
- @kindex Z G
- @pindex calc-get-user-defn
- Once you have defined a formula on a key, you can retrieve this formula
- with the @kbd{Z G} (@code{calc-user-define-get-defn}) command. Press a
- key, and this command pushes the formula that was used to define that
- key onto the stack. Actually, it pushes a nameless function that
- specifies both the argument list and the defining formula. You will get
- an error message if the key is undefined, or if the key was not defined
- by a @kbd{Z F} command.@refill
- The @kbd{Z E} (@code{calc-user-define-edit}) command on a key that has
- been defined by a formula uses a variant of the @code{calc-edit} command
- to edit the defining formula. Press @kbd{M-# M-#} to finish editing and
- store the new formula back in the definition, or @kbd{M-# x} to
- cancel the edit. (The argument list and other properties of the
- definition are unchanged; to adjust the argument list, you can use
- @kbd{Z G} to grab the function onto the stack, edit with @kbd{`}, and
- then re-execute the @kbd{Z F} command.)
- As usual, the @kbd{Z P} command records your definition permanently.
- In this case it will permanently record all three of the relevant
- definitions: the key, the command, and the function.
- You may find it useful to turn off the default simplifications with
- @kbd{m O} (@code{calc-no-simplify-mode}) when entering a formula to be
- used as a function definition. For example, the formula @samp{deriv(a^2,v)}
- which might be used to define a new function @samp{dsqr(a,v)} will be
- ``simplified'' to 0 immediately upon entry since @code{deriv} considers
- @cite{a} to be constant with respect to @cite{v}. Turning off
- default simplifications cures this problem: The definition will be stored
- in symbolic form without ever activating the @code{deriv} function. Press
- @kbd{m D} to turn the default simplifications back on afterwards.
- @node Lisp Definitions, , Algebraic Definitions, Programming
- @section Programming with Lisp
- @noindent
- The Calculator can be programmed quite extensively in Lisp. All you
- do is write a normal Lisp function definition, but with @code{defmath}
- in place of @code{defun}. This has the same form as @code{defun}, but it
- automagically replaces calls to standard Lisp functions like @code{+} and
- @code{zerop} with calls to the corresponding functions in Calc's own library.
- Thus you can write natural-looking Lisp code which operates on all of the
- standard Calculator data types. You can then use @kbd{Z D} if you wish to
- bind your new command to a @kbd{z}-prefix key sequence. The @kbd{Z E} command
- will not edit a Lisp-based definition.
- Emacs Lisp is described in the GNU Emacs Lisp Reference Manual. This section
- assumes a familiarity with Lisp programming concepts; if you do not know
- Lisp, you may find keyboard macros or rewrite rules to be an easier way
- to program the Calculator.
- This section first discusses ways to write commands, functions, or
- small programs to be executed inside of Calc. Then it discusses how
- your own separate programs are able to call Calc from the outside.
- Finally, there is a list of internal Calc functions and data structures
- for the true Lisp enthusiast.
- @menu
- * Defining Functions::
- * Defining Simple Commands::
- * Defining Stack Commands::
- * Argument Qualifiers::
- * Example Definitions::
- * Calling Calc from Your Programs::
- * Internals::
- @end menu
- @node Defining Functions, Defining Simple Commands, Lisp Definitions, Lisp Definitions
- @subsection Defining New Functions
- @noindent
- @findex defmath
- The @code{defmath} function (actually a Lisp macro) is like @code{defun}
- except that code in the body of the definition can make use of the full
- range of Calculator data types. The prefix @samp{calcFunc-} is added
- to the specified name to get the actual Lisp function name. As a simple
- example,
- @example
- (defmath myfact (n)
- (if (> n 0)
- (* n (myfact (1- n)))
- 1))
- @end example
- @noindent
- This actually expands to the code,
- @example
- (defun calcFunc-myfact (n)
- (if (math-posp n)
- (math-mul n (calcFunc-myfact (math-add n -1)))
- 1))
- @end example
- @noindent
- This function can be used in algebraic expressions, e.g., @samp{myfact(5)}.
- The @samp{myfact} function as it is defined above has the bug that an
- expression @samp{myfact(a+b)} will be simplified to 1 because the
- formula @samp{a+b} is not considered to be @code{posp}. A robust
- factorial function would be written along the following lines:
- @smallexample
- (defmath myfact (n)
- (if (> n 0)
- (* n (myfact (1- n)))
- (if (= n 0)
- 1
- nil))) ; this could be simplified as: (and (= n 0) 1)
- @end smallexample
- If a function returns @code{nil}, it is left unsimplified by the Calculator
- (except that its arguments will be simplified). Thus, @samp{myfact(a+1+2)}
- will be simplified to @samp{myfact(a+3)} but no further. Beware that every
- time the Calculator reexamines this formula it will attempt to resimplify
- it, so your function ought to detect the returning-@code{nil} case as
- efficiently as possible.
- The following standard Lisp functions are treated by @code{defmath}:
- @code{+}, @code{-}, @code{*}, @code{/}, @code{%}, @code{^} or
- @code{expt}, @code{=}, @code{<}, @code{>}, @code{<=}, @code{>=},
- @code{/=}, @code{1+}, @code{1-}, @code{logand}, @code{logior}, @code{logxor},
- @code{logandc2}, @code{lognot}. Also, @code{~=} is an abbreviation for
- @code{math-nearly-equal}, which is useful in implementing Taylor series.@refill
- For other functions @var{func}, if a function by the name
- @samp{calcFunc-@var{func}} exists it is used, otherwise if a function by the
- name @samp{math-@var{func}} exists it is used, otherwise if @var{func} itself
- is defined as a function it is used, otherwise @samp{calcFunc-@var{func}} is
- used on the assumption that this is a to-be-defined math function. Also, if
- the function name is quoted as in @samp{('integerp a)} the function name is
- always used exactly as written (but not quoted).@refill
- Variable names have @samp{var-} prepended to them unless they appear in
- the function's argument list or in an enclosing @code{let}, @code{let*},
- @code{for}, or @code{foreach} form,
- or their names already contain a @samp{-} character. Thus a reference to
- @samp{foo} is the same as a reference to @samp{var-foo}.@refill
- A few other Lisp extensions are available in @code{defmath} definitions:
- @itemize @bullet
- @item
- The @code{elt} function accepts any number of index variables.
- Note that Calc vectors are stored as Lisp lists whose first
- element is the symbol @code{vec}; thus, @samp{(elt v 2)} yields
- the second element of vector @code{v}, and @samp{(elt m i j)}
- yields one element of a Calc matrix.
- @item
- The @code{setq} function has been extended to act like the Common
- Lisp @code{setf} function. (The name @code{setf} is recognized as
- a synonym of @code{setq}.) Specifically, the first argument of
- @code{setq} can be an @code{nth}, @code{elt}, @code{car}, or @code{cdr} form,
- in which case the effect is to store into the specified
- element of a list. Thus, @samp{(setq (elt m i j) x)} stores @cite{x}
- into one element of a matrix.
- @item
- A @code{for} looping construct is available. For example,
- @samp{(for ((i 0 10)) body)} executes @code{body} once for each
- binding of @cite{i} from zero to 10. This is like a @code{let}
- form in that @cite{i} is temporarily bound to the loop count
- without disturbing its value outside the @code{for} construct.
- Nested loops, as in @samp{(for ((i 0 10) (j 0 (1- i) 2)) body)},
- are also available. For each value of @cite{i} from zero to 10,
- @cite{j} counts from 0 to @cite{i-1} in steps of two. Note that
- @code{for} has the same general outline as @code{let*}, except
- that each element of the header is a list of three or four
- things, not just two.
- @item
- The @code{foreach} construct loops over elements of a list.
- For example, @samp{(foreach ((x (cdr v))) body)} executes
- @code{body} with @cite{x} bound to each element of Calc vector
- @cite{v} in turn. The purpose of @code{cdr} here is to skip over
- the initial @code{vec} symbol in the vector.
- @item
- The @code{break} function breaks out of the innermost enclosing
- @code{while}, @code{for}, or @code{foreach} loop. If given a
- value, as in @samp{(break x)}, this value is returned by the
- loop. (Lisp loops otherwise always return @code{nil}.)
- @item
- The @code{return} function prematurely returns from the enclosing
- function. For example, @samp{(return (+ x y))} returns @cite{x+y}
- as the value of a function. You can use @code{return} anywhere
- inside the body of the function.
- @end itemize
- Non-integer numbers (and extremely large integers) cannot be included
- directly into a @code{defmath} definition. This is because the Lisp
- reader will fail to parse them long before @code{defmath} ever gets control.
- Instead, use the notation, @samp{:"3.1415"}. In fact, any algebraic
- formula can go between the quotes. For example,
- @smallexample
- (defmath sqexp (x) ; sqexp(x) == sqrt(exp(x)) == exp(x*0.5)
- (and (numberp x)
- (exp :"x * 0.5")))
- @end smallexample
- expands to
- @smallexample
- (defun calcFunc-sqexp (x)
- (and (math-numberp x)
- (calcFunc-exp (math-mul x '(float 5 -1)))))
- @end smallexample
- Note the use of @code{numberp} as a guard to ensure that the argument is
- a number first, returning @code{nil} if not. The exponential function
- could itself have been included in the expression, if we had preferred:
- @samp{:"exp(x * 0.5)"}. As another example, the multiplication-and-recursion
- step of @code{myfact} could have been written
- @example
- :"n * myfact(n-1)"
- @end example
- If a file named @file{.emacs} exists in your home directory, Emacs reads
- and executes the Lisp forms in this file as it starts up. While it may
- seem like a good idea to put your favorite @code{defmath} commands here,
- this has the unfortunate side-effect that parts of the Calculator must be
- loaded in to process the @code{defmath} commands whether or not you will
- actually use the Calculator! A better effect can be had by writing
- @example
- (put 'calc-define 'thing '(progn
- (defmath ... )
- (defmath ... )
- ))
- @end example
- @noindent
- @vindex calc-define
- The @code{put} function adds a @dfn{property} to a symbol. Each Lisp
- symbol has a list of properties associated with it. Here we add a
- property with a name of @code{thing} and a @samp{(progn ...)} form as
- its value. When Calc starts up, and at the start of every Calc command,
- the property list for the symbol @code{calc-define} is checked and the
- values of any properties found are evaluated as Lisp forms. The
- properties are removed as they are evaluated. The property names
- (like @code{thing}) are not used; you should choose something like the
- name of your project so as not to conflict with other properties.
- The net effect is that you can put the above code in your @file{.emacs}
- file and it will not be executed until Calc is loaded. Or, you can put
- that same code in another file which you load by hand either before or
- after Calc itself is loaded.
- The properties of @code{calc-define} are evaluated in the same order
- that they were added. They can assume that the Calc modules @file{calc.el},
- @file{calc-ext.el}, and @file{calc-macs.el} have been fully loaded, and
- that the @samp{*Calculator*} buffer will be the current buffer.
- If your @code{calc-define} property only defines algebraic functions,
- you can be sure that it will have been evaluated before Calc tries to
- call your function, even if the file defining the property is loaded
- after Calc is loaded. But if the property defines commands or key
- sequences, it may not be evaluated soon enough. (Suppose it defines the
- new command @code{tweak-calc}; the user can load your file, then type
- @kbd{M-x tweak-calc} before Calc has had chance to do anything.) To
- protect against this situation, you can put
- @example
- (run-hooks 'calc-check-defines)
- @end example
- @findex calc-check-defines
- @noindent
- at the end of your file. The @code{calc-check-defines} function is what
- looks for and evaluates properties on @code{calc-define}; @code{run-hooks}
- has the advantage that it is quietly ignored if @code{calc-check-defines}
- is not yet defined because Calc has not yet been loaded.
- Examples of things that ought to be enclosed in a @code{calc-define}
- property are @code{defmath} calls, @code{define-key} calls that modify
- the Calc key map, and any calls that redefine things defined inside Calc.
- Ordinary @code{defun}s need not be enclosed with @code{calc-define}.
- @node Defining Simple Commands, Defining Stack Commands, Defining Functions, Lisp Definitions
- @subsection Defining New Simple Commands
- @noindent
- @findex interactive
- If a @code{defmath} form contains an @code{interactive} clause, it defines
- a Calculator command. Actually such a @code{defmath} results in @emph{two}
- function definitions: One, a @samp{calcFunc-} function as was just described,
- with the @code{interactive} clause removed. Two, a @samp{calc-} function
- with a suitable @code{interactive} clause and some sort of wrapper to make
- the command work in the Calc environment.
- In the simple case, the @code{interactive} clause has the same form as
- for normal Emacs Lisp commands:
- @smallexample
- (defmath increase-precision (delta)
- "Increase precision by DELTA." ; This is the "documentation string"
- (interactive "p") ; Register this as a M-x-able command
- (setq calc-internal-prec (+ calc-internal-prec delta)))
- @end smallexample
- This expands to the pair of definitions,
- @smallexample
- (defun calc-increase-precision (delta)
- "Increase precision by DELTA."
- (interactive "p")
- (calc-wrapper
- (setq calc-internal-prec (math-add calc-internal-prec delta))))
- (defun calcFunc-increase-precision (delta)
- "Increase precision by DELTA."
- (setq calc-internal-prec (math-add calc-internal-prec delta)))
- @end smallexample
- @noindent
- where in this case the latter function would never really be used! Note
- that since the Calculator stores small integers as plain Lisp integers,
- the @code{math-add} function will work just as well as the native
- @code{+} even when the intent is to operate on native Lisp integers.
- @findex calc-wrapper
- The @samp{calc-wrapper} call invokes a macro which surrounds the body of
- the function with code that looks roughly like this:
- @smallexample
- (let ((calc-command-flags nil))
- (unwind-protect
- (save-excursion
- (calc-select-buffer)
- @emph{body of function}
- @emph{renumber stack}
- @emph{clear} Working @emph{message})
- @emph{realign cursor and window}
- @emph{clear Inverse, Hyperbolic, and Keep Args flags}
- @emph{update Emacs mode line}))
- @end smallexample
- @findex calc-select-buffer
- The @code{calc-select-buffer} function selects the @samp{*Calculator*}
- buffer if necessary, say, because the command was invoked from inside
- the @samp{*Calc Trail*} window.
- @findex calc-set-command-flag
- You can call, for example, @code{(calc-set-command-flag 'no-align)} to
- set the above-mentioned command flags. Calc routines recognize the
- following command flags:
- @table @code
- @item renum-stack
- Stack line numbers @samp{1:}, @samp{2:}, and so on must be renumbered
- after this command completes. This is set by routines like
- @code{calc-push}.
- @item clear-message
- Calc should call @samp{(message "")} if this command completes normally
- (to clear a ``Working@dots{}'' message out of the echo area).
- @item no-align
- Do not move the cursor back to the @samp{.} top-of-stack marker.
- @item position-point
- Use the variables @code{calc-position-point-line} and
- @code{calc-position-point-column} to position the cursor after
- this command finishes.
- @item keep-flags
- Do not clear @code{calc-inverse-flag}, @code{calc-hyperbolic-flag},
- and @code{calc-keep-args-flag} at the end of this command.
- @item do-edit
- Switch to buffer @samp{*Calc Edit*} after this command.
- @item hold-trail
- Do not move trail pointer to end of trail when something is recorded
- there.
- @end table
- @kindex Y
- @kindex Y ?
- @vindex calc-Y-help-msgs
- Calc reserves a special prefix key, shift-@kbd{Y}, for user-written
- extensions to Calc. There are no built-in commands that work with
- this prefix key; you must call @code{define-key} from Lisp (probably
- from inside a @code{calc-define} property) to add to it. Initially only
- @kbd{Y ?} is defined; it takes help messages from a list of strings
- (initially @code{nil}) in the variable @code{calc-Y-help-msgs}. All
- other undefined keys except for @kbd{Y} are reserved for use by
- future versions of Calc.
- If you are writing a Calc enhancement which you expect to give to
- others, it is best to minimize the number of @kbd{Y}-key sequences
- you use. In fact, if you have more than one key sequence you should
- consider defining three-key sequences with a @kbd{Y}, then a key that
- stands for your package, then a third key for the particular command
- within your package.
- Users may wish to install several Calc enhancements, and it is possible
- that several enhancements will choose to use the same key. In the
- example below, a variable @code{inc-prec-base-key} has been defined
- to contain the key that identifies the @code{inc-prec} package. Its
- value is initially @code{"P"}, but a user can change this variable
- if necessary without having to modify the file.
- Here is a complete file, @file{inc-prec.el}, which makes a @kbd{Y P I}
- command that increases the precision, and a @kbd{Y P D} command that
- decreases the precision.
- @smallexample
- ;;; Increase and decrease Calc precision. Dave Gillespie, 5/31/91.
- ;;; (Include copyright or copyleft stuff here.)
- (defvar inc-prec-base-key "P"
- "Base key for inc-prec.el commands.")
- (put 'calc-define 'inc-prec '(progn
- (define-key calc-mode-map (format "Y%sI" inc-prec-base-key)
- 'increase-precision)
- (define-key calc-mode-map (format "Y%sD" inc-prec-base-key)
- 'decrease-precision)
- (setq calc-Y-help-msgs
- (cons (format "%s + Inc-prec, Dec-prec" inc-prec-base-key)
- calc-Y-help-msgs))
- (defmath increase-precision (delta)
- "Increase precision by DELTA."
- (interactive "p")
- (setq calc-internal-prec (+ calc-internal-prec delta)))
- (defmath decrease-precision (delta)
- "Decrease precision by DELTA."
- (interactive "p")
- (setq calc-internal-prec (- calc-internal-prec delta)))
- )) ; end of calc-define property
- (run-hooks 'calc-check-defines)
- @end smallexample
- @node Defining Stack Commands, Argument Qualifiers, Defining Simple Commands, Lisp Definitions
- @subsection Defining New Stack-Based Commands
- @noindent
- To define a new computational command which takes and/or leaves arguments
- on the stack, a special form of @code{interactive} clause is used.
- @example
- (interactive @var{num} @var{tag})
- @end example
- @noindent
- where @var{num} is an integer, and @var{tag} is a string. The effect is
- to pop @var{num} values off the stack, resimplify them by calling
- @code{calc-normalize}, and hand them to your function according to the
- function's argument list. Your function may include @code{&optional} and
- @code{&rest} parameters, so long as calling the function with @var{num}
- parameters is legal.
- Your function must return either a number or a formula in a form
- acceptable to Calc, or a list of such numbers or formulas. These value(s)
- are pushed onto the stack when the function completes. They are also
- recorded in the Calc Trail buffer on a line beginning with @var{tag},
- a string of (normally) four characters or less. If you omit @var{tag}
- or use @code{nil} as a tag, the result is not recorded in the trail.
- As an example, the definition
- @smallexample
- (defmath myfact (n)
- "Compute the factorial of the integer at the top of the stack."
- (interactive 1 "fact")
- (if (> n 0)
- (* n (myfact (1- n)))
- (and (= n 0) 1)))
- @end smallexample
- @noindent
- is a version of the factorial function shown previously which can be used
- as a command as well as an algebraic function. It expands to
- @smallexample
- (defun calc-myfact ()
- "Compute the factorial of the integer at the top of the stack."
- (interactive)
- (calc-slow-wrapper
- (calc-enter-result 1 "fact"
- (cons 'calcFunc-myfact (calc-top-list-n 1)))))
- (defun calcFunc-myfact (n)
- "Compute the factorial of the integer at the top of the stack."
- (if (math-posp n)
- (math-mul n (calcFunc-myfact (math-add n -1)))
- (and (math-zerop n) 1)))
- @end smallexample
- @findex calc-slow-wrapper
- The @code{calc-slow-wrapper} function is a version of @code{calc-wrapper}
- that automatically puts up a @samp{Working...} message before the
- computation begins. (This message can be turned off by the user
- with an @kbd{m w} (@code{calc-working}) command.)
- @findex calc-top-list-n
- The @code{calc-top-list-n} function returns a list of the specified number
- of values from the top of the stack. It resimplifies each value by
- calling @code{calc-normalize}. If its argument is zero it returns an
- empty list. It does not actually remove these values from the stack.
- @findex calc-enter-result
- The @code{calc-enter-result} function takes an integer @var{num} and string
- @var{tag} as described above, plus a third argument which is either a
- Calculator data object or a list of such objects. These objects are
- resimplified and pushed onto the stack after popping the specified number
- of values from the stack. If @var{tag} is non-@code{nil}, the values
- being pushed are also recorded in the trail.
- Note that if @code{calcFunc-myfact} returns @code{nil} this represents
- ``leave the function in symbolic form.'' To return an actual empty list,
- in the sense that @code{calc-enter-result} will push zero elements back
- onto the stack, you should return the special value @samp{'(nil)}, a list
- containing the single symbol @code{nil}.
- The @code{interactive} declaration can actually contain a limited
- Emacs-style code string as well which comes just before @var{num} and
- @var{tag}. Currently the only Emacs code supported is @samp{"p"}, as in
- @example
- (defmath foo (a b &optional c)
- (interactive "p" 2 "foo")
- @var{body})
- @end example
- In this example, the command @code{calc-foo} will evaluate the expression
- @samp{foo(a,b)} if executed with no argument, or @samp{foo(a,b,n)} if
- executed with a numeric prefix argument of @cite{n}.
- The other code string allowed is @samp{"m"} (unrelated to the usual @samp{"m"}
- code as used with @code{defun}). It uses the numeric prefix argument as the
- number of objects to remove from the stack and pass to the function.
- In this case, the integer @var{num} serves as a default number of
- arguments to be used when no prefix is supplied.
- @node Argument Qualifiers, Example Definitions, Defining Stack Commands, Lisp Definitions
- @subsection Argument Qualifiers
- @noindent
- Anywhere a parameter name can appear in the parameter list you can also use
- an @dfn{argument qualifier}. Thus the general form of a definition is:
- @example
- (defmath @var{name} (@var{param} @var{param...}
- &optional @var{param} @var{param...}
- &rest @var{param})
- @var{body})
- @end example
- @noindent
- where each @var{param} is either a symbol or a list of the form
- @example
- (@var{qual} @var{param})
- @end example
- The following qualifiers are recognized:
- @table @samp
- @item complete
- @findex complete
- The argument must not be an incomplete vector, interval, or complex number.
- (This is rarely needed since the Calculator itself will never call your
- function with an incomplete argument. But there is nothing stopping your
- own Lisp code from calling your function with an incomplete argument.)@refill
- @item integer
- @findex integer
- The argument must be an integer. If it is an integer-valued float
- it will be accepted but converted to integer form. Non-integers and
- formulas are rejected.
- @item natnum
- @findex natnum
- Like @samp{integer}, but the argument must be non-negative.
- @item fixnum
- @findex fixnum
- Like @samp{integer}, but the argument must fit into a native Lisp integer,
- which on most systems means less than 2^23 in absolute value. The
- argument is converted into Lisp-integer form if necessary.
- @item float
- @findex float
- The argument is converted to floating-point format if it is a number or
- vector. If it is a formula it is left alone. (The argument is never
- actually rejected by this qualifier.)
- @item @var{pred}
- The argument must satisfy predicate @var{pred}, which is one of the
- standard Calculator predicates. @xref{Predicates}.
- @item not-@var{pred}
- The argument must @emph{not} satisfy predicate @var{pred}.
- @end table
- For example,
- @example
- (defmath foo (a (constp (not-matrixp b)) &optional (float c)
- &rest (integer d))
- @var{body})
- @end example
- @noindent
- expands to
- @example
- (defun calcFunc-foo (a b &optional c &rest d)
- (and (math-matrixp b)
- (math-reject-arg b 'not-matrixp))
- (or (math-constp b)
- (math-reject-arg b 'constp))
- (and c (setq c (math-check-float c)))
- (setq d (mapcar 'math-check-integer d))
- @var{body})
- @end example
- @noindent
- which performs the necessary checks and conversions before executing the
- body of the function.
- @node Example Definitions, Calling Calc from Your Programs, Argument Qualifiers, Lisp Definitions
- @subsection Example Definitions
- @noindent
- This section includes some Lisp programming examples on a larger scale.
- These programs make use of some of the Calculator's internal functions;
- @pxref{Internals}.
- @menu
- * Bit Counting Example::
- * Sine Example::
- @end menu
- @node Bit Counting Example, Sine Example, Example Definitions, Example Definitions
- @subsubsection Bit-Counting
- @noindent
- @ignore
- @starindex
- @end ignore
- @tindex bcount
- Calc does not include a built-in function for counting the number of
- ``one'' bits in a binary integer. It's easy to invent one using @kbd{b u}
- to convert the integer to a set, and @kbd{V #} to count the elements of
- that set; let's write a function that counts the bits without having to
- create an intermediate set.
- @smallexample
- (defmath bcount ((natnum n))
- (interactive 1 "bcnt")
- (let ((count 0))
- (while (> n 0)
- (if (oddp n)
- (setq count (1+ count)))
- (setq n (lsh n -1)))
- count))
- @end smallexample
- @noindent
- When this is expanded by @code{defmath}, it will become the following
- Emacs Lisp function:
- @smallexample
- (defun calcFunc-bcount (n)
- (setq n (math-check-natnum n))
- (let ((count 0))
- (while (math-posp n)
- (if (math-oddp n)
- (setq count (math-add count 1)))
- (setq n (calcFunc-lsh n -1)))
- count))
- @end smallexample
- If the input numbers are large, this function involves a fair amount
- of arithmetic. A binary right shift is essentially a division by two;
- recall that Calc stores integers in decimal form so bit shifts must
- involve actual division.
- To gain a bit more efficiency, we could divide the integer into
- @var{n}-bit chunks, each of which can be handled quickly because
- they fit into Lisp integers. It turns out that Calc's arithmetic
- routines are especially fast when dividing by an integer less than
- 1000, so we can set @var{n = 9} bits and use repeated division by 512:
- @smallexample
- (defmath bcount ((natnum n))
- (interactive 1 "bcnt")
- (let ((count 0))
- (while (not (fixnump n))
- (let ((qr (idivmod n 512)))
- (setq count (+ count (bcount-fixnum (cdr qr)))
- n (car qr))))
- (+ count (bcount-fixnum n))))
- (defun bcount-fixnum (n)
- (let ((count 0))
- (while (> n 0)
- (setq count (+ count (logand n 1))
- n (lsh n -1)))
- count))
- @end smallexample
- @noindent
- Note that the second function uses @code{defun}, not @code{defmath}.
- Because this function deals only with native Lisp integers (``fixnums''),
- it can use the actual Emacs @code{+} and related functions rather
- than the slower but more general Calc equivalents which @code{defmath}
- uses.
- The @code{idivmod} function does an integer division, returning both
- the quotient and the remainder at once. Again, note that while it
- might seem that @samp{(logand n 511)} and @samp{(lsh n -9)} are
- more efficient ways to split off the bottom nine bits of @code{n},
- actually they are less efficient because each operation is really
- a division by 512 in disguise; @code{idivmod} allows us to do the
- same thing with a single division by 512.
- @node Sine Example, , Bit Counting Example, Example Definitions
- @subsubsection The Sine Function
- @noindent
- @ignore
- @starindex
- @end ignore
- @tindex mysin
- A somewhat limited sine function could be defined as follows, using the
- well-known Taylor series expansion for @c{$\sin x$}
- @samp{sin(x)}:
- @smallexample
- (defmath mysin ((float (anglep x)))
- (interactive 1 "mysn")
- (setq x (to-radians x)) ; Convert from current angular mode.
- (let ((sum x) ; Initial term of Taylor expansion of sin.
- newsum
- (nfact 1) ; "nfact" equals "n" factorial at all times.
- (xnegsqr :"-(x^2)")) ; "xnegsqr" equals -x^2.
- (for ((n 3 100 2)) ; Upper limit of 100 is a good precaution.
- (working "mysin" sum) ; Display "Working" message, if enabled.
- (setq nfact (* nfact (1- n) n)
- x (* x xnegsqr)
- newsum (+ sum (/ x nfact)))
- (if (~= newsum sum) ; If newsum is "nearly equal to" sum,
- (break)) ; then we are done.
- (setq sum newsum))
- sum))
- @end smallexample
- The actual @code{sin} function in Calc works by first reducing the problem
- to a sine or cosine of a nonnegative number less than @c{$\pi \over 4$}
- @cite{pi/4}. This
- ensures that the Taylor series will converge quickly. Also, the calculation
- is carried out with two extra digits of precision to guard against cumulative
- round-off in @samp{sum}. Finally, complex arguments are allowed and handled
- by a separate algorithm.
- @smallexample
- (defmath mysin ((float (scalarp x)))
- (interactive 1 "mysn")
- (setq x (to-radians x)) ; Convert from current angular mode.
- (with-extra-prec 2 ; Evaluate with extra precision.
- (cond ((complexp x)
- (mysin-complex x))
- ((< x 0)
- (- (mysin-raw (- x))) ; Always call mysin-raw with x >= 0.
- (t (mysin-raw x))))))
- (defmath mysin-raw (x)
- (cond ((>= x 7)
- (mysin-raw (% x (two-pi)))) ; Now x < 7.
- ((> x (pi-over-2))
- (- (mysin-raw (- x (pi))))) ; Now -pi/2 <= x <= pi/2.
- ((> x (pi-over-4))
- (mycos-raw (- x (pi-over-2)))) ; Now -pi/2 <= x <= pi/4.
- ((< x (- (pi-over-4)))
- (- (mycos-raw (+ x (pi-over-2))))) ; Now -pi/4 <= x <= pi/4,
- (t (mysin-series x)))) ; so the series will be efficient.
- @end smallexample
- @noindent
- where @code{mysin-complex} is an appropriate function to handle complex
- numbers, @code{mysin-series} is the routine to compute the sine Taylor
- series as before, and @code{mycos-raw} is a function analogous to
- @code{mysin-raw} for cosines.
- The strategy is to ensure that @cite{x} is nonnegative before calling
- @code{mysin-raw}. This function then recursively reduces its argument
- to a suitable range, namely, plus-or-minus @c{$\pi \over 4$}
- @cite{pi/4}. Note that each
- test, and particularly the first comparison against 7, is designed so
- that small roundoff errors cannnot produce an infinite loop. (Suppose
- we compared with @samp{(two-pi)} instead; if due to roundoff problems
- the modulo operator ever returned @samp{(two-pi)} exactly, an infinite
- recursion could result!) We use modulo only for arguments that will
- clearly get reduced, knowing that the next rule will catch any reductions
- that this rule misses.
- If a program is being written for general use, it is important to code
- it carefully as shown in this second example. For quick-and-dirty programs,
- when you know that your own use of the sine function will never encounter
- a large argument, a simpler program like the first one shown is fine.
- @node Calling Calc from Your Programs, Internals, Example Definitions, Lisp Definitions
- @subsection Calling Calc from Your Lisp Programs
- @noindent
- A later section (@pxref{Internals}) gives a full description of
- Calc's internal Lisp functions. It's not hard to call Calc from
- inside your programs, but the number of these functions can be daunting.
- So Calc provides one special ``programmer-friendly'' function called
- @code{calc-eval} that can be made to do just about everything you
- need. It's not as fast as the low-level Calc functions, but it's
- much simpler to use!
- It may seem that @code{calc-eval} itself has a daunting number of
- options, but they all stem from one simple operation.
- In its simplest manifestation, @samp{(calc-eval "1+2")} parses the
- string @code{"1+2"} as if it were a Calc algebraic entry and returns
- the result formatted as a string: @code{"3"}.
- Since @code{calc-eval} is on the list of recommended @code{autoload}
- functions, you don't need to make any special preparations to load
- Calc before calling @code{calc-eval} the first time. Calc will be
- loaded and initialized for you.
- All the Calc modes that are currently in effect will be used when
- evaluating the expression and formatting the result.
- @ifinfo
- @example
- @end example
- @end ifinfo
- @subsubsection Additional Arguments to @code{calc-eval}
- @noindent
- If the input string parses to a list of expressions, Calc returns
- the results separated by @code{", "}. You can specify a different
- separator by giving a second string argument to @code{calc-eval}:
- @samp{(calc-eval "1+2,3+4" ";")} returns @code{"3;7"}.
- The ``separator'' can also be any of several Lisp symbols which
- request other behaviors from @code{calc-eval}. These are discussed
- one by one below.
- You can give additional arguments to be substituted for
- @samp{$}, @samp{$$}, and so on in the main expression. For
- example, @samp{(calc-eval "$/$$" nil "7" "1+1")} evaluates the
- expression @code{"7/(1+1)"} to yield the result @code{"3.5"}
- (assuming Fraction mode is not in effect). Note the @code{nil}
- used as a placeholder for the item-separator argument.
- @ifinfo
- @example
- @end example
- @end ifinfo
- @subsubsection Error Handling
- @noindent
- If @code{calc-eval} encounters an error, it returns a list containing
- the character position of the error, plus a suitable message as a
- string. Note that @samp{1 / 0} is @emph{not} an error by Calc's
- standards; it simply returns the string @code{"1 / 0"} which is the
- division left in symbolic form. But @samp{(calc-eval "1/")} will
- return the list @samp{(2 "Expected a number")}.
- If you bind the variable @code{calc-eval-error} to @code{t}
- using a @code{let} form surrounding the call to @code{calc-eval},
- errors instead call the Emacs @code{error} function which aborts
- to the Emacs command loop with a beep and an error message.
- If you bind this variable to the symbol @code{string}, error messages
- are returned as strings instead of lists. The character position is
- ignored.
- As a courtesy to other Lisp code which may be using Calc, be sure
- to bind @code{calc-eval-error} using @code{let} rather than changing
- it permanently with @code{setq}.
- @ifinfo
- @example
- @end example
- @end ifinfo
- @subsubsection Numbers Only
- @noindent
- Sometimes it is preferable to treat @samp{1 / 0} as an error
- rather than returning a symbolic result. If you pass the symbol
- @code{num} as the second argument to @code{calc-eval}, results
- that are not constants are treated as errors. The error message
- reported is the first @code{calc-why} message if there is one,
- or otherwise ``Number expected.''
- A result is ``constant'' if it is a number, vector, or other
- object that does not include variables or function calls. If it
- is a vector, the components must themselves be constants.
- @ifinfo
- @example
- @end example
- @end ifinfo
- @subsubsection Default Modes
- @noindent
- If the first argument to @code{calc-eval} is a list whose first
- element is a formula string, then @code{calc-eval} sets all the
- various Calc modes to their default values while the formula is
- evaluated and formatted. For example, the precision is set to 12
- digits, digit grouping is turned off, and the normal language
- mode is used.
- This same principle applies to the other options discussed below.
- If the first argument would normally be @var{x}, then it can also
- be the list @samp{(@var{x})} to use the default mode settings.
- If there are other elements in the list, they are taken as
- variable-name/value pairs which override the default mode
- settings. Look at the documentation at the front of the
- @file{calc.el} file to find the names of the Lisp variables for
- the various modes. The mode settings are restored to their
- original values when @code{calc-eval} is done.
- For example, @samp{(calc-eval '("$+$$" calc-internal-prec 8) 'num a b)}
- computes the sum of two numbers, requiring a numeric result, and
- using default mode settings except that the precision is 8 instead
- of the default of 12.
- It's usually best to use this form of @code{calc-eval} unless your
- program actually considers the interaction with Calc's mode settings
- to be a feature. This will avoid all sorts of potential ``gotchas'';
- consider what happens with @samp{(calc-eval "sqrt(2)" 'num)}
- when the user has left Calc in symbolic mode or no-simplify mode.
- As another example, @samp{(equal (calc-eval '("$<$$") nil a b) "1")}
- checks if the number in string @cite{a} is less than the one in
- string @cite{b}. Without using a list, the integer 1 might
- come out in a variety of formats which would be hard to test for
- conveniently: @code{"1"}, @code{"8#1"}, @code{"00001"}. (But
- see ``Predicates'' mode, below.)
- @ifinfo
- @example
- @end example
- @end ifinfo
- @subsubsection Raw Numbers
- @noindent
- Normally all input and output for @code{calc-eval} is done with strings.
- You can do arithmetic with, say, @samp{(calc-eval "$+$$" nil a b)}
- in place of @samp{(+ a b)}, but this is very inefficient since the
- numbers must be converted to and from string format as they are passed
- from one @code{calc-eval} to the next.
- If the separator is the symbol @code{raw}, the result will be returned
- as a raw Calc data structure rather than a string. You can read about
- how these objects look in the following sections, but usually you can
- treat them as ``black box'' objects with no important internal
- structure.
- There is also a @code{rawnum} symbol, which is a combination of
- @code{raw} (returning a raw Calc object) and @code{num} (signalling
- an error if that object is not a constant).
- You can pass a raw Calc object to @code{calc-eval} in place of a
- string, either as the formula itself or as one of the @samp{$}
- arguments. Thus @samp{(calc-eval "$+$$" 'raw a b)} is an
- addition function that operates on raw Calc objects. Of course
- in this case it would be easier to call the low-level @code{math-add}
- function in Calc, if you can remember its name.
- In particular, note that a plain Lisp integer is acceptable to Calc
- as a raw object. (All Lisp integers are accepted on input, but
- integers of more than six decimal digits are converted to ``big-integer''
- form for output. @xref{Data Type Formats}.)
- When it comes time to display the object, just use @samp{(calc-eval a)}
- to format it as a string.
- It is an error if the input expression evaluates to a list of
- values. The separator symbol @code{list} is like @code{raw}
- except that it returns a list of one or more raw Calc objects.
- Note that a Lisp string is not a valid Calc object, nor is a list
- containing a string. Thus you can still safely distinguish all the
- various kinds of error returns discussed above.
- @ifinfo
- @example
- @end example
- @end ifinfo
- @subsubsection Predicates
- @noindent
- If the separator symbol is @code{pred}, the result of the formula is
- treated as a true/false value; @code{calc-eval} returns @code{t} or
- @code{nil}, respectively. A value is considered ``true'' if it is a
- non-zero number, or false if it is zero or if it is not a number.
- For example, @samp{(calc-eval "$<$$" 'pred a b)} tests whether
- one value is less than another.
- As usual, it is also possible for @code{calc-eval} to return one of
- the error indicators described above. Lisp will interpret such an
- indicator as ``true'' if you don't check for it explicitly. If you
- wish to have an error register as ``false'', use something like
- @samp{(eq (calc-eval ...) t)}.
- @ifinfo
- @example
- @end example
- @end ifinfo
- @subsubsection Variable Values
- @noindent
- Variables in the formula passed to @code{calc-eval} are not normally
- replaced by their values. If you wish this, you can use the
- @code{evalv} function (@pxref{Algebraic Manipulation}). For example,
- if 4 is stored in Calc variable @code{a} (i.e., in Lisp variable
- @code{var-a}), then @samp{(calc-eval "a+pi")} will return the
- formula @code{"a + pi"}, but @samp{(calc-eval "evalv(a+pi)")}
- will return @code{"7.14159265359"}.
- To store in a Calc variable, just use @code{setq} to store in the
- corresponding Lisp variable. (This is obtained by prepending
- @samp{var-} to the Calc variable name.) Calc routines will
- understand either string or raw form values stored in variables,
- although raw data objects are much more efficient. For example,
- to increment the Calc variable @code{a}:
- @example
- (setq var-a (calc-eval "evalv(a+1)" 'raw))
- @end example
- @ifinfo
- @example
- @end example
- @end ifinfo
- @subsubsection Stack Access
- @noindent
- If the separator symbol is @code{push}, the formula argument is
- evaluated (with possible @samp{$} expansions, as usual). The
- result is pushed onto the Calc stack. The return value is @code{nil}
- (unless there is an error from evaluating the formula, in which
- case the return value depends on @code{calc-eval-error} in the
- usual way).
- If the separator symbol is @code{pop}, the first argument to
- @code{calc-eval} must be an integer instead of a string. That
- many values are popped from the stack and thrown away. A negative
- argument deletes the entry at that stack level. The return value
- is the number of elements remaining in the stack after popping;
- @samp{(calc-eval 0 'pop)} is a good way to measure the size of
- the stack.
- If the separator symbol is @code{top}, the first argument to
- @code{calc-eval} must again be an integer. The value at that
- stack level is formatted as a string and returned. Thus
- @samp{(calc-eval 1 'top)} returns the top-of-stack value. If the
- integer is out of range, @code{nil} is returned.
- The separator symbol @code{rawtop} is just like @code{top} except
- that the stack entry is returned as a raw Calc object instead of
- as a string.
- In all of these cases the first argument can be made a list in
- order to force the default mode settings, as described above.
- Thus @samp{(calc-eval '(2 calc-number-radix 16) 'top)} returns the
- second-to-top stack entry, formatted as a string using the default
- instead of current display modes, except that the radix is
- hexadecimal instead of decimal.
- It is, of course, polite to put the Calc stack back the way you
- found it when you are done, unless the user of your program is
- actually expecting it to affect the stack.
- Note that you do not actually have to switch into the @samp{*Calculator*}
- buffer in order to use @code{calc-eval}; it temporarily switches into
- the stack buffer if necessary.
- @ifinfo
- @example
- @end example
- @end ifinfo
- @subsubsection Keyboard Macros
- @noindent
- If the separator symbol is @code{macro}, the first argument must be a
- string of characters which Calc can execute as a sequence of keystrokes.
- This switches into the Calc buffer for the duration of the macro.
- For example, @samp{(calc-eval "vx5\rVR+" 'macro)} pushes the
- vector @samp{[1,2,3,4,5]} on the stack and then replaces it
- with the sum of those numbers. Note that @samp{\r} is the Lisp
- notation for the carriage-return, @key{RET}, character.
- If your keyboard macro wishes to pop the stack, @samp{\C-d} is
- safer than @samp{\177} (the @key{DEL} character) because some
- installations may have switched the meanings of @key{DEL} and
- @kbd{C-h}. Calc always interprets @kbd{C-d} as a synonym for
- ``pop-stack'' regardless of key mapping.
- If you provide a third argument to @code{calc-eval}, evaluation
- of the keyboard macro will leave a record in the Trail using
- that argument as a tag string. Normally the Trail is unaffected.
- The return value in this case is always @code{nil}.
- @ifinfo
- @example
- @end example
- @end ifinfo
- @subsubsection Lisp Evaluation
- @noindent
- Finally, if the separator symbol is @code{eval}, then the Lisp
- @code{eval} function is called on the first argument, which must
- be a Lisp expression rather than a Calc formula. Remember to
- quote the expression so that it is not evaluated until inside
- @code{calc-eval}.
- The difference from plain @code{eval} is that @code{calc-eval}
- switches to the Calc buffer before evaluating the expression.
- For example, @samp{(calc-eval '(setq calc-internal-prec 17) 'eval)}
- will correctly affect the buffer-local Calc precision variable.
- An alternative would be @samp{(calc-eval '(calc-precision 17) 'eval)}.
- This is evaluating a call to the function that is normally invoked
- by the @kbd{p} key, giving it 17 as its ``numeric prefix argument.''
- Note that this function will leave a message in the echo area as
- a side effect. Also, all Calc functions switch to the Calc buffer
- automatically if not invoked from there, so the above call is
- also equivalent to @samp{(calc-precision 17)} by itself.
- In all cases, Calc uses @code{save-excursion} to switch back to
- your original buffer when it is done.
- As usual the first argument can be a list that begins with a Lisp
- expression to use default instead of current mode settings.
- The result of @code{calc-eval} in this usage is just the result
- returned by the evaluated Lisp expression.
- @ifinfo
- @example
- @end example
- @end ifinfo
- @subsubsection Example
- @noindent
- @findex convert-temp
- Here is a sample Emacs command that uses @code{calc-eval}. Suppose
- you have a document with lots of references to temperatures on the
- Fahrenheit scale, say ``98.6 F'', and you wish to convert these
- references to Centigrade. The following command does this conversion.
- Place the Emacs cursor right after the letter ``F'' and invoke the
- command to change ``98.6 F'' to ``37 C''. Or, if the temperature is
- already in Centigrade form, the command changes it back to Fahrenheit.
- @example
- (defun convert-temp ()
- (interactive)
- (save-excursion
- (re-search-backward "[^-.0-9]\\([-.0-9]+\\) *\\([FC]\\)")
- (let* ((top1 (match-beginning 1))
- (bot1 (match-end 1))
- (number (buffer-substring top1 bot1))
- (top2 (match-beginning 2))
- (bot2 (match-end 2))
- (type (buffer-substring top2 bot2)))
- (if (equal type "F")
- (setq type "C"
- number (calc-eval "($ - 32)*5/9" nil number))
- (setq type "F"
- number (calc-eval "$*9/5 + 32" nil number)))
- (goto-char top2)
- (delete-region top2 bot2)
- (insert-before-markers type)
- (goto-char top1)
- (delete-region top1 bot1)
- (if (string-match "\\.$" number) ; change "37." to "37"
- (setq number (substring number 0 -1)))
- (insert number))))
- @end example
- Note the use of @code{insert-before-markers} when changing between
- ``F'' and ``C'', so that the character winds up before the cursor
- instead of after it.
- @node Internals, , Calling Calc from Your Programs, Lisp Definitions
- @subsection Calculator Internals
- @noindent
- This section describes the Lisp functions defined by the Calculator that
- may be of use to user-written Calculator programs (as described in the
- rest of this chapter). These functions are shown by their names as they
- conventionally appear in @code{defmath}. Their full Lisp names are
- generally gotten by prepending @samp{calcFunc-} or @samp{math-} to their
- apparent names. (Names that begin with @samp{calc-} are already in
- their full Lisp form.) You can use the actual full names instead if you
- prefer them, or if you are calling these functions from regular Lisp.
- The functions described here are scattered throughout the various
- Calc component files. Note that @file{calc.el} includes @code{autoload}s
- for only a few component files; when Calc wants to call an advanced
- function it calls @samp{(calc-extensions)} first; this function
- autoloads @file{calc-ext.el}, which in turn autoloads all the functions
- in the remaining component files.
- Because @code{defmath} itself uses the extensions, user-written code
- generally always executes with the extensions already loaded, so
- normally you can use any Calc function and be confident that it will
- be autoloaded for you when necessary. If you are doing something
- special, check carefully to make sure each function you are using is
- from @file{calc.el} or its components, and call @samp{(calc-extensions)}
- before using any function based in @file{calc-ext.el} if you can't
- prove this file will already be loaded.
- @menu
- * Data Type Formats::
- * Interactive Lisp Functions::
- * Stack Lisp Functions::
- * Predicates::
- * Computational Lisp Functions::
- * Vector Lisp Functions::
- * Symbolic Lisp Functions::
- * Formatting Lisp Functions::
- * Hooks::
- @end menu
- @node Data Type Formats, Interactive Lisp Functions, Internals, Internals
- @subsubsection Data Type Formats
- @noindent
- Integers are stored in either of two ways, depending on their magnitude.
- Integers less than one million in absolute value are stored as standard
- Lisp integers. This is the only storage format for Calc data objects
- which is not a Lisp list.
- Large integers are stored as lists of the form @samp{(bigpos @var{d0}
- @var{d1} @var{d2} @dots{})} for positive integers 1000000 or more, or
- @samp{(bigneg @var{d0} @var{d1} @var{d2} @dots{})} for negative integers
- @i{-1000000} or less. Each @var{d} is a base-1000 ``digit,'' a Lisp integer
- from 0 to 999. The least significant digit is @var{d0}; the last digit,
- @var{dn}, which is always nonzero, is the most significant digit. For
- example, the integer @i{-12345678} is stored as @samp{(bigneg 678 345 12)}.
- The distinction between small and large integers is entirely hidden from
- the user. In @code{defmath} definitions, the Lisp predicate @code{integerp}
- returns true for either kind of integer, and in general both big and small
- integers are accepted anywhere the word ``integer'' is used in this manual.
- If the distinction must be made, native Lisp integers are called @dfn{fixnums}
- and large integers are called @dfn{bignums}.
- Fractions are stored as a list of the form, @samp{(frac @var{n} @var{d})}
- where @var{n} is an integer (big or small) numerator, @var{d} is an
- integer denominator greater than one, and @var{n} and @var{d} are relatively
- prime. Note that fractions where @var{d} is one are automatically converted
- to plain integers by all math routines; fractions where @var{d} is negative
- are normalized by negating the numerator and denominator.
- Floating-point numbers are stored in the form, @samp{(float @var{mant}
- @var{exp})}, where @var{mant} (the ``mantissa'') is an integer less than
- @samp{10^@var{p}} in absolute value (@var{p} represents the current
- precision), and @var{exp} (the ``exponent'') is a fixnum. The value of
- the float is @samp{@var{mant} * 10^@var{exp}}. For example, the number
- @i{-3.14} is stored as @samp{(float -314 -2) = -314*10^-2}. Other constraints
- are that the number 0.0 is always stored as @samp{(float 0 0)}, and,
- except for the 0.0 case, the rightmost base-10 digit of @var{mant} is
- always nonzero. (If the rightmost digit is zero, the number is
- rearranged by dividing @var{mant} by ten and incrementing @var{exp}.)@refill
- Rectangular complex numbers are stored in the form @samp{(cplx @var{re}
- @var{im})}, where @var{re} and @var{im} are each real numbers, either
- integers, fractions, or floats. The value is @samp{@var{re} + @var{im}i}.
- The @var{im} part is nonzero; complex numbers with zero imaginary
- components are converted to real numbers automatically.@refill
- Polar complex numbers are stored in the form @samp{(polar @var{r}
- @var{theta})}, where @var{r} is a positive real value and @var{theta}
- is a real value or HMS form representing an angle. This angle is
- usually normalized to lie in the interval @samp{(-180 ..@: 180)} degrees,
- or @samp{(-pi ..@: pi)} radians, according to the current angular mode.
- If the angle is 0 the value is converted to a real number automatically.
- (If the angle is 180 degrees, the value is usually also converted to a
- negative real number.)@refill
- Hours-minutes-seconds forms are stored as @samp{(hms @var{h} @var{m}
- @var{s})}, where @var{h} is an integer or an integer-valued float (i.e.,
- a float with @samp{@var{exp} >= 0}), @var{m} is an integer or integer-valued
- float in the range @w{@samp{[0 ..@: 60)}}, and @var{s} is any real number
- in the range @samp{[0 ..@: 60)}.@refill
- Date forms are stored as @samp{(date @var{n})}, where @var{n} is
- a real number that counts days since midnight on the morning of
- January 1, 1 AD. If @var{n} is an integer, this is a pure date
- form. If @var{n} is a fraction or float, this is a date/time form.
- Modulo forms are stored as @samp{(mod @var{n} @var{m})}, where @var{m} is a
- positive real number or HMS form, and @var{n} is a real number or HMS
- form in the range @samp{[0 ..@: @var{m})}.
- Error forms are stored as @samp{(sdev @var{x} @var{sigma})}, where @var{x}
- is the mean value and @var{sigma} is the standard deviation. Each
- component is either a number, an HMS form, or a symbolic object
- (a variable or function call). If @var{sigma} is zero, the value is
- converted to a plain real number. If @var{sigma} is negative or
- complex, it is automatically normalized to be a positive real.
- Interval forms are stored as @samp{(intv @var{mask} @var{lo} @var{hi})},
- where @var{mask} is one of the integers 0, 1, 2, or 3, and @var{lo} and
- @var{hi} are real numbers, HMS forms, or symbolic objects. The @var{mask}
- is a binary integer where 1 represents the fact that the interval is
- closed on the high end, and 2 represents the fact that it is closed on
- the low end. (Thus 3 represents a fully closed interval.) The interval
- @w{@samp{(intv 3 @var{x} @var{x})}} is converted to the plain number @var{x};
- intervals @samp{(intv @var{mask} @var{x} @var{x})} for any other @var{mask}
- represent empty intervals. If @var{hi} is less than @var{lo}, the interval
- is converted to a standard empty interval by replacing @var{hi} with @var{lo}.
- Vectors are stored as @samp{(vec @var{v1} @var{v2} @dots{})}, where @var{v1}
- is the first element of the vector, @var{v2} is the second, and so on.
- An empty vector is stored as @samp{(vec)}. A matrix is simply a vector
- where all @var{v}'s are themselves vectors of equal lengths. Note that
- Calc vectors are unrelated to the Emacs Lisp ``vector'' type, which is
- generally unused by Calc data structures.
- Variables are stored as @samp{(var @var{name} @var{sym})}, where
- @var{name} is a Lisp symbol whose print name is used as the visible name
- of the variable, and @var{sym} is a Lisp symbol in which the variable's
- value is actually stored. Thus, @samp{(var pi var-pi)} represents the
- special constant @samp{pi}. Almost always, the form is @samp{(var
- @var{v} var-@var{v})}. If the variable name was entered with @code{#}
- signs (which are converted to hyphens internally), the form is
- @samp{(var @var{u} @var{v})}, where @var{u} is a symbol whose name
- contains @code{#} characters, and @var{v} is a symbol that contains
- @code{-} characters instead. The value of a variable is the Calc
- object stored in its @var{sym} symbol's value cell. If the symbol's
- value cell is void or if it contains @code{nil}, the variable has no
- value. Special constants have the form @samp{(special-const
- @var{value})} stored in their value cell, where @var{value} is a formula
- which is evaluated when the constant's value is requested. Variables
- which represent units are not stored in any special way; they are units
- only because their names appear in the units table. If the value
- cell contains a string, it is parsed to get the variable's value when
- the variable is used.@refill
- A Lisp list with any other symbol as the first element is a function call.
- The symbols @code{+}, @code{-}, @code{*}, @code{/}, @code{%}, @code{^},
- and @code{|} represent special binary operators; these lists are always
- of the form @samp{(@var{op} @var{lhs} @var{rhs})} where @var{lhs} is the
- sub-formula on the lefthand side and @var{rhs} is the sub-formula on the
- right. The symbol @code{neg} represents unary negation; this list is always
- of the form @samp{(neg @var{arg})}. Any other symbol @var{func} represents a
- function that would be displayed in function-call notation; the symbol
- @var{func} is in general always of the form @samp{calcFunc-@var{name}}.
- The function cell of the symbol @var{func} should contain a Lisp function
- for evaluating a call to @var{func}. This function is passed the remaining
- elements of the list (themselves already evaluated) as arguments; such
- functions should return @code{nil} or call @code{reject-arg} to signify
- that they should be left in symbolic form, or they should return a Calc
- object which represents their value, or a list of such objects if they
- wish to return multiple values. (The latter case is allowed only for
- functions which are the outer-level call in an expression whose value is
- about to be pushed on the stack; this feature is considered obsolete
- and is not used by any built-in Calc functions.)@refill
- @node Interactive Lisp Functions, Stack Lisp Functions, Data Type Formats, Internals
- @subsubsection Interactive Functions
- @noindent
- The functions described here are used in implementing interactive Calc
- commands. Note that this list is not exhaustive! If there is an
- existing command that behaves similarly to the one you want to define,
- you may find helpful tricks by checking the source code for that command.
- @defun calc-set-command-flag flag
- Set the command flag @var{flag}. This is generally a Lisp symbol, but
- may in fact be anything. The effect is to add @var{flag} to the list
- stored in the variable @code{calc-command-flags}, unless it is already
- there. @xref{Defining Simple Commands}.
- @end defun
- @defun calc-clear-command-flag flag
- If @var{flag} appears among the list of currently-set command flags,
- remove it from that list.
- @end defun
- @defun calc-record-undo rec
- Add the ``undo record'' @var{rec} to the list of steps to take if the
- current operation should need to be undone. Stack push and pop functions
- automatically call @code{calc-record-undo}, so the kinds of undo records
- you might need to create take the form @samp{(set @var{sym} @var{value})},
- which says that the Lisp variable @var{sym} was changed and had previously
- contained @var{value}; @samp{(store @var{var} @var{value})} which says that
- the Calc variable @var{var} (a string which is the name of the symbol that
- contains the variable's value) was stored and its previous value was
- @var{value} (either a Calc data object, or @code{nil} if the variable was
- previously void); or @samp{(eval @var{undo} @var{redo} @var{args} @dots{})},
- which means that to undo requires calling the function @samp{(@var{undo}
- @var{args} @dots{})} and, if the undo is later redone, calling
- @samp{(@var{redo} @var{args} @dots{})}.@refill
- @end defun
- @defun calc-record-why msg args
- Record the error or warning message @var{msg}, which is normally a string.
- This message will be replayed if the user types @kbd{w} (@code{calc-why});
- if the message string begins with a @samp{*}, it is considered important
- enough to display even if the user doesn't type @kbd{w}. If one or more
- @var{args} are present, the displayed message will be of the form,
- @samp{@var{msg}: @var{arg1}, @var{arg2}, @dots{}}, where the arguments are
- formatted on the assumption that they are either strings or Calc objects of
- some sort. If @var{msg} is a symbol, it is the name of a Calc predicate
- (such as @code{integerp} or @code{numvecp}) which the arguments did not
- satisfy; it is expanded to a suitable string such as ``Expected an
- integer.'' The @code{reject-arg} function calls @code{calc-record-why}
- automatically; @pxref{Predicates}.@refill
- @end defun
- @defun calc-is-inverse
- This predicate returns true if the current command is inverse,
- i.e., if the Inverse (@kbd{I} key) flag was set.
- @end defun
- @defun calc-is-hyperbolic
- This predicate is the analogous function for the @kbd{H} key.
- @end defun
- @node Stack Lisp Functions, Predicates, Interactive Lisp Functions, Internals
- @subsubsection Stack-Oriented Functions
- @noindent
- The functions described here perform various operations on the Calc
- stack and trail. They are to be used in interactive Calc commands.
- @defun calc-push-list vals n
- Push the Calc objects in list @var{vals} onto the stack at stack level
- @var{n}. If @var{n} is omitted it defaults to 1, so that the elements
- are pushed at the top of the stack. If @var{n} is greater than 1, the
- elements will be inserted into the stack so that the last element will
- end up at level @var{n}, the next-to-last at level @var{n}+1, etc.
- The elements of @var{vals} are assumed to be valid Calc objects, and
- are not evaluated, rounded, or renormalized in any way. If @var{vals}
- is an empty list, nothing happens.@refill
- The stack elements are pushed without any sub-formula selections.
- You can give an optional third argument to this function, which must
- be a list the same size as @var{vals} of selections. Each selection
- must be @code{eq} to some sub-formula of the corresponding formula
- in @var{vals}, or @code{nil} if that formula should have no selection.
- @end defun
- @defun calc-top-list n m
- Return a list of the @var{n} objects starting at level @var{m} of the
- stack. If @var{m} is omitted it defaults to 1, so that the elements are
- taken from the top of the stack. If @var{n} is omitted, it also
- defaults to 1, so that the top stack element (in the form of a
- one-element list) is returned. If @var{m} is greater than 1, the
- @var{m}th stack element will be at the end of the list, the @var{m}+1st
- element will be next-to-last, etc. If @var{n} or @var{m} are out of
- range, the command is aborted with a suitable error message. If @var{n}
- is zero, the function returns an empty list. The stack elements are not
- evaluated, rounded, or renormalized.@refill
- If any stack elements contain selections, and selections have not
- been disabled by the @kbd{j e} (@code{calc-enable-selections}) command,
- this function returns the selected portions rather than the entire
- stack elements. It can be given a third ``selection-mode'' argument
- which selects other behaviors. If it is the symbol @code{t}, then
- a selection in any of the requested stack elements produces an
- ``illegal operation on selections'' error. If it is the symbol @code{full},
- the whole stack entry is always returned regardless of selections.
- If it is the symbol @code{sel}, the selected portion is always returned,
- or @code{nil} if there is no selection. (This mode ignores the @kbd{j e}
- command.) If the symbol is @code{entry}, the complete stack entry in
- list form is returned; the first element of this list will be the whole
- formula, and the third element will be the selection (or @code{nil}).
- @end defun
- @defun calc-pop-stack n m
- Remove the specified elements from the stack. The parameters @var{n}
- and @var{m} are defined the same as for @code{calc-top-list}. The return
- value of @code{calc-pop-stack} is uninteresting.
- If there are any selected sub-formulas among the popped elements, and
- @kbd{j e} has not been used to disable selections, this produces an
- error without changing the stack. If you supply an optional third
- argument of @code{t}, the stack elements are popped even if they
- contain selections.
- @end defun
- @defun calc-record-list vals tag
- This function records one or more results in the trail. The @var{vals}
- are a list of strings or Calc objects. The @var{tag} is the four-character
- tag string to identify the values. If @var{tag} is omitted, a blank tag
- will be used.
- @end defun
- @defun calc-normalize n
- This function takes a Calc object and ``normalizes'' it. At the very
- least this involves re-rounding floating-point values according to the
- current precision and other similar jobs. Also, unless the user has
- selected no-simplify mode (@pxref{Simplification Modes}), this involves
- actually evaluating a formula object by executing the function calls
- it contains, and possibly also doing algebraic simplification, etc.
- @end defun
- @defun calc-top-list-n n m
- This function is identical to @code{calc-top-list}, except that it calls
- @code{calc-normalize} on the values that it takes from the stack. They
- are also passed through @code{check-complete}, so that incomplete
- objects will be rejected with an error message. All computational
- commands should use this in preference to @code{calc-top-list}; the only
- standard Calc commands that operate on the stack without normalizing
- are stack management commands like @code{calc-enter} and @code{calc-roll-up}.
- This function accepts the same optional selection-mode argument as
- @code{calc-top-list}.
- @end defun
- @defun calc-top-n m
- This function is a convenient form of @code{calc-top-list-n} in which only
- a single element of the stack is taken and returned, rather than a list
- of elements. This also accepts an optional selection-mode argument.
- @end defun
- @defun calc-enter-result n tag vals
- This function is a convenient interface to most of the above functions.
- The @var{vals} argument should be either a single Calc object, or a list
- of Calc objects; the object or objects are normalized, and the top @var{n}
- stack entries are replaced by the normalized objects. If @var{tag} is
- non-@code{nil}, the normalized objects are also recorded in the trail.
- A typical stack-based computational command would take the form,
- @smallexample
- (calc-enter-result @var{n} @var{tag} (cons 'calcFunc-@var{func}
- (calc-top-list-n @var{n})))
- @end smallexample
- If any of the @var{n} stack elements replaced contain sub-formula
- selections, and selections have not been disabled by @kbd{j e},
- this function takes one of two courses of action. If @var{n} is
- equal to the number of elements in @var{vals}, then each element of
- @var{vals} is spliced into the corresponding selection; this is what
- happens when you use the @key{TAB} key, or when you use a unary
- arithmetic operation like @code{sqrt}. If @var{vals} has only one
- element but @var{n} is greater than one, there must be only one
- selection among the top @var{n} stack elements; the element from
- @var{vals} is spliced into that selection. This is what happens when
- you use a binary arithmetic operation like @kbd{+}. Any other
- combination of @var{n} and @var{vals} is an error when selections
- are present.
- @end defun
- @defun calc-unary-op tag func arg
- This function implements a unary operator that allows a numeric prefix
- argument to apply the operator over many stack entries. If the prefix
- argument @var{arg} is @code{nil}, this uses @code{calc-enter-result}
- as outlined above. Otherwise, it maps the function over several stack
- elements; @pxref{Prefix Arguments}. For example,@refill
- @smallexample
- (defun calc-zeta (arg)
- (interactive "P")
- (calc-unary-op "zeta" 'calcFunc-zeta arg))
- @end smallexample
- @end defun
- @defun calc-binary-op tag func arg ident unary
- This function implements a binary operator, analogously to
- @code{calc-unary-op}. The optional @var{ident} and @var{unary}
- arguments specify the behavior when the prefix argument is zero or
- one, respectively. If the prefix is zero, the value @var{ident}
- is pushed onto the stack, if specified, otherwise an error message
- is displayed. If the prefix is one, the unary function @var{unary}
- is applied to the top stack element, or, if @var{unary} is not
- specified, nothing happens. When the argument is two or more,
- the binary function @var{func} is reduced across the top @var{arg}
- stack elements; when the argument is negative, the function is
- mapped between the next-to-top @i{-@var{arg}} stack elements and the
- top element.@refill
- @end defun
- @defun calc-stack-size
- Return the number of elements on the stack as an integer. This count
- does not include elements that have been temporarily hidden by stack
- truncation; @pxref{Truncating the Stack}.
- @end defun
- @defun calc-cursor-stack-index n
- Move the point to the @var{n}th stack entry. If @var{n} is zero, this
- will be the @samp{.} line. If @var{n} is from 1 to the current stack size,
- this will be the beginning of the first line of that stack entry's display.
- If line numbers are enabled, this will move to the first character of the
- line number, not the stack entry itself.@refill
- @end defun
- @defun calc-substack-height n
- Return the number of lines between the beginning of the @var{n}th stack
- entry and the bottom of the buffer. If @var{n} is zero, this
- will be one (assuming no stack truncation). If all stack entries are
- one line long (i.e., no matrices are displayed), the return value will
- be equal @var{n}+1 as long as @var{n} is in range. (Note that in Big
- mode, the return value includes the blank lines that separate stack
- entries.)@refill
- @end defun
- @defun calc-refresh
- Erase the @code{*Calculator*} buffer and reformat its contents from memory.
- This must be called after changing any parameter, such as the current
- display radix, which might change the appearance of existing stack
- entries. (During a keyboard macro invoked by the @kbd{X} key, refreshing
- is suppressed, but a flag is set so that the entire stack will be refreshed
- rather than just the top few elements when the macro finishes.)@refill
- @end defun
- @node Predicates, Computational Lisp Functions, Stack Lisp Functions, Internals
- @subsubsection Predicates
- @noindent
- The functions described here are predicates, that is, they return a
- true/false value where @code{nil} means false and anything else means
- true. These predicates are expanded by @code{defmath}, for example,
- from @code{zerop} to @code{math-zerop}. In many cases they correspond
- to native Lisp functions by the same name, but are extended to cover
- the full range of Calc data types.
- @defun zerop x
- Returns true if @var{x} is numerically zero, in any of the Calc data
- types. (Note that for some types, such as error forms and intervals,
- it never makes sense to return true.) In @code{defmath}, the expression
- @samp{(= x 0)} will automatically be converted to @samp{(math-zerop x)},
- and @samp{(/= x 0)} will be converted to @samp{(not (math-zerop x))}.
- @end defun
- @defun negp x
- Returns true if @var{x} is negative. This accepts negative real numbers
- of various types, negative HMS and date forms, and intervals in which
- all included values are negative. In @code{defmath}, the expression
- @samp{(< x 0)} will automatically be converted to @samp{(math-negp x)},
- and @samp{(>= x 0)} will be converted to @samp{(not (math-negp x))}.
- @end defun
- @defun posp x
- Returns true if @var{x} is positive (and non-zero). For complex
- numbers, none of these three predicates will return true.
- @end defun
- @defun looks-negp x
- Returns true if @var{x} is ``negative-looking.'' This returns true if
- @var{x} is a negative number, or a formula with a leading minus sign
- such as @samp{-a/b}. In other words, this is an object which can be
- made simpler by calling @code{(- @var{x})}.
- @end defun
- @defun integerp x
- Returns true if @var{x} is an integer of any size.
- @end defun
- @defun fixnump x
- Returns true if @var{x} is a native Lisp integer.
- @end defun
- @defun natnump x
- Returns true if @var{x} is a nonnegative integer of any size.
- @end defun
- @defun fixnatnump x
- Returns true if @var{x} is a nonnegative Lisp integer.
- @end defun
- @defun num-integerp x
- Returns true if @var{x} is numerically an integer, i.e., either a
- true integer or a float with no significant digits to the right of
- the decimal point.
- @end defun
- @defun messy-integerp x
- Returns true if @var{x} is numerically, but not literally, an integer.
- A value is @code{num-integerp} if it is @code{integerp} or
- @code{messy-integerp} (but it is never both at once).
- @end defun
- @defun num-natnump x
- Returns true if @var{x} is numerically a nonnegative integer.
- @end defun
- @defun evenp x
- Returns true if @var{x} is an even integer.
- @end defun
- @defun looks-evenp x
- Returns true if @var{x} is an even integer, or a formula with a leading
- multiplicative coefficient which is an even integer.
- @end defun
- @defun oddp x
- Returns true if @var{x} is an odd integer.
- @end defun
- @defun ratp x
- Returns true if @var{x} is a rational number, i.e., an integer or a
- fraction.
- @end defun
- @defun realp x
- Returns true if @var{x} is a real number, i.e., an integer, fraction,
- or floating-point number.
- @end defun
- @defun anglep x
- Returns true if @var{x} is a real number or HMS form.
- @end defun
- @defun floatp x
- Returns true if @var{x} is a float, or a complex number, error form,
- interval, date form, or modulo form in which at least one component
- is a float.
- @end defun
- @defun complexp x
- Returns true if @var{x} is a rectangular or polar complex number
- (but not a real number).
- @end defun
- @defun rect-complexp x
- Returns true if @var{x} is a rectangular complex number.
- @end defun
- @defun polar-complexp x
- Returns true if @var{x} is a polar complex number.
- @end defun
- @defun numberp x
- Returns true if @var{x} is a real number or a complex number.
- @end defun
- @defun scalarp x
- Returns true if @var{x} is a real or complex number or an HMS form.
- @end defun
- @defun vectorp x
- Returns true if @var{x} is a vector (this simply checks if its argument
- is a list whose first element is the symbol @code{vec}).
- @end defun
- @defun numvecp x
- Returns true if @var{x} is a number or vector.
- @end defun
- @defun matrixp x
- Returns true if @var{x} is a matrix, i.e., a vector of one or more vectors,
- all of the same size.
- @end defun
- @defun square-matrixp x
- Returns true if @var{x} is a square matrix.
- @end defun
- @defun objectp x
- Returns true if @var{x} is any numeric Calc object, including real and
- complex numbers, HMS forms, date forms, error forms, intervals, and
- modulo forms. (Note that error forms and intervals may include formulas
- as their components; see @code{constp} below.)
- @end defun
- @defun objvecp x
- Returns true if @var{x} is an object or a vector. This also accepts
- incomplete objects, but it rejects variables and formulas (except as
- mentioned above for @code{objectp}).
- @end defun
- @defun primp x
- Returns true if @var{x} is a ``primitive'' or ``atomic'' Calc object,
- i.e., one whose components cannot be regarded as sub-formulas. This
- includes variables, and all @code{objectp} types except error forms
- and intervals.
- @end defun
- @defun constp x
- Returns true if @var{x} is constant, i.e., a real or complex number,
- HMS form, date form, or error form, interval, or vector all of whose
- components are @code{constp}.
- @end defun
- @defun lessp x y
- Returns true if @var{x} is numerically less than @var{y}. Returns false
- if @var{x} is greater than or equal to @var{y}, or if the order is
- undefined or cannot be determined. Generally speaking, this works
- by checking whether @samp{@var{x} - @var{y}} is @code{negp}. In
- @code{defmath}, the expression @samp{(< x y)} will automatically be
- converted to @samp{(lessp x y)}; expressions involving @code{>}, @code{<=},
- and @code{>=} are similarly converted in terms of @code{lessp}.@refill
- @end defun
- @defun beforep x y
- Returns true if @var{x} comes before @var{y} in a canonical ordering
- of Calc objects. If @var{x} and @var{y} are both real numbers, this
- will be the same as @code{lessp}. But whereas @code{lessp} considers
- other types of objects to be unordered, @code{beforep} puts any two
- objects into a definite, consistent order. The @code{beforep}
- function is used by the @kbd{V S} vector-sorting command, and also
- by @kbd{a s} to put the terms of a product into canonical order:
- This allows @samp{x y + y x} to be simplified easily to @samp{2 x y}.
- @end defun
- @defun equal x y
- This is the standard Lisp @code{equal} predicate; it returns true if
- @var{x} and @var{y} are structurally identical. This is the usual way
- to compare numbers for equality, but note that @code{equal} will treat
- 0 and 0.0 as different.
- @end defun
- @defun math-equal x y
- Returns true if @var{x} and @var{y} are numerically equal, either because
- they are @code{equal}, or because their difference is @code{zerop}. In
- @code{defmath}, the expression @samp{(= x y)} will automatically be
- converted to @samp{(math-equal x y)}.
- @end defun
- @defun equal-int x n
- Returns true if @var{x} and @var{n} are numerically equal, where @var{n}
- is a fixnum which is not a multiple of 10. This will automatically be
- used by @code{defmath} in place of the more general @code{math-equal}
- whenever possible.@refill
- @end defun
- @defun nearly-equal x y
- Returns true if @var{x} and @var{y}, as floating-point numbers, are
- equal except possibly in the last decimal place. For example,
- 314.159 and 314.166 are considered nearly equal if the current
- precision is 6 (since they differ by 7 units), but not if the current
- precision is 7 (since they differ by 70 units). Most functions which
- use series expansions use @code{with-extra-prec} to evaluate the
- series with 2 extra digits of precision, then use @code{nearly-equal}
- to decide when the series has converged; this guards against cumulative
- error in the series evaluation without doing extra work which would be
- lost when the result is rounded back down to the current precision.
- In @code{defmath}, this can be written @samp{(~= @var{x} @var{y})}.
- The @var{x} and @var{y} can be numbers of any kind, including complex.
- @end defun
- @defun nearly-zerop x y
- Returns true if @var{x} is nearly zero, compared to @var{y}. This
- checks whether @var{x} plus @var{y} would by be @code{nearly-equal}
- to @var{y} itself, to within the current precision, in other words,
- if adding @var{x} to @var{y} would have a negligible effect on @var{y}
- due to roundoff error. @var{X} may be a real or complex number, but
- @var{y} must be real.
- @end defun
- @defun is-true x
- Return true if the formula @var{x} represents a true value in
- Calc, not Lisp, terms. It tests if @var{x} is a non-zero number
- or a provably non-zero formula.
- @end defun
- @defun reject-arg val pred
- Abort the current function evaluation due to unacceptable argument values.
- This calls @samp{(calc-record-why @var{pred} @var{val})}, then signals a
- Lisp error which @code{normalize} will trap. The net effect is that the
- function call which led here will be left in symbolic form.@refill
- @end defun
- @defun inexact-value
- If Symbolic Mode is enabled, this will signal an error that causes
- @code{normalize} to leave the formula in symbolic form, with the message
- ``Inexact result.'' (This function has no effect when not in Symbolic Mode.)
- Note that if your function calls @samp{(sin 5)} in Symbolic Mode, the
- @code{sin} function will call @code{inexact-value}, which will cause your
- function to be left unsimplified. You may instead wish to call
- @samp{(normalize (list 'calcFunc-sin 5))}, which in Symbolic Mode will
- return the formula @samp{sin(5)} to your function.@refill
- @end defun
- @defun overflow
- This signals an error that will be reported as a floating-point overflow.
- @end defun
- @defun underflow
- This signals a floating-point underflow.
- @end defun
- @node Computational Lisp Functions, Vector Lisp Functions, Predicates, Internals
- @subsubsection Computational Functions
- @noindent
- The functions described here do the actual computational work of the
- Calculator. In addition to these, note that any function described in
- the main body of this manual may be called from Lisp; for example, if
- the documentation refers to the @code{calc-sqrt} [@code{sqrt}] command,
- this means @code{calc-sqrt} is an interactive stack-based square-root
- command and @code{sqrt} (which @code{defmath} expands to @code{calcFunc-sqrt})
- is the actual Lisp function for taking square roots.@refill
- The functions @code{math-add}, @code{math-sub}, @code{math-mul},
- @code{math-div}, @code{math-mod}, and @code{math-neg} are not included
- in this list, since @code{defmath} allows you to write native Lisp
- @code{+}, @code{-}, @code{*}, @code{/}, @code{%}, and unary @code{-},
- respectively, instead.@refill
- @defun normalize val
- (Full form: @code{math-normalize}.)
- Reduce the value @var{val} to standard form. For example, if @var{val}
- is a fixnum, it will be converted to a bignum if it is too large, and
- if @var{val} is a bignum it will be normalized by clipping off trailing
- (i.e., most-significant) zero digits and converting to a fixnum if it is
- small. All the various data types are similarly converted to their standard
- forms. Variables are left alone, but function calls are actually evaluated
- in formulas. For example, normalizing @samp{(+ 2 (calcFunc-abs -4))} will
- return 6.@refill
- If a function call fails, because the function is void or has the wrong
- number of parameters, or because it returns @code{nil} or calls
- @code{reject-arg} or @code{inexact-result}, @code{normalize} returns
- the formula still in symbolic form.@refill
- If the current Simplification Mode is ``none'' or ``numeric arguments
- only,'' @code{normalize} will act appropriately. However, the more
- powerful simplification modes (like algebraic simplification) are
- not handled by @code{normalize}. They are handled by @code{calc-normalize},
- which calls @code{normalize} and possibly some other routines, such
- as @code{simplify} or @code{simplify-units}. Programs generally will
- never call @code{calc-normalize} except when popping or pushing values
- on the stack.@refill
- @end defun
- @defun evaluate-expr expr
- Replace all variables in @var{expr} that have values with their values,
- then use @code{normalize} to simplify the result. This is what happens
- when you press the @kbd{=} key interactively.@refill
- @end defun
- @defmac with-extra-prec n body
- Evaluate the Lisp forms in @var{body} with precision increased by @var{n}
- digits. This is a macro which expands to
- @smallexample
- (math-normalize
- (let ((calc-internal-prec (+ calc-internal-prec @var{n})))
- @var{body}))
- @end smallexample
- The surrounding call to @code{math-normalize} causes a floating-point
- result to be rounded down to the original precision afterwards. This
- is important because some arithmetic operations assume a number's
- mantissa contains no more digits than the current precision allows.
- @end defmac
- @defun make-frac n d
- Build a fraction @samp{@var{n}:@var{d}}. This is equivalent to calling
- @samp{(normalize (list 'frac @var{n} @var{d}))}, but more efficient.
- @end defun
- @defun make-float mant exp
- Build a floating-point value out of @var{mant} and @var{exp}, both
- of which are arbitrary integers. This function will return a
- properly normalized float value, or signal an overflow or underflow
- if @var{exp} is out of range.
- @end defun
- @defun make-sdev x sigma
- Build an error form out of @var{x} and the absolute value of @var{sigma}.
- If @var{sigma} is zero, the result is the number @var{x} directly.
- If @var{sigma} is negative or complex, its absolute value is used.
- If @var{x} or @var{sigma} is not a valid type of object for use in
- error forms, this calls @code{reject-arg}.
- @end defun
- @defun make-intv mask lo hi
- Build an interval form out of @var{mask} (which is assumed to be an
- integer from 0 to 3), and the limits @var{lo} and @var{hi}. If
- @var{lo} is greater than @var{hi}, an empty interval form is returned.
- This calls @code{reject-arg} if @var{lo} or @var{hi} is unsuitable.
- @end defun
- @defun sort-intv mask lo hi
- Build an interval form, similar to @code{make-intv}, except that if
- @var{lo} is less than @var{hi} they are simply exchanged, and the
- bits of @var{mask} are swapped accordingly.
- @end defun
- @defun make-mod n m
- Build a modulo form out of @var{n} and the modulus @var{m}. Since modulo
- forms do not allow formulas as their components, if @var{n} or @var{m}
- is not a real number or HMS form the result will be a formula which
- is a call to @code{makemod}, the algebraic version of this function.
- @end defun
- @defun float x
- Convert @var{x} to floating-point form. Integers and fractions are
- converted to numerically equivalent floats; components of complex
- numbers, vectors, HMS forms, date forms, error forms, intervals, and
- modulo forms are recursively floated. If the argument is a variable
- or formula, this calls @code{reject-arg}.
- @end defun
- @defun compare x y
- Compare the numbers @var{x} and @var{y}, and return @i{-1} if
- @samp{(lessp @var{x} @var{y})}, 1 if @samp{(lessp @var{y} @var{x})},
- 0 if @samp{(math-equal @var{x} @var{y})}, or 2 if the order is
- undefined or cannot be determined.@refill
- @end defun
- @defun numdigs n
- Return the number of digits of integer @var{n}, effectively
- @samp{ceil(log10(@var{n}))}, but much more efficient. Zero is
- considered to have zero digits.
- @end defun
- @defun scale-int x n
- Shift integer @var{x} left @var{n} decimal digits, or right @i{-@var{n}}
- digits with truncation toward zero.
- @end defun
- @defun scale-rounding x n
- Like @code{scale-int}, except that a right shift rounds to the nearest
- integer rather than truncating.
- @end defun
- @defun fixnum n
- Return the integer @var{n} as a fixnum, i.e., a native Lisp integer.
- If @var{n} is outside the permissible range for Lisp integers (usually
- 24 binary bits) the result is undefined.
- @end defun
- @defun sqr x
- Compute the square of @var{x}; short for @samp{(* @var{x} @var{x})}.
- @end defun
- @defun quotient x y
- Divide integer @var{x} by integer @var{y}; return an integer quotient
- and discard the remainder. If @var{x} or @var{y} is negative, the
- direction of rounding is undefined.
- @end defun
- @defun idiv x y
- Perform an integer division; if @var{x} and @var{y} are both nonnegative
- integers, this uses the @code{quotient} function, otherwise it computes
- @samp{floor(@var{x}/@var{y})}. Thus the result is well-defined but
- slower than for @code{quotient}.
- @end defun
- @defun imod x y
- Divide integer @var{x} by integer @var{y}; return the integer remainder
- and discard the quotient. Like @code{quotient}, this works only for
- integer arguments and is not well-defined for negative arguments.
- For a more well-defined result, use @samp{(% @var{x} @var{y})}.
- @end defun
- @defun idivmod x y
- Divide integer @var{x} by integer @var{y}; return a cons cell whose
- @code{car} is @samp{(quotient @var{x} @var{y})} and whose @code{cdr}
- is @samp{(imod @var{x} @var{y})}.@refill
- @end defun
- @defun pow x y
- Compute @var{x} to the power @var{y}. In @code{defmath} code, this can
- also be written @samp{(^ @var{x} @var{y})} or
- @w{@samp{(expt @var{x} @var{y})}}.@refill
- @end defun
- @defun abs-approx x
- Compute a fast approximation to the absolute value of @var{x}. For
- example, for a rectangular complex number the result is the sum of
- the absolute values of the components.
- @end defun
- @findex two-pi
- @findex pi-over-2
- @findex pi-over-4
- @findex pi-over-180
- @findex sqrt-two-pi
- @findex sqrt-e
- @findex e
- @findex ln-2
- @findex ln-10
- @defun pi
- The function @samp{(pi)} computes @samp{pi} to the current precision.
- Other related constant-generating functions are @code{two-pi},
- @code{pi-over-2}, @code{pi-over-4}, @code{pi-over-180}, @code{sqrt-two-pi},
- @code{e}, @code{sqrt-e}, @code{ln-2}, and @code{ln-10}. Each function
- returns a floating-point value in the current precision, and each uses
- caching so that all calls after the first are essentially free.@refill
- @end defun
- @defmac math-defcache @var{func} @var{initial} @var{form}
- This macro, usually used as a top-level call like @code{defun} or
- @code{defvar}, defines a new cached constant analogous to @code{pi}, etc.
- It defines a function @code{func} which returns the requested value;
- if @var{initial} is non-@code{nil} it must be a @samp{(float @dots{})}
- form which serves as an initial value for the cache. If @var{func}
- is called when the cache is empty or does not have enough digits to
- satisfy the current precision, the Lisp expression @var{form} is evaluated
- with the current precision increased by four, and the result minus its
- two least significant digits is stored in the cache. For example,
- calling @samp{(pi)} with a precision of 30 computes @samp{pi} to 34
- digits, rounds it down to 32 digits for future use, then rounds it
- again to 30 digits for use in the present request.@refill
- @end defmac
- @findex half-circle
- @findex quarter-circle
- @defun full-circle symb
- If the current angular mode is Degrees or HMS, this function returns the
- integer 360. In Radians mode, this function returns either the
- corresponding value in radians to the current precision, or the formula
- @samp{2*pi}, depending on the Symbolic Mode. There are also similar
- function @code{half-circle} and @code{quarter-circle}.
- @end defun
- @defun power-of-2 n
- Compute two to the integer power @var{n}, as a (potentially very large)
- integer. Powers of two are cached, so only the first call for a
- particular @var{n} is expensive.
- @end defun
- @defun integer-log2 n
- Compute the base-2 logarithm of @var{n}, which must be an integer which
- is a power of two. If @var{n} is not a power of two, this function will
- return @code{nil}.
- @end defun
- @defun div-mod a b m
- Divide @var{a} by @var{b}, modulo @var{m}. This returns @code{nil} if
- there is no solution, or if any of the arguments are not integers.@refill
- @end defun
- @defun pow-mod a b m
- Compute @var{a} to the power @var{b}, modulo @var{m}. If @var{a},
- @var{b}, and @var{m} are integers, this uses an especially efficient
- algorithm. Otherwise, it simply computes @samp{(% (^ a b) m)}.
- @end defun
- @defun isqrt n
- Compute the integer square root of @var{n}. This is the square root
- of @var{n} rounded down toward zero, i.e., @samp{floor(sqrt(@var{n}))}.
- If @var{n} is itself an integer, the computation is especially efficient.
- @end defun
- @defun to-hms a ang
- Convert the argument @var{a} into an HMS form. If @var{ang} is specified,
- it is the angular mode in which to interpret @var{a}, either @code{deg}
- or @code{rad}. Otherwise, the current angular mode is used. If @var{a}
- is already an HMS form it is returned as-is.
- @end defun
- @defun from-hms a ang
- Convert the HMS form @var{a} into a real number. If @var{ang} is specified,
- it is the angular mode in which to express the result, otherwise the
- current angular mode is used. If @var{a} is already a real number, it
- is returned as-is.
- @end defun
- @defun to-radians a
- Convert the number or HMS form @var{a} to radians from the current
- angular mode.
- @end defun
- @defun from-radians a
- Convert the number @var{a} from radians to the current angular mode.
- If @var{a} is a formula, this returns the formula @samp{deg(@var{a})}.
- @end defun
- @defun to-radians-2 a
- Like @code{to-radians}, except that in Symbolic Mode a degrees to
- radians conversion yields a formula like @samp{@var{a}*pi/180}.
- @end defun
- @defun from-radians-2 a
- Like @code{from-radians}, except that in Symbolic Mode a radians to
- degrees conversion yields a formula like @samp{@var{a}*180/pi}.
- @end defun
- @defun random-digit
- Produce a random base-1000 digit in the range 0 to 999.
- @end defun
- @defun random-digits n
- Produce a random @var{n}-digit integer; this will be an integer
- in the interval @samp{[0, 10^@var{n})}.
- @end defun
- @defun random-float
- Produce a random float in the interval @samp{[0, 1)}.
- @end defun
- @defun prime-test n iters
- Determine whether the integer @var{n} is prime. Return a list which has
- one of these forms: @samp{(nil @var{f})} means the number is non-prime
- because it was found to be divisible by @var{f}; @samp{(nil)} means it
- was found to be non-prime by table look-up (so no factors are known);
- @samp{(nil unknown)} means it is definitely non-prime but no factors
- are known because @var{n} was large enough that Fermat's probabilistic
- test had to be used; @samp{(t)} means the number is definitely prime;
- and @samp{(maybe @var{i} @var{p})} means that Fermat's test, after @var{i}
- iterations, is @var{p} percent sure that the number is prime. The
- @var{iters} parameter is the number of Fermat iterations to use, in the
- case that this is necessary. If @code{prime-test} returns ``maybe,''
- you can call it again with the same @var{n} to get a greater certainty;
- @code{prime-test} remembers where it left off.@refill
- @end defun
- @defun to-simple-fraction f
- If @var{f} is a floating-point number which can be represented exactly
- as a small rational number. return that number, else return @var{f}.
- For example, 0.75 would be converted to 3:4. This function is very
- fast.
- @end defun
- @defun to-fraction f tol
- Find a rational approximation to floating-point number @var{f} to within
- a specified tolerance @var{tol}; this corresponds to the algebraic
- function @code{frac}, and can be rather slow.
- @end defun
- @defun quarter-integer n
- If @var{n} is an integer or integer-valued float, this function
- returns zero. If @var{n} is a half-integer (i.e., an integer plus
- @i{1:2} or 0.5), it returns 2. If @var{n} is a quarter-integer,
- it returns 1 or 3. If @var{n} is anything else, this function
- returns @code{nil}.
- @end defun
- @node Vector Lisp Functions, Symbolic Lisp Functions, Computational Lisp Functions, Internals
- @subsubsection Vector Functions
- @noindent
- The functions described here perform various operations on vectors and
- matrices.
- @defun math-concat x y
- Do a vector concatenation; this operation is written @samp{@var{x} | @var{y}}
- in a symbolic formula. @xref{Building Vectors}.
- @end defun
- @defun vec-length v
- Return the length of vector @var{v}. If @var{v} is not a vector, the
- result is zero. If @var{v} is a matrix, this returns the number of
- rows in the matrix.
- @end defun
- @defun mat-dimens m
- Determine the dimensions of vector or matrix @var{m}. If @var{m} is not
- a vector, the result is an empty list. If @var{m} is a plain vector
- but not a matrix, the result is a one-element list containing the length
- of the vector. If @var{m} is a matrix with @var{r} rows and @var{c} columns,
- the result is the list @samp{(@var{r} @var{c})}. Higher-order tensors
- produce lists of more than two dimensions. Note that the object
- @samp{[[1, 2, 3], [4, 5]]} is a vector of vectors not all the same size,
- and is treated by this and other Calc routines as a plain vector of two
- elements.@refill
- @end defun
- @defun dimension-error
- Abort the current function with a message of ``Dimension error.''
- The Calculator will leave the function being evaluated in symbolic
- form; this is really just a special case of @code{reject-arg}.
- @end defun
- @defun build-vector args
- Return a Calc vector with @var{args} as elements.
- For example, @samp{(build-vector 1 2 3)} returns the Calc vector
- @samp{[1, 2, 3]}, stored internally as the list @samp{(vec 1 2 3)}.
- @end defun
- @defun make-vec obj dims
- Return a Calc vector or matrix all of whose elements are equal to
- @var{obj}. For example, @samp{(make-vec 27 3 4)} returns a 3x4 matrix
- filled with 27's.
- @end defun
- @defun row-matrix v
- If @var{v} is a plain vector, convert it into a row matrix, i.e.,
- a matrix whose single row is @var{v}. If @var{v} is already a matrix,
- leave it alone.
- @end defun
- @defun col-matrix v
- If @var{v} is a plain vector, convert it into a column matrix, i.e., a
- matrix with each element of @var{v} as a separate row. If @var{v} is
- already a matrix, leave it alone.
- @end defun
- @defun map-vec f v
- Map the Lisp function @var{f} over the Calc vector @var{v}. For example,
- @samp{(map-vec 'math-floor v)} returns a vector of the floored components
- of vector @var{v}.
- @end defun
- @defun map-vec-2 f a b
- Map the Lisp function @var{f} over the two vectors @var{a} and @var{b}.
- If @var{a} and @var{b} are vectors of equal length, the result is a
- vector of the results of calling @samp{(@var{f} @var{ai} @var{bi})}
- for each pair of elements @var{ai} and @var{bi}. If either @var{a} or
- @var{b} is a scalar, it is matched with each value of the other vector.
- For example, @samp{(map-vec-2 'math-add v 1)} returns the vector @var{v}
- with each element increased by one. Note that using @samp{'+} would not
- work here, since @code{defmath} does not expand function names everywhere,
- just where they are in the function position of a Lisp expression.@refill
- @end defun
- @defun reduce-vec f v
- Reduce the function @var{f} over the vector @var{v}. For example, if
- @var{v} is @samp{[10, 20, 30, 40]}, this calls @samp{(f (f (f 10 20) 30) 40)}.
- If @var{v} is a matrix, this reduces over the rows of @var{v}.
- @end defun
- @defun reduce-cols f m
- Reduce the function @var{f} over the columns of matrix @var{m}. For
- example, if @var{m} is @samp{[[1, 2], [3, 4], [5, 6]]}, the result
- is a vector of the two elements @samp{(f (f 1 3) 5)} and @samp{(f (f 2 4) 6)}.
- @end defun
- @defun mat-row m n
- Return the @var{n}th row of matrix @var{m}. This is equivalent to
- @samp{(elt m n)}. For a slower but safer version, use @code{mrow}.
- (@xref{Extracting Elements}.)
- @end defun
- @defun mat-col m n
- Return the @var{n}th column of matrix @var{m}, in the form of a vector.
- The arguments are not checked for correctness.
- @end defun
- @defun mat-less-row m n
- Return a copy of matrix @var{m} with its @var{n}th row deleted. The
- number @var{n} must be in range from 1 to the number of rows in @var{m}.
- @end defun
- @defun mat-less-col m n
- Return a copy of matrix @var{m} with its @var{n}th column deleted.
- @end defun
- @defun transpose m
- Return the transpose of matrix @var{m}.
- @end defun
- @defun flatten-vector v
- Flatten nested vector @var{v} into a vector of scalars. For example,
- if @var{v} is @samp{[[1, 2, 3], [4, 5]]} the result is @samp{[1, 2, 3, 4, 5]}.
- @end defun
- @defun copy-matrix m
- If @var{m} is a matrix, return a copy of @var{m}. This maps
- @code{copy-sequence} over the rows of @var{m}; in Lisp terms, each
- element of the result matrix will be @code{eq} to the corresponding
- element of @var{m}, but none of the @code{cons} cells that make up
- the structure of the matrix will be @code{eq}. If @var{m} is a plain
- vector, this is the same as @code{copy-sequence}.@refill
- @end defun
- @defun swap-rows m r1 r2
- Exchange rows @var{r1} and @var{r2} of matrix @var{m} in-place. In
- other words, unlike most of the other functions described here, this
- function changes @var{m} itself rather than building up a new result
- matrix. The return value is @var{m}, i.e., @samp{(eq (swap-rows m 1 2) m)}
- is true, with the side effect of exchanging the first two rows of
- @var{m}.@refill
- @end defun
- @node Symbolic Lisp Functions, Formatting Lisp Functions, Vector Lisp Functions, Internals
- @subsubsection Symbolic Functions
- @noindent
- The functions described here operate on symbolic formulas in the
- Calculator.
- @defun calc-prepare-selection num
- Prepare a stack entry for selection operations. If @var{num} is
- omitted, the stack entry containing the cursor is used; otherwise,
- it is the number of the stack entry to use. This function stores
- useful information about the current stack entry into a set of
- variables. @code{calc-selection-cache-num} contains the number of
- the stack entry involved (equal to @var{num} if you specified it);
- @code{calc-selection-cache-entry} contains the stack entry as a
- list (such as @code{calc-top-list} would return with @code{entry}
- as the selection mode); and @code{calc-selection-cache-comp} contains
- a special ``tagged'' composition (@pxref{Formatting Lisp Functions})
- which allows Calc to relate cursor positions in the buffer with
- their corresponding sub-formulas.
- A slight complication arises in the selection mechanism because
- formulas may contain small integers. For example, in the vector
- @samp{[1, 2, 1]} the first and last elements are @code{eq} to each
- other; selections are recorded as the actual Lisp object that
- appears somewhere in the tree of the whole formula, but storing
- @code{1} would falsely select both @code{1}'s in the vector. So
- @code{calc-prepare-selection} also checks the stack entry and
- replaces any plain integers with ``complex number'' lists of the form
- @samp{(cplx @var{n} 0)}. This list will be displayed the same as a
- plain @var{n} and the change will be completely invisible to the
- user, but it will guarantee that no two sub-formulas of the stack
- entry will be @code{eq} to each other. Next time the stack entry
- is involved in a computation, @code{calc-normalize} will replace
- these lists with plain numbers again, again invisibly to the user.
- @end defun
- @defun calc-encase-atoms x
- This modifies the formula @var{x} to ensure that each part of the
- formula is a unique atom, using the @samp{(cplx @var{n} 0)} trick
- described above. This function may use @code{setcar} to modify
- the formula in-place.
- @end defun
- @defun calc-find-selected-part
- Find the smallest sub-formula of the current formula that contains
- the cursor. This assumes @code{calc-prepare-selection} has been
- called already. If the cursor is not actually on any part of the
- formula, this returns @code{nil}.
- @end defun
- @defun calc-change-current-selection selection
- Change the currently prepared stack element's selection to
- @var{selection}, which should be @code{eq} to some sub-formula
- of the stack element, or @code{nil} to unselect the formula.
- The stack element's appearance in the Calc buffer is adjusted
- to reflect the new selection.
- @end defun
- @defun calc-find-nth-part expr n
- Return the @var{n}th sub-formula of @var{expr}. This function is used
- by the selection commands, and (unless @kbd{j b} has been used) treats
- sums and products as flat many-element formulas. Thus if @var{expr}
- is @samp{((a + b) - c) + d}, calling @code{calc-find-nth-part} with
- @var{n} equal to four will return @samp{d}.
- @end defun
- @defun calc-find-parent-formula expr part
- Return the sub-formula of @var{expr} which immediately contains
- @var{part}. If @var{expr} is @samp{a*b + (c+1)*d} and @var{part}
- is @code{eq} to the @samp{c+1} term of @var{expr}, then this function
- will return @samp{(c+1)*d}. If @var{part} turns out not to be a
- sub-formula of @var{expr}, the function returns @code{nil}. If
- @var{part} is @code{eq} to @var{expr}, the function returns @code{t}.
- This function does not take associativity into account.
- @end defun
- @defun calc-find-assoc-parent-formula expr part
- This is the same as @code{calc-find-parent-formula}, except that
- (unless @kbd{j b} has been used) it continues widening the selection
- to contain a complete level of the formula. Given @samp{a} from
- @samp{((a + b) - c) + d}, @code{calc-find-parent-formula} will
- return @samp{a + b} but @code{calc-find-assoc-parent-formula} will
- return the whole expression.
- @end defun
- @defun calc-grow-assoc-formula expr part
- This expands sub-formula @var{part} of @var{expr} to encompass a
- complete level of the formula. If @var{part} and its immediate
- parent are not compatible associative operators, or if @kbd{j b}
- has been used, this simply returns @var{part}.
- @end defun
- @defun calc-find-sub-formula expr part
- This finds the immediate sub-formula of @var{expr} which contains
- @var{part}. It returns an index @var{n} such that
- @samp{(calc-find-nth-part @var{expr} @var{n})} would return @var{part}.
- If @var{part} is not a sub-formula of @var{expr}, it returns @code{nil}.
- If @var{part} is @code{eq} to @var{expr}, it returns @code{t}. This
- function does not take associativity into account.
- @end defun
- @defun calc-replace-sub-formula expr old new
- This function returns a copy of formula @var{expr}, with the
- sub-formula that is @code{eq} to @var{old} replaced by @var{new}.
- @end defun
- @defun simplify expr
- Simplify the expression @var{expr} by applying various algebraic rules.
- This is what the @w{@kbd{a s}} (@code{calc-simplify}) command uses. This
- always returns a copy of the expression; the structure @var{expr} points
- to remains unchanged in memory.
- More precisely, here is what @code{simplify} does: The expression is
- first normalized and evaluated by calling @code{normalize}. If any
- @code{AlgSimpRules} have been defined, they are then applied. Then
- the expression is traversed in a depth-first, bottom-up fashion; at
- each level, any simplifications that can be made are made until no
- further changes are possible. Once the entire formula has been
- traversed in this way, it is compared with the original formula (from
- before the call to @code{normalize}) and, if it has changed,
- the entire procedure is repeated (starting with @code{normalize})
- until no further changes occur. Usually only two iterations are
- needed:@: one to simplify the formula, and another to verify that no
- further simplifications were possible.
- @end defun
- @defun simplify-extended expr
- Simplify the expression @var{expr}, with additional rules enabled that
- help do a more thorough job, while not being entirely ``safe'' in all
- circumstances. (For example, this mode will simplify @samp{sqrt(x^2)}
- to @samp{x}, which is only valid when @var{x} is positive.) This is
- implemented by temporarily binding the variable @code{math-living-dangerously}
- to @code{t} (using a @code{let} form) and calling @code{simplify}.
- Dangerous simplification rules are written to check this variable
- before taking any action.@refill
- @end defun
- @defun simplify-units expr
- Simplify the expression @var{expr}, treating variable names as units
- whenever possible. This works by binding the variable
- @code{math-simplifying-units} to @code{t} while calling @code{simplify}.
- @end defun
- @defmac math-defsimplify funcs body
- Register a new simplification rule; this is normally called as a top-level
- form, like @code{defun} or @code{defmath}. If @var{funcs} is a symbol
- (like @code{+} or @code{calcFunc-sqrt}), this simplification rule is
- applied to the formulas which are calls to the specified function. Or,
- @var{funcs} can be a list of such symbols; the rule applies to all
- functions on the list. The @var{body} is written like the body of a
- function with a single argument called @code{expr}. The body will be
- executed with @code{expr} bound to a formula which is a call to one of
- the functions @var{funcs}. If the function body returns @code{nil}, or
- if it returns a result @code{equal} to the original @code{expr}, it is
- ignored and Calc goes on to try the next simplification rule that applies.
- If the function body returns something different, that new formula is
- substituted for @var{expr} in the original formula.@refill
- At each point in the formula, rules are tried in the order of the
- original calls to @code{math-defsimplify}; the search stops after the
- first rule that makes a change. Thus later rules for that same
- function will not have a chance to trigger until the next iteration
- of the main @code{simplify} loop.
- Note that, since @code{defmath} is not being used here, @var{body} must
- be written in true Lisp code without the conveniences that @code{defmath}
- provides. If you prefer, you can have @var{body} simply call another
- function (defined with @code{defmath}) which does the real work.
- The arguments of a function call will already have been simplified
- before any rules for the call itself are invoked. Since a new argument
- list is consed up when this happens, this means that the rule's body is
- allowed to rearrange the function's arguments destructively if that is
- convenient. Here is a typical example of a simplification rule:
- @smallexample
- (math-defsimplify calcFunc-arcsinh
- (or (and (math-looks-negp (nth 1 expr))
- (math-neg (list 'calcFunc-arcsinh
- (math-neg (nth 1 expr)))))
- (and (eq (car-safe (nth 1 expr)) 'calcFunc-sinh)
- (or math-living-dangerously
- (math-known-realp (nth 1 (nth 1 expr))))
- (nth 1 (nth 1 expr)))))
- @end smallexample
- This is really a pair of rules written with one @code{math-defsimplify}
- for convenience; the first replaces @samp{arcsinh(-x)} with
- @samp{-arcsinh(x)}, and the second, which is safe only for real @samp{x},
- replaces @samp{arcsinh(sinh(x))} with @samp{x}.@refill
- @end defmac
- @defun common-constant-factor expr
- Check @var{expr} to see if it is a sum of terms all multiplied by the
- same rational value. If so, return this value. If not, return @code{nil}.
- For example, if called on @samp{6x + 9y + 12z}, it would return 3, since
- 3 is a common factor of all the terms.
- @end defun
- @defun cancel-common-factor expr factor
- Assuming @var{expr} is a sum with @var{factor} as a common factor,
- divide each term of the sum by @var{factor}. This is done by
- destructively modifying parts of @var{expr}, on the assumption that
- it is being used by a simplification rule (where such things are
- allowed; see above). For example, consider this built-in rule for
- square roots:
- @smallexample
- (math-defsimplify calcFunc-sqrt
- (let ((fac (math-common-constant-factor (nth 1 expr))))
- (and fac (not (eq fac 1))
- (math-mul (math-normalize (list 'calcFunc-sqrt fac))
- (math-normalize
- (list 'calcFunc-sqrt
- (math-cancel-common-factor
- (nth 1 expr) fac)))))))
- @end smallexample
- @end defun
- @defun frac-gcd a b
- Compute a ``rational GCD'' of @var{a} and @var{b}, which must both be
- rational numbers. This is the fraction composed of the GCD of the
- numerators of @var{a} and @var{b}, over the GCD of the denominators.
- It is used by @code{common-constant-factor}. Note that the standard
- @code{gcd} function uses the LCM to combine the denominators.@refill
- @end defun
- @defun map-tree func expr many
- Try applying Lisp function @var{func} to various sub-expressions of
- @var{expr}. Initially, call @var{func} with @var{expr} itself as an
- argument. If this returns an expression which is not @code{equal} to
- @var{expr}, apply @var{func} again until eventually it does return
- @var{expr} with no changes. Then, if @var{expr} is a function call,
- recursively apply @var{func} to each of the arguments. This keeps going
- until no changes occur anywhere in the expression; this final expression
- is returned by @code{map-tree}. Note that, unlike simplification rules,
- @var{func} functions may @emph{not} make destructive changes to
- @var{expr}. If a third argument @var{many} is provided, it is an
- integer which says how many times @var{func} may be applied; the
- default, as described above, is infinitely many times.@refill
- @end defun
- @defun compile-rewrites rules
- Compile the rewrite rule set specified by @var{rules}, which should
- be a formula that is either a vector or a variable name. If the latter,
- the compiled rules are saved so that later @code{compile-rules} calls
- for that same variable can return immediately. If there are problems
- with the rules, this function calls @code{error} with a suitable
- message.
- @end defun
- @defun apply-rewrites expr crules heads
- Apply the compiled rewrite rule set @var{crules} to the expression
- @var{expr}. This will make only one rewrite and only checks at the
- top level of the expression. The result @code{nil} if no rules
- matched, or if the only rules that matched did not actually change
- the expression. The @var{heads} argument is optional; if is given,
- it should be a list of all function names that (may) appear in
- @var{expr}. The rewrite compiler tags each rule with the
- rarest-looking function name in the rule; if you specify @var{heads},
- @code{apply-rewrites} can use this information to narrow its search
- down to just a few rules in the rule set.
- @end defun
- @defun rewrite-heads expr
- Compute a @var{heads} list for @var{expr} suitable for use with
- @code{apply-rewrites}, as discussed above.
- @end defun
- @defun rewrite expr rules many
- This is an all-in-one rewrite function. It compiles the rule set
- specified by @var{rules}, then uses @code{map-tree} to apply the
- rules throughout @var{expr} up to @var{many} (default infinity)
- times.
- @end defun
- @defun match-patterns pat vec not-flag
- Given a Calc vector @var{vec} and an uncompiled pattern set or
- pattern set variable @var{pat}, this function returns a new vector
- of all elements of @var{vec} which do (or don't, if @var{not-flag} is
- non-@code{nil}) match any of the patterns in @var{pat}.
- @end defun
- @defun deriv expr var value symb
- Compute the derivative of @var{expr} with respect to variable @var{var}
- (which may actually be any sub-expression). If @var{value} is specified,
- the derivative is evaluated at the value of @var{var}; otherwise, the
- derivative is left in terms of @var{var}. If the expression contains
- functions for which no derivative formula is known, new derivative
- functions are invented by adding primes to the names; @pxref{Calculus}.
- However, if @var{symb} is non-@code{nil}, the presence of undifferentiable
- functions in @var{expr} instead cancels the whole differentiation, and
- @code{deriv} returns @code{nil} instead.
- Derivatives of an @var{n}-argument function can be defined by
- adding a @code{math-derivative-@var{n}} property to the property list
- of the symbol for the function's derivative, which will be the
- function name followed by an apostrophe. The value of the property
- should be a Lisp function; it is called with the same arguments as the
- original function call that is being differentiated. It should return
- a formula for the derivative. For example, the derivative of @code{ln}
- is defined by
- @smallexample
- (put 'calcFunc-ln\' 'math-derivative-1
- (function (lambda (u) (math-div 1 u))))
- @end smallexample
- The two-argument @code{log} function has two derivatives,
- @smallexample
- (put 'calcFunc-log\' 'math-derivative-2 ; d(log(x,b)) / dx
- (function (lambda (x b) ... )))
- (put 'calcFunc-log\'2 'math-derivative-2 ; d(log(x,b)) / db
- (function (lambda (x b) ... )))
- @end smallexample
- @end defun
- @defun tderiv expr var value symb
- Compute the total derivative of @var{expr}. This is the same as
- @code{deriv}, except that variables other than @var{var} are not
- assumed to be constant with respect to @var{var}.
- @end defun
- @defun integ expr var low high
- Compute the integral of @var{expr} with respect to @var{var}.
- @xref{Calculus}, for further details.
- @end defun
- @defmac math-defintegral funcs body
- Define a rule for integrating a function or functions of one argument;
- this macro is very similar in format to @code{math-defsimplify}.
- The main difference is that here @var{body} is the body of a function
- with a single argument @code{u} which is bound to the argument to the
- function being integrated, not the function call itself. Also, the
- variable of integration is available as @code{math-integ-var}. If
- evaluation of the integral requires doing further integrals, the body
- should call @samp{(math-integral @var{x})} to find the integral of
- @var{x} with respect to @code{math-integ-var}; this function returns
- @code{nil} if the integral could not be done. Some examples:
- @smallexample
- (math-defintegral calcFunc-conj
- (let ((int (math-integral u)))
- (and int
- (list 'calcFunc-conj int))))
- (math-defintegral calcFunc-cos
- (and (equal u math-integ-var)
- (math-from-radians-2 (list 'calcFunc-sin u))))
- @end smallexample
- In the @code{cos} example, we define only the integral of @samp{cos(x) dx},
- relying on the general integration-by-substitution facility to handle
- cosines of more complicated arguments. An integration rule should return
- @code{nil} if it can't do the integral; if several rules are defined for
- the same function, they are tried in order until one returns a non-@code{nil}
- result.@refill
- @end defmac
- @defmac math-defintegral-2 funcs body
- Define a rule for integrating a function or functions of two arguments.
- This is exactly analogous to @code{math-defintegral}, except that @var{body}
- is written as the body of a function with two arguments, @var{u} and
- @var{v}.@refill
- @end defmac
- @defun solve-for lhs rhs var full
- Attempt to solve the equation @samp{@var{lhs} = @var{rhs}} by isolating
- the variable @var{var} on the lefthand side; return the resulting righthand
- side, or @code{nil} if the equation cannot be solved. The variable
- @var{var} must appear at least once in @var{lhs} or @var{rhs}. Note that
- the return value is a formula which does not contain @var{var}; this is
- different from the user-level @code{solve} and @code{finv} functions,
- which return a rearranged equation or a functional inverse, respectively.
- If @var{full} is non-@code{nil}, a full solution including dummy signs
- and dummy integers will be produced. User-defined inverses are provided
- as properties in a manner similar to derivatives:@refill
- @smallexample
- (put 'calcFunc-ln 'math-inverse
- (function (lambda (x) (list 'calcFunc-exp x))))
- @end smallexample
- This function can call @samp{(math-solve-get-sign @var{x})} to create
- a new arbitrary sign variable, returning @var{x} times that sign, and
- @samp{(math-solve-get-int @var{x})} to create a new arbitrary integer
- variable multiplied by @var{x}. These functions simply return @var{x}
- if the caller requested a non-``full'' solution.
- @end defun
- @defun solve-eqn expr var full
- This version of @code{solve-for} takes an expression which will
- typically be an equation or inequality. (If it is not, it will be
- interpreted as the equation @samp{@var{expr} = 0}.) It returns an
- equation or inequality, or @code{nil} if no solution could be found.
- @end defun
- @defun solve-system exprs vars full
- This function solves a system of equations. Generally, @var{exprs}
- and @var{vars} will be vectors of equal length.
- @xref{Solving Systems of Equations}, for other options.
- @end defun
- @defun expr-contains expr var
- Returns a non-@code{nil} value if @var{var} occurs as a subexpression
- of @var{expr}.
- This function might seem at first to be identical to
- @code{calc-find-sub-formula}. The key difference is that
- @code{expr-contains} uses @code{equal} to test for matches, whereas
- @code{calc-find-sub-formula} uses @code{eq}. In the formula
- @samp{f(a, a)}, the two @samp{a}s will be @code{equal} but not
- @code{eq} to each other.@refill
- @end defun
- @defun expr-contains-count expr var
- Returns the number of occurrences of @var{var} as a subexpression
- of @var{expr}, or @code{nil} if there are no occurrences.@refill
- @end defun
- @defun expr-depends expr var
- Returns true if @var{expr} refers to any variable the occurs in @var{var}.
- In other words, it checks if @var{expr} and @var{var} have any variables
- in common.
- @end defun
- @defun expr-contains-vars expr
- Return true if @var{expr} contains any variables, or @code{nil} if @var{expr}
- contains only constants and functions with constant arguments.
- @end defun
- @defun expr-subst expr old new
- Returns a copy of @var{expr}, with all occurrences of @var{old} replaced
- by @var{new}. This treats @code{lambda} forms specially with respect
- to the dummy argument variables, so that the effect is always to return
- @var{expr} evaluated at @var{old} = @var{new}.@refill
- @end defun
- @defun multi-subst expr old new
- This is like @code{expr-subst}, except that @var{old} and @var{new}
- are lists of expressions to be substituted simultaneously. If one
- list is shorter than the other, trailing elements of the longer list
- are ignored.
- @end defun
- @defun expr-weight expr
- Returns the ``weight'' of @var{expr}, basically a count of the total
- number of objects and function calls that appear in @var{expr}. For
- ``primitive'' objects, this will be one.
- @end defun
- @defun expr-height expr
- Returns the ``height'' of @var{expr}, which is the deepest level to
- which function calls are nested. (Note that @samp{@var{a} + @var{b}}
- counts as a function call.) For primitive objects, this returns zero.@refill
- @end defun
- @defun polynomial-p expr var
- Check if @var{expr} is a polynomial in variable (or sub-expression)
- @var{var}. If so, return the degree of the polynomial, that is, the
- highest power of @var{var} that appears in @var{expr}. For example,
- for @samp{(x^2 + 3)^3 + 4} this would return 6. This function returns
- @code{nil} unless @var{expr}, when expanded out by @kbd{a x}
- (@code{calc-expand}), would consist of a sum of terms in which @var{var}
- appears only raised to nonnegative integer powers. Note that if
- @var{var} does not occur in @var{expr}, then @var{expr} is considered
- a polynomial of degree 0.@refill
- @end defun
- @defun is-polynomial expr var degree loose
- Check if @var{expr} is a polynomial in variable or sub-expression
- @var{var}, and, if so, return a list representation of the polynomial
- where the elements of the list are coefficients of successive powers of
- @var{var}: @samp{@var{a} + @var{b} x + @var{c} x^3} would produce the
- list @samp{(@var{a} @var{b} 0 @var{c})}, and @samp{(x + 1)^2} would
- produce the list @samp{(1 2 1)}. The highest element of the list will
- be non-zero, with the special exception that if @var{expr} is the
- constant zero, the returned value will be @samp{(0)}. Return @code{nil}
- if @var{expr} is not a polynomial in @var{var}. If @var{degree} is
- specified, this will not consider polynomials of degree higher than that
- value. This is a good precaution because otherwise an input of
- @samp{(x+1)^1000} will cause a huge coefficient list to be built. If
- @var{loose} is non-@code{nil}, then a looser definition of a polynomial
- is used in which coefficients are no longer required not to depend on
- @var{var}, but are only required not to take the form of polynomials
- themselves. For example, @samp{sin(x) x^2 + cos(x)} is a loose
- polynomial with coefficients @samp{((calcFunc-cos x) 0 (calcFunc-sin
- x))}. The result will never be @code{nil} in loose mode, since any
- expression can be interpreted as a ``constant'' loose polynomial.@refill
- @end defun
- @defun polynomial-base expr pred
- Check if @var{expr} is a polynomial in any variable that occurs in it;
- if so, return that variable. (If @var{expr} is a multivariate polynomial,
- this chooses one variable arbitrarily.) If @var{pred} is specified, it should
- be a Lisp function which is called as @samp{(@var{pred} @var{subexpr})},
- and which should return true if @code{mpb-top-expr} (a global name for
- the original @var{expr}) is a suitable polynomial in @var{subexpr}.
- The default predicate uses @samp{(polynomial-p mpb-top-expr @var{subexpr})};
- you can use @var{pred} to specify additional conditions. Or, you could
- have @var{pred} build up a list of every suitable @var{subexpr} that
- is found.@refill
- @end defun
- @defun poly-simplify poly
- Simplify polynomial coefficient list @var{poly} by (destructively)
- clipping off trailing zeros.
- @end defun
- @defun poly-mix a ac b bc
- Mix two polynomial lists @var{a} and @var{b} (in the form returned by
- @code{is-polynomial}) in a linear combination with coefficient expressions
- @var{ac} and @var{bc}. The result is a (not necessarily simplified)
- polynomial list representing @samp{@var{ac} @var{a} + @var{bc} @var{b}}.@refill
- @end defun
- @defun poly-mul a b
- Multiply two polynomial coefficient lists @var{a} and @var{b}. The
- result will be in simplified form if the inputs were simplified.
- @end defun
- @defun build-polynomial-expr poly var
- Construct a Calc formula which represents the polynomial coefficient
- list @var{poly} applied to variable @var{var}. The @kbd{a c}
- (@code{calc-collect}) command uses @code{is-polynomial} to turn an
- expression into a coefficient list, then @code{build-polynomial-expr}
- to turn the list back into an expression in regular form.@refill
- @end defun
- @defun check-unit-name var
- Check if @var{var} is a variable which can be interpreted as a unit
- name. If so, return the units table entry for that unit. This
- will be a list whose first element is the unit name (not counting
- prefix characters) as a symbol and whose second element is the
- Calc expression which defines the unit. (Refer to the Calc sources
- for details on the remaining elements of this list.) If @var{var}
- is not a variable or is not a unit name, return @code{nil}.
- @end defun
- @defun units-in-expr-p expr sub-exprs
- Return true if @var{expr} contains any variables which can be
- interpreted as units. If @var{sub-exprs} is @code{t}, the entire
- expression is searched. If @var{sub-exprs} is @code{nil}, this
- checks whether @var{expr} is directly a units expression.@refill
- @end defun
- @defun single-units-in-expr-p expr
- Check whether @var{expr} contains exactly one units variable. If so,
- return the units table entry for the variable. If @var{expr} does
- not contain any units, return @code{nil}. If @var{expr} contains
- two or more units, return the symbol @code{wrong}.
- @end defun
- @defun to-standard-units expr which
- Convert units expression @var{expr} to base units. If @var{which}
- is @code{nil}, use Calc's native base units. Otherwise, @var{which}
- can specify a units system, which is a list of two-element lists,
- where the first element is a Calc base symbol name and the second
- is an expression to substitute for it.@refill
- @end defun
- @defun remove-units expr
- Return a copy of @var{expr} with all units variables replaced by ones.
- This expression is generally normalized before use.
- @end defun
- @defun extract-units expr
- Return a copy of @var{expr} with everything but units variables replaced
- by ones.
- @end defun
- @node Formatting Lisp Functions, Hooks, Symbolic Lisp Functions, Internals
- @subsubsection I/O and Formatting Functions
- @noindent
- The functions described here are responsible for parsing and formatting
- Calc numbers and formulas.
- @defun calc-eval str sep arg1 arg2 @dots{}
- This is the simplest interface to the Calculator from another Lisp program.
- @xref{Calling Calc from Your Programs}.
- @end defun
- @defun read-number str
- If string @var{str} contains a valid Calc number, either integer,
- fraction, float, or HMS form, this function parses and returns that
- number. Otherwise, it returns @code{nil}.
- @end defun
- @defun read-expr str
- Read an algebraic expression from string @var{str}. If @var{str} does
- not have the form of a valid expression, return a list of the form
- @samp{(error @var{pos} @var{msg})} where @var{pos} is an integer index
- into @var{str} of the general location of the error, and @var{msg} is
- a string describing the problem.@refill
- @end defun
- @defun read-exprs str
- Read a list of expressions separated by commas, and return it as a
- Lisp list. If an error occurs in any expressions, an error list as
- shown above is returned instead.
- @end defun
- @defun calc-do-alg-entry initial prompt no-norm
- Read an algebraic formula or formulas using the minibuffer. All
- conventions of regular algebraic entry are observed. The return value
- is a list of Calc formulas; there will be more than one if the user
- entered a list of values separated by commas. The result is @code{nil}
- if the user presses Return with a blank line. If @var{initial} is
- given, it is a string which the minibuffer will initially contain.
- If @var{prompt} is given, it is the prompt string to use; the default
- is ``Algebraic:''. If @var{no-norm} is @code{t}, the formulas will
- be returned exactly as parsed; otherwise, they will be passed through
- @code{calc-normalize} first.@refill
- To support the use of @kbd{$} characters in the algebraic entry, use
- @code{let} to bind @code{calc-dollar-values} to a list of the values
- to be substituted for @kbd{$}, @kbd{$$}, and so on, and bind
- @code{calc-dollar-used} to 0. Upon return, @code{calc-dollar-used}
- will have been changed to the highest number of consecutive @kbd{$}s
- that actually appeared in the input.@refill
- @end defun
- @defun format-number a
- Convert the real or complex number or HMS form @var{a} to string form.
- @end defun
- @defun format-flat-expr a prec
- Convert the arbitrary Calc number or formula @var{a} to string form,
- in the style used by the trail buffer and the @code{calc-edit} command.
- This is a simple format designed
- mostly to guarantee the string is of a form that can be re-parsed by
- @code{read-expr}. Most formatting modes, such as digit grouping,
- complex number format, and point character, are ignored to ensure the
- result will be re-readable. The @var{prec} parameter is normally 0; if
- you pass a large integer like 1000 instead, the expression will be
- surrounded by parentheses unless it is a plain number or variable name.@refill
- @end defun
- @defun format-nice-expr a width
- This is like @code{format-flat-expr} (with @var{prec} equal to 0),
- except that newlines will be inserted to keep lines down to the
- specified @var{width}, and vectors that look like matrices or rewrite
- rules are written in a pseudo-matrix format. The @code{calc-edit}
- command uses this when only one stack entry is being edited.
- @end defun
- @defun format-value a width
- Convert the Calc number or formula @var{a} to string form, using the
- format seen in the stack buffer. Beware the string returned may
- not be re-readable by @code{read-expr}, for example, because of digit
- grouping. Multi-line objects like matrices produce strings that
- contain newline characters to separate the lines. The @var{w}
- parameter, if given, is the target window size for which to format
- the expressions. If @var{w} is omitted, the width of the Calculator
- window is used.@refill
- @end defun
- @defun compose-expr a prec
- Format the Calc number or formula @var{a} according to the current
- language mode, returning a ``composition.'' To learn about the
- structure of compositions, see the comments in the Calc source code.
- You can specify the format of a given type of function call by putting
- a @code{math-compose-@var{lang}} property on the function's symbol,
- whose value is a Lisp function that takes @var{a} and @var{prec} as
- arguments and returns a composition. Here @var{lang} is a language
- mode name, one of @code{normal}, @code{big}, @code{c}, @code{pascal},
- @code{fortran}, @code{tex}, @code{eqn}, @code{math}, or @code{maple}.
- In Big mode, Calc actually tries @code{math-compose-big} first, then
- tries @code{math-compose-normal}. If this property does not exist,
- or if the function returns @code{nil}, the function is written in the
- normal function-call notation for that language.
- @end defun
- @defun composition-to-string c w
- Convert a composition structure returned by @code{compose-expr} into
- a string. Multi-line compositions convert to strings containing
- newline characters. The target window size is given by @var{w}.
- The @code{format-value} function basically calls @code{compose-expr}
- followed by @code{composition-to-string}.
- @end defun
- @defun comp-width c
- Compute the width in characters of composition @var{c}.
- @end defun
- @defun comp-height c
- Compute the height in lines of composition @var{c}.
- @end defun
- @defun comp-ascent c
- Compute the portion of the height of composition @var{c} which is on or
- above the baseline. For a one-line composition, this will be one.
- @end defun
- @defun comp-descent c
- Compute the portion of the height of composition @var{c} which is below
- the baseline. For a one-line composition, this will be zero.
- @end defun
- @defun comp-first-char c
- If composition @var{c} is a ``flat'' composition, return the first
- (leftmost) character of the composition as an integer. Otherwise,
- return @code{nil}.@refill
- @end defun
- @defun comp-last-char c
- If composition @var{c} is a ``flat'' composition, return the last
- (rightmost) character, otherwise return @code{nil}.
- @end defun
- @comment @node Lisp Variables, Hooks, Formatting Lisp Functions, Internals
- @comment @subsubsection Lisp Variables
- @comment
- @comment @noindent
- @comment (This section is currently unfinished.)
- @node Hooks, , Formatting Lisp Functions, Internals
- @subsubsection Hooks
- @noindent
- Hooks are variables which contain Lisp functions (or lists of functions)
- which are called at various times. Calc defines a number of hooks
- that help you to customize it in various ways. Calc uses the Lisp
- function @code{run-hooks} to invoke the hooks shown below. Several
- other customization-related variables are also described here.
- @defvar calc-load-hook
- This hook is called at the end of @file{calc.el}, after the file has
- been loaded, before any functions in it have been called, but after
- @code{calc-mode-map} and similar variables have been set up.
- @end defvar
- @defvar calc-ext-load-hook
- This hook is called at the end of @file{calc-ext.el}.
- @end defvar
- @defvar calc-start-hook
- This hook is called as the last step in a @kbd{M-x calc} command.
- At this point, the Calc buffer has been created and initialized if
- necessary, the Calc window and trail window have been created,
- and the ``Welcome to Calc'' message has been displayed.
- @end defvar
- @defvar calc-mode-hook
- This hook is called when the Calc buffer is being created. Usually
- this will only happen once per Emacs session. The hook is called
- after Emacs has switched to the new buffer, the mode-settings file
- has been read if necessary, and all other buffer-local variables
- have been set up. After this hook returns, Calc will perform a
- @code{calc-refresh} operation, set up the mode line display, then
- evaluate any deferred @code{calc-define} properties that have not
- been evaluated yet.
- @end defvar
- @defvar calc-trail-mode-hook
- This hook is called when the Calc Trail buffer is being created.
- It is called as the very last step of setting up the Trail buffer.
- Like @code{calc-mode-hook}, this will normally happen only once
- per Emacs session.
- @end defvar
- @defvar calc-end-hook
- This hook is called by @code{calc-quit}, generally because the user
- presses @kbd{q} or @kbd{M-# c} while in Calc. The Calc buffer will
- be the current buffer. The hook is called as the very first
- step, before the Calc window is destroyed.
- @end defvar
- @defvar calc-window-hook
- If this hook exists, it is called to create the Calc window.
- Upon return, this new Calc window should be the current window.
- (The Calc buffer will already be the current buffer when the
- hook is called.) If the hook is not defined, Calc will
- generally use @code{split-window}, @code{set-window-buffer},
- and @code{select-window} to create the Calc window.
- @end defvar
- @defvar calc-trail-window-hook
- If this hook exists, it is called to create the Calc Trail window.
- The variable @code{calc-trail-buffer} will contain the buffer
- which the window should use. Unlike @code{calc-window-hook},
- this hook must @emph{not} switch into the new window.
- @end defvar
- @defvar calc-edit-mode-hook
- This hook is called by @code{calc-edit} (and the other ``edit''
- commands) when the temporary editing buffer is being created.
- The buffer will have been selected and set up to be in
- @code{calc-edit-mode}, but will not yet have been filled with
- text. (In fact it may still have leftover text from a previous
- @code{calc-edit} command.)
- @end defvar
- @defvar calc-mode-save-hook
- This hook is called by the @code{calc-save-modes} command,
- after Calc's own mode features have been inserted into the
- @file{.emacs} buffer and just before the ``End of mode settings''
- message is inserted.
- @end defvar
- @defvar calc-reset-hook
- This hook is called after @kbd{M-# 0} (@code{calc-reset}) has
- reset all modes. The Calc buffer will be the current buffer.
- @end defvar
- @defvar calc-other-modes
- This variable contains a list of strings. The strings are
- concatenated at the end of the modes portion of the Calc
- mode line (after standard modes such as ``Deg'', ``Inv'' and
- ``Hyp''). Each string should be a short, single word followed
- by a space. The variable is @code{nil} by default.
- @end defvar
- @defvar calc-mode-map
- This is the keymap that is used by Calc mode. The best time
- to adjust it is probably in a @code{calc-mode-hook}. If the
- Calc extensions package (@file{calc-ext.el}) has not yet been
- loaded, many of these keys will be bound to @code{calc-missing-key},
- which is a command that loads the extensions package and
- ``retypes'' the key. If your @code{calc-mode-hook} rebinds
- one of these keys, it will probably be overridden when the
- extensions are loaded.
- @end defvar
- @defvar calc-digit-map
- This is the keymap that is used during numeric entry. Numeric
- entry uses the minibuffer, but this map binds every non-numeric
- key to @code{calcDigit-nondigit} which generally calls
- @code{exit-minibuffer} and ``retypes'' the key.
- @end defvar
- @defvar calc-alg-ent-map
- This is the keymap that is used during algebraic entry. This is
- mostly a copy of @code{minibuffer-local-map}.
- @end defvar
- @defvar calc-store-var-map
- This is the keymap that is used during entry of variable names for
- commands like @code{calc-store} and @code{calc-recall}. This is
- mostly a copy of @code{minibuffer-local-completion-map}.
- @end defvar
- @defvar calc-edit-mode-map
- This is the (sparse) keymap used by @code{calc-edit} and other
- temporary editing commands. It binds @key{RET}, @key{LFD},
- and @kbd{C-c C-c} to @code{calc-edit-finish}.
- @end defvar
- @defvar calc-mode-var-list
- This is a list of variables which are saved by @code{calc-save-modes}.
- Each entry is a list of two items, the variable (as a Lisp symbol)
- and its default value. When modes are being saved, each variable
- is compared with its default value (using @code{equal}) and any
- non-default variables are written out.
- @end defvar
- @defvar calc-local-var-list
- This is a list of variables which should be buffer-local to the
- Calc buffer. Each entry is a variable name (as a Lisp symbol).
- These variables also have their default values manipulated by
- the @code{calc} and @code{calc-quit} commands; @pxref{Multiple Calculators}.
- Since @code{calc-mode-hook} is called after this list has been
- used the first time, your hook should add a variable to the
- list and also call @code{make-local-variable} itself.
- @end defvar
- @node Installation, Reporting Bugs, Programming, Top
- @appendix Installation
- @noindent
- As of Calc 2.02g, Calc is integrated with GNU Emacs, and thus requires
- no separate installation of its Lisp files and this manual.
- @appendixsec The GNUPLOT Program
- @noindent
- Calc's graphing commands use the GNUPLOT program. If you have GNUPLOT
- but you must type some command other than @file{gnuplot} to get it,
- you should add a command to set the Lisp variable @code{calc-gnuplot-name}
- to the appropriate file name. You may also need to change the variables
- @code{calc-gnuplot-plot-command} and @code{calc-gnuplot-print-command} in
- order to get correct displays and hardcopies, respectively, of your
- plots.@refill
- @ifinfo
- @example
- @end example
- @end ifinfo
- @appendixsec Printed Documentation
- @noindent
- Because the Calc manual is so large, you should only make a printed
- copy if you really need it. To print the manual, you will need the
- @TeX{} typesetting program (this is a free program by Donald Knuth
- at Stanford University) as well as the @file{texindex} program and
- @file{texinfo.tex} file, both of which can be obtained from the FSF
- as part of the @code{texinfo} package.@refill
- To print the Calc manual in one huge 470 page tome, you will need the
- source code to this manual, @file{calc.texi}, available as part of the
- Emacs source. Once you have this file, type @kbd{texi2dvi calc.texi}.
- Alternatively, change to the @file{man} subdirectory of the Emacs
- source distribution, and type @kbd{make calc.dvi}. (Don't worry if you
- get some ``overfull box'' warnings while @TeX{} runs.)
- The result will be a device-independent output file called
- @file{calc.dvi}, which you must print in whatever way is right
- for your system. On many systems, the command is
- @example
- lpr -d calc.dvi
- @end example
- @noindent
- or
- @example
- dvips calc.dvi
- @end example
- @c the bumpoddpages macro was deleted
- @ignore
- @cindex Marginal notes, adjusting
- Marginal notes for each function and key sequence normally alternate
- between the left and right sides of the page, which is correct if the
- manual is going to be bound as double-sided pages. Near the top of
- the file @file{calc.texi} you will find alternate definitions of
- the @code{\bumpoddpages} macro that put the marginal notes always on
- the same side, best if you plan to be binding single-sided pages.
- @end ignore
- @appendixsec Settings File
- @noindent
- @vindex calc-settings-file
- Another variable you might want to set is @code{calc-settings-file},
- which holds the file name in which commands like @kbd{m m} and @kbd{Z P}
- store ``permanent'' definitions. The default value for this variable
- is @code{"~/.emacs"}. If @code{calc-settings-file} does not contain
- @code{".emacs"} as a substring, and if the variable
- @code{calc-loaded-settings-file} is @code{nil}, then Calc will
- automatically load your settings file (if it exists) the first time
- Calc is invoked.@refill
- @ifinfo
- @example
- @end example
- @end ifinfo
- @appendixsec Testing the Installation
- @noindent
- To test your installation of Calc, start a new Emacs and type @kbd{M-# c}
- to make sure the autoloads and key bindings work. Type @kbd{M-# i}
- to make sure Calc can find its Info documentation. Press @kbd{q} to
- exit the Info system and @kbd{M-# c} to re-enter the Calculator.
- Type @kbd{20 S} to compute the sine of 20 degrees; this will test the
- autoloading of the extensions modules. The result should be
- 0.342020143326. Finally, press @kbd{M-# c} again to make sure the
- Calculator can exit.
- You may also wish to test the GNUPLOT interface; to plot a sine wave,
- type @kbd{' [0 ..@: 360], sin(x) @key{RET} g f}. Type @kbd{g q} when you
- are done viewing the plot.
- Calc is now ready to use. If you wish to go through the Calc Tutorial,
- press @kbd{M-# t} to begin.
- @example
- @end example
- @node Reporting Bugs, Summary, Installation, Top
- @appendix Reporting Bugs
- @noindent
- If you find a bug in Calc, send e-mail to Colin Walters,
- @example
- walters@@debian.org @r{or}
- walters@@verbum.org
- @end example
- @noindent
- (In the following text, ``I'' refers to the original Calc author, Dave
- Gillespie).
- While I cannot guarantee that I will have time to work on your bug,
- I do try to fix bugs quickly whenever I can.
- The latest version of Calc is available from Savannah, in the Emacs
- CVS tree. See @uref{http://savannah.gnu.org/projects/emacs}.
- There is an automatic command @kbd{M-x report-calc-bug} which helps
- you to report bugs. This command prompts you for a brief subject
- line, then leaves you in a mail editing buffer. Type @kbd{C-c C-c} to
- send your mail. Make sure your subject line indicates that you are
- reporting a Calc bug; this command sends mail to the maintainer's
- regular mailbox.
- If you have suggestions for additional features for Calc, I would
- love to hear them. Some have dared to suggest that Calc is already
- top-heavy with features; I really don't see what they're talking
- about, so, if you have ideas, send them right in. (I may even have
- time to implement them!)
- At the front of the source file, @file{calc.el}, is a list of ideas for
- future work which I have not had time to do. If any enthusiastic souls
- wish to take it upon themselves to work on these, I would be delighted.
- Please let me know if you plan to contribute to Calc so I can coordinate
- your efforts with mine and those of others. I will do my best to help
- you in whatever way I can.
- @c [summary]
- @node Summary, Key Index, Reporting Bugs, Top
- @appendix Calc Summary
- @noindent
- This section includes a complete list of Calc 2.02 keystroke commands.
- Each line lists the stack entries used by the command (top-of-stack
- last), the keystrokes themselves, the prompts asked by the command,
- and the result of the command (also with top-of-stack last).
- The result is expressed using the equivalent algebraic function.
- Commands which put no results on the stack show the full @kbd{M-x}
- command name in that position. Numbers preceding the result or
- command name refer to notes at the end.
- Algebraic functions and @kbd{M-x} commands that don't have corresponding
- keystrokes are not listed in this summary.
- @xref{Command Index}. @xref{Function Index}.
- @iftex
- @begingroup
- @tex
- \vskip-2\baselineskip \null
- \gdef\sumrow#1{\sumrowx#1\relax}%
- \gdef\sumrowx#1\:#2\:#3\:#4\:#5\:#6\relax{%
- \leavevmode%
- {\smallfonts
- \hbox to5em{\sl\hss#1}%
- \hbox to5em{\tt#2\hss}%
- \hbox to4em{\sl#3\hss}%
- \hbox to5em{\rm\hss#4}%
- \thinspace%
- {\tt#5}%
- {\sl#6}%
- }}%
- \gdef\sumlpar{{\rm(}}%
- \gdef\sumrpar{{\rm)}}%
- \gdef\sumcomma{{\rm,\thinspace}}%
- \gdef\sumexcl{{\rm!}}%
- \gdef\sumbreak{\vskip-2.5\baselineskip\goodbreak}%
- \gdef\minus#1{{\tt-}}%
- @end tex
- @let@:=@sumsep
- @let@r=@sumrow
- @catcode`@(=@active @let(=@sumlpar
- @catcode`@)=@active @let)=@sumrpar
- @catcode`@,=@active @let,=@sumcomma
- @catcode`@!=@active @let!=@sumexcl
- @end iftex
- @format
- @iftex
- @advance@baselineskip-2.5pt
- @let@c@sumbreak
- @end iftex
- @r{ @: M-# a @: @: 33 @:calc-embedded-activate@:}
- @r{ @: M-# b @: @: @:calc-big-or-small@:}
- @r{ @: M-# c @: @: @:calc@:}
- @r{ @: M-# d @: @: @:calc-embedded-duplicate@:}
- @r{ @: M-# e @: @: 34 @:calc-embedded@:}
- @r{ @: M-# f @:formula @: @:calc-embedded-new-formula@:}
- @r{ @: M-# g @: @: 35 @:calc-grab-region@:}
- @r{ @: M-# i @: @: @:calc-info@:}
- @r{ @: M-# j @: @: @:calc-embedded-select@:}
- @r{ @: M-# k @: @: @:calc-keypad@:}
- @r{ @: M-# l @: @: @:calc-load-everything@:}
- @r{ @: M-# m @: @: @:read-kbd-macro@:}
- @r{ @: M-# n @: @: 4 @:calc-embedded-next@:}
- @r{ @: M-# o @: @: @:calc-other-window@:}
- @r{ @: M-# p @: @: 4 @:calc-embedded-previous@:}
- @r{ @: M-# q @:formula @: @:quick-calc@:}
- @r{ @: M-# r @: @: 36 @:calc-grab-rectangle@:}
- @r{ @: M-# s @: @: @:calc-info-summary@:}
- @r{ @: M-# t @: @: @:calc-tutorial@:}
- @r{ @: M-# u @: @: @:calc-embedded-update@:}
- @r{ @: M-# w @: @: @:calc-embedded-word@:}
- @r{ @: M-# x @: @: @:calc-quit@:}
- @r{ @: M-# y @: @:1,28,49 @:calc-copy-to-buffer@:}
- @r{ @: M-# z @: @: @:calc-user-invocation@:}
- @r{ @: M-# : @: @: 36 @:calc-grab-sum-down@:}
- @r{ @: M-# _ @: @: 36 @:calc-grab-sum-across@:}
- @r{ @: M-# ` @:editing @: 30 @:calc-embedded-edit@:}
- @r{ @: M-# 0 @:(zero) @: @:calc-reset@:}
-
- @c
- @r{ @: 0-9 @:number @: @:@:number}
- @r{ @: . @:number @: @:@:0.number}
- @r{ @: _ @:number @: @:-@:number}
- @r{ @: e @:number @: @:@:1e number}
- @r{ @: # @:number @: @:@:current-radix@t{#}number}
- @r{ @: P @:(in number) @: @:+/-@:}
- @r{ @: M @:(in number) @: @:mod@:}
- @r{ @: @@ ' " @: (in number)@: @:@:HMS form}
- @r{ @: h m s @: (in number)@: @:@:HMS form}
- @c
- @r{ @: ' @:formula @: 37,46 @:@:formula}
- @r{ @: $ @:formula @: 37,46 @:$@:formula}
- @r{ @: " @:string @: 37,46 @:@:string}
-
- @c
- @r{ a b@: + @: @: 2 @:add@:(a,b) a+b}
- @r{ a b@: - @: @: 2 @:sub@:(a,b) a@minus{}b}
- @r{ a b@: * @: @: 2 @:mul@:(a,b) a b, a*b}
- @r{ a b@: / @: @: 2 @:div@:(a,b) a/b}
- @r{ a b@: ^ @: @: 2 @:pow@:(a,b) a^b}
- @r{ a b@: I ^ @: @: 2 @:nroot@:(a,b) a^(1/b)}
- @r{ a b@: % @: @: 2 @:mod@:(a,b) a%b}
- @r{ a b@: \ @: @: 2 @:idiv@:(a,b) a\b}
- @r{ a b@: : @: @: 2 @:fdiv@:(a,b)}
- @r{ a b@: | @: @: 2 @:vconcat@:(a,b) a|b}
- @r{ a b@: I | @: @: @:vconcat@:(b,a) b|a}
- @r{ a b@: H | @: @: 2 @:append@:(a,b)}
- @r{ a b@: I H | @: @: @:append@:(b,a)}
- @r{ a@: & @: @: 1 @:inv@:(a) 1/a}
- @r{ a@: ! @: @: 1 @:fact@:(a) a!}
- @r{ a@: = @: @: 1 @:evalv@:(a)}
- @r{ a@: M-% @: @: @:percent@:(a) a%}
-
- @c
- @r{ ... a@: @key{RET} @: @: 1 @:@:... a a}
- @r{ ... a@: @key{SPC} @: @: 1 @:@:... a a}
- @r{... a b@: @key{TAB} @: @: 3 @:@:... b a}
- @r{. a b c@: M-@key{TAB} @: @: 3 @:@:... b c a}
- @r{... a b@: @key{LFD} @: @: 1 @:@:... a b a}
- @r{ ... a@: @key{DEL} @: @: 1 @:@:...}
- @r{... a b@: M-@key{DEL} @: @: 1 @:@:... b}
- @r{ @: M-@key{RET} @: @: 4 @:calc-last-args@:}
- @r{ a@: ` @:editing @: 1,30 @:calc-edit@:}
-
- @c
- @r{ ... a@: C-d @: @: 1 @:@:...}
- @r{ @: C-k @: @: 27 @:calc-kill@:}
- @r{ @: C-w @: @: 27 @:calc-kill-region@:}
- @r{ @: C-y @: @: @:calc-yank@:}
- @r{ @: C-_ @: @: 4 @:calc-undo@:}
- @r{ @: M-k @: @: 27 @:calc-copy-as-kill@:}
- @r{ @: M-w @: @: 27 @:calc-copy-region-as-kill@:}
-
- @c
- @r{ @: [ @: @: @:@:[...}
- @r{[.. a b@: ] @: @: @:@:[a,b]}
- @r{ @: ( @: @: @:@:(...}
- @r{(.. a b@: ) @: @: @:@:(a,b)}
- @r{ @: , @: @: @:@:vector or rect complex}
- @r{ @: ; @: @: @:@:matrix or polar complex}
- @r{ @: .. @: @: @:@:interval}
- @c
- @r{ @: ~ @: @: @:calc-num-prefix@:}
- @r{ @: < @: @: 4 @:calc-scroll-left@:}
- @r{ @: > @: @: 4 @:calc-scroll-right@:}
- @r{ @: @{ @: @: 4 @:calc-scroll-down@:}
- @r{ @: @} @: @: 4 @:calc-scroll-up@:}
- @r{ @: ? @: @: @:calc-help@:}
-
- @c
- @r{ a@: n @: @: 1 @:neg@:(a) @minus{}a}
- @r{ @: o @: @: 4 @:calc-realign@:}
- @r{ @: p @:precision @: 31 @:calc-precision@:}
- @r{ @: q @: @: @:calc-quit@:}
- @r{ @: w @: @: @:calc-why@:}
- @r{ @: x @:command @: @:M-x calc-@:command}
- @r{ a@: y @: @:1,28,49 @:calc-copy-to-buffer@:}
-
- @c
- @r{ a@: A @: @: 1 @:abs@:(a)}
- @r{ a b@: B @: @: 2 @:log@:(a,b)}
- @r{ a b@: I B @: @: 2 @:alog@:(a,b) b^a}
- @r{ a@: C @: @: 1 @:cos@:(a)}
- @r{ a@: I C @: @: 1 @:arccos@:(a)}
- @r{ a@: H C @: @: 1 @:cosh@:(a)}
- @r{ a@: I H C @: @: 1 @:arccosh@:(a)}
- @r{ @: D @: @: 4 @:calc-redo@:}
- @r{ a@: E @: @: 1 @:exp@:(a)}
- @r{ a@: H E @: @: 1 @:exp10@:(a) 10.^a}
- @r{ a@: F @: @: 1,11 @:floor@:(a,d)}
- @r{ a@: I F @: @: 1,11 @:ceil@:(a,d)}
- @r{ a@: H F @: @: 1,11 @:ffloor@:(a,d)}
- @r{ a@: I H F @: @: 1,11 @:fceil@:(a,d)}
- @r{ a@: G @: @: 1 @:arg@:(a)}
- @r{ @: H @:command @: 32 @:@:Hyperbolic}
- @r{ @: I @:command @: 32 @:@:Inverse}
- @r{ a@: J @: @: 1 @:conj@:(a)}
- @r{ @: K @:command @: 32 @:@:Keep-args}
- @r{ a@: L @: @: 1 @:ln@:(a)}
- @r{ a@: H L @: @: 1 @:log10@:(a)}
- @r{ @: M @: @: @:calc-more-recursion-depth@:}
- @r{ @: I M @: @: @:calc-less-recursion-depth@:}
- @r{ a@: N @: @: 5 @:evalvn@:(a)}
- @r{ @: P @: @: @:@:pi}
- @r{ @: I P @: @: @:@:gamma}
- @r{ @: H P @: @: @:@:e}
- @r{ @: I H P @: @: @:@:phi}
- @r{ a@: Q @: @: 1 @:sqrt@:(a)}
- @r{ a@: I Q @: @: 1 @:sqr@:(a) a^2}
- @r{ a@: R @: @: 1,11 @:round@:(a,d)}
- @r{ a@: I R @: @: 1,11 @:trunc@:(a,d)}
- @r{ a@: H R @: @: 1,11 @:fround@:(a,d)}
- @r{ a@: I H R @: @: 1,11 @:ftrunc@:(a,d)}
- @r{ a@: S @: @: 1 @:sin@:(a)}
- @r{ a@: I S @: @: 1 @:arcsin@:(a)}
- @r{ a@: H S @: @: 1 @:sinh@:(a)}
- @r{ a@: I H S @: @: 1 @:arcsinh@:(a)}
- @r{ a@: T @: @: 1 @:tan@:(a)}
- @r{ a@: I T @: @: 1 @:arctan@:(a)}
- @r{ a@: H T @: @: 1 @:tanh@:(a)}
- @r{ a@: I H T @: @: 1 @:arctanh@:(a)}
- @r{ @: U @: @: 4 @:calc-undo@:}
- @r{ @: X @: @: 4 @:calc-call-last-kbd-macro@:}
-
- @c
- @r{ a b@: a = @: @: 2 @:eq@:(a,b) a=b}
- @r{ a b@: a # @: @: 2 @:neq@:(a,b) a!=b}
- @r{ a b@: a < @: @: 2 @:lt@:(a,b) a<b}
- @r{ a b@: a > @: @: 2 @:gt@:(a,b) a>b}
- @r{ a b@: a [ @: @: 2 @:leq@:(a,b) a<=b}
- @r{ a b@: a ] @: @: 2 @:geq@:(a,b) a>=b}
- @r{ a b@: a @{ @: @: 2 @:in@:(a,b)}
- @r{ a b@: a & @: @: 2,45 @:land@:(a,b) a&&b}
- @r{ a b@: a | @: @: 2,45 @:lor@:(a,b) a||b}
- @r{ a@: a ! @: @: 1,45 @:lnot@:(a) !a}
- @r{ a b c@: a : @: @: 45 @:if@:(a,b,c) a?b:c}
- @r{ a@: a . @: @: 1 @:rmeq@:(a)}
- @r{ a@: a " @: @: 7,8 @:calc-expand-formula@:}
-
- @c
- @r{ a@: a + @:i, l, h @: 6,38 @:sum@:(a,i,l,h)}
- @r{ a@: a - @:i, l, h @: 6,38 @:asum@:(a,i,l,h)}
- @r{ a@: a * @:i, l, h @: 6,38 @:prod@:(a,i,l,h)}
- @r{ a b@: a _ @: @: 2 @:subscr@:(a,b) a_b}
-
- @c
- @r{ a b@: a \ @: @: 2 @:pdiv@:(a,b)}
- @r{ a b@: a % @: @: 2 @:prem@:(a,b)}
- @r{ a b@: a / @: @: 2 @:pdivrem@:(a,b) [q,r]}
- @r{ a b@: H a / @: @: 2 @:pdivide@:(a,b) q+r/b}
-
- @c
- @r{ a@: a a @: @: 1 @:apart@:(a)}
- @r{ a@: a b @:old, new @: 38 @:subst@:(a,old,new)}
- @r{ a@: a c @:v @: 38 @:collect@:(a,v)}
- @r{ a@: a d @:v @: 4,38 @:deriv@:(a,v)}
- @r{ a@: H a d @:v @: 4,38 @:tderiv@:(a,v)}
- @r{ a@: a e @: @: @:esimplify@:(a)}
- @r{ a@: a f @: @: 1 @:factor@:(a)}
- @r{ a@: H a f @: @: 1 @:factors@:(a)}
- @r{ a b@: a g @: @: 2 @:pgcd@:(a,b)}
- @r{ a@: a i @:v @: 38 @:integ@:(a,v)}
- @r{ a@: a m @:pats @: 38 @:match@:(a,pats)}
- @r{ a@: I a m @:pats @: 38 @:matchnot@:(a,pats)}
- @r{ data x@: a p @: @: 28 @:polint@:(data,x)}
- @r{ data x@: H a p @: @: 28 @:ratint@:(data,x)}
- @r{ a@: a n @: @: 1 @:nrat@:(a)}
- @r{ a@: a r @:rules @:4,8,38 @:rewrite@:(a,rules,n)}
- @r{ a@: a s @: @: @:simplify@:(a)}
- @r{ a@: a t @:v, n @: 31,39 @:taylor@:(a,v,n)}
- @r{ a@: a v @: @: 7,8 @:calc-alg-evaluate@:}
- @r{ a@: a x @: @: 4,8 @:expand@:(a)}
-
- @c
- @r{ data@: a F @:model, vars @: 48 @:fit@:(m,iv,pv,data)}
- @r{ data@: I a F @:model, vars @: 48 @:xfit@:(m,iv,pv,data)}
- @r{ data@: H a F @:model, vars @: 48 @:efit@:(m,iv,pv,data)}
- @r{ a@: a I @:v, l, h @: 38 @:ninteg@:(a,v,l,h)}
- @r{ a b@: a M @:op @: 22 @:mapeq@:(op,a,b)}
- @r{ a b@: I a M @:op @: 22 @:mapeqr@:(op,a,b)}
- @r{ a b@: H a M @:op @: 22 @:mapeqp@:(op,a,b)}
- @r{ a g@: a N @:v @: 38 @:minimize@:(a,v,g)}
- @r{ a g@: H a N @:v @: 38 @:wminimize@:(a,v,g)}
- @r{ a@: a P @:v @: 38 @:roots@:(a,v)}
- @r{ a g@: a R @:v @: 38 @:root@:(a,v,g)}
- @r{ a g@: H a R @:v @: 38 @:wroot@:(a,v,g)}
- @r{ a@: a S @:v @: 38 @:solve@:(a,v)}
- @r{ a@: I a S @:v @: 38 @:finv@:(a,v)}
- @r{ a@: H a S @:v @: 38 @:fsolve@:(a,v)}
- @r{ a@: I H a S @:v @: 38 @:ffinv@:(a,v)}
- @r{ a@: a T @:i, l, h @: 6,38 @:table@:(a,i,l,h)}
- @r{ a g@: a X @:v @: 38 @:maximize@:(a,v,g)}
- @r{ a g@: H a X @:v @: 38 @:wmaximize@:(a,v,g)}
-
- @c
- @r{ a b@: b a @: @: 9 @:and@:(a,b,w)}
- @r{ a@: b c @: @: 9 @:clip@:(a,w)}
- @r{ a b@: b d @: @: 9 @:diff@:(a,b,w)}
- @r{ a@: b l @: @: 10 @:lsh@:(a,n,w)}
- @r{ a n@: H b l @: @: 9 @:lsh@:(a,n,w)}
- @r{ a@: b n @: @: 9 @:not@:(a,w)}
- @r{ a b@: b o @: @: 9 @:or@:(a,b,w)}
- @r{ v@: b p @: @: 1 @:vpack@:(v)}
- @r{ a@: b r @: @: 10 @:rsh@:(a,n,w)}
- @r{ a n@: H b r @: @: 9 @:rsh@:(a,n,w)}
- @r{ a@: b t @: @: 10 @:rot@:(a,n,w)}
- @r{ a n@: H b t @: @: 9 @:rot@:(a,n,w)}
- @r{ a@: b u @: @: 1 @:vunpack@:(a)}
- @r{ @: b w @:w @: 9,50 @:calc-word-size@:}
- @r{ a b@: b x @: @: 9 @:xor@:(a,b,w)}
-
- @c
- @r{c s l p@: b D @: @: @:ddb@:(c,s,l,p)}
- @r{ r n p@: b F @: @: @:fv@:(r,n,p)}
- @r{ r n p@: I b F @: @: @:fvb@:(r,n,p)}
- @r{ r n p@: H b F @: @: @:fvl@:(r,n,p)}
- @r{ v@: b I @: @: 19 @:irr@:(v)}
- @r{ v@: I b I @: @: 19 @:irrb@:(v)}
- @r{ a@: b L @: @: 10 @:ash@:(a,n,w)}
- @r{ a n@: H b L @: @: 9 @:ash@:(a,n,w)}
- @r{ r n a@: b M @: @: @:pmt@:(r,n,a)}
- @r{ r n a@: I b M @: @: @:pmtb@:(r,n,a)}
- @r{ r n a@: H b M @: @: @:pmtl@:(r,n,a)}
- @r{ r v@: b N @: @: 19 @:npv@:(r,v)}
- @r{ r v@: I b N @: @: 19 @:npvb@:(r,v)}
- @r{ r n p@: b P @: @: @:pv@:(r,n,p)}
- @r{ r n p@: I b P @: @: @:pvb@:(r,n,p)}
- @r{ r n p@: H b P @: @: @:pvl@:(r,n,p)}
- @r{ a@: b R @: @: 10 @:rash@:(a,n,w)}
- @r{ a n@: H b R @: @: 9 @:rash@:(a,n,w)}
- @r{ c s l@: b S @: @: @:sln@:(c,s,l)}
- @r{ n p a@: b T @: @: @:rate@:(n,p,a)}
- @r{ n p a@: I b T @: @: @:rateb@:(n,p,a)}
- @r{ n p a@: H b T @: @: @:ratel@:(n,p,a)}
- @r{c s l p@: b Y @: @: @:syd@:(c,s,l,p)}
- @r{ r p a@: b # @: @: @:nper@:(r,p,a)}
- @r{ r p a@: I b # @: @: @:nperb@:(r,p,a)}
- @r{ r p a@: H b # @: @: @:nperl@:(r,p,a)}
- @r{ a b@: b % @: @: @:relch@:(a,b)}
-
- @c
- @r{ a@: c c @: @: 5 @:pclean@:(a,p)}
- @r{ a@: c 0-9 @: @: @:pclean@:(a,p)}
- @r{ a@: H c c @: @: 5 @:clean@:(a,p)}
- @r{ a@: H c 0-9 @: @: @:clean@:(a,p)}
- @r{ a@: c d @: @: 1 @:deg@:(a)}
- @r{ a@: c f @: @: 1 @:pfloat@:(a)}
- @r{ a@: H c f @: @: 1 @:float@:(a)}
- @r{ a@: c h @: @: 1 @:hms@:(a)}
- @r{ a@: c p @: @: @:polar@:(a)}
- @r{ a@: I c p @: @: @:rect@:(a)}
- @r{ a@: c r @: @: 1 @:rad@:(a)}
-
- @c
- @r{ a@: c F @: @: 5 @:pfrac@:(a,p)}
- @r{ a@: H c F @: @: 5 @:frac@:(a,p)}
-
- @c
- @r{ a@: c % @: @: @:percent@:(a*100)}
-
- @c
- @r{ @: d . @:char @: 50 @:calc-point-char@:}
- @r{ @: d , @:char @: 50 @:calc-group-char@:}
- @r{ @: d < @: @: 13,50 @:calc-left-justify@:}
- @r{ @: d = @: @: 13,50 @:calc-center-justify@:}
- @r{ @: d > @: @: 13,50 @:calc-right-justify@:}
- @r{ @: d @{ @:label @: 50 @:calc-left-label@:}
- @r{ @: d @} @:label @: 50 @:calc-right-label@:}
- @r{ @: d [ @: @: 4 @:calc-truncate-up@:}
- @r{ @: d ] @: @: 4 @:calc-truncate-down@:}
- @r{ @: d " @: @: 12,50 @:calc-display-strings@:}
- @r{ @: d @key{SPC} @: @: @:calc-refresh@:}
- @r{ @: d @key{RET} @: @: 1 @:calc-refresh-top@:}
-
- @c
- @r{ @: d 0 @: @: 50 @:calc-decimal-radix@:}
- @r{ @: d 2 @: @: 50 @:calc-binary-radix@:}
- @r{ @: d 6 @: @: 50 @:calc-hex-radix@:}
- @r{ @: d 8 @: @: 50 @:calc-octal-radix@:}
-
- @c
- @r{ @: d b @: @:12,13,50 @:calc-line-breaking@:}
- @r{ @: d c @: @: 50 @:calc-complex-notation@:}
- @r{ @: d d @:format @: 50 @:calc-date-notation@:}
- @r{ @: d e @: @: 5,50 @:calc-eng-notation@:}
- @r{ @: d f @:num @: 31,50 @:calc-fix-notation@:}
- @r{ @: d g @: @:12,13,50 @:calc-group-digits@:}
- @r{ @: d h @:format @: 50 @:calc-hms-notation@:}
- @r{ @: d i @: @: 50 @:calc-i-notation@:}
- @r{ @: d j @: @: 50 @:calc-j-notation@:}
- @r{ @: d l @: @: 12,50 @:calc-line-numbering@:}
- @r{ @: d n @: @: 5,50 @:calc-normal-notation@:}
- @r{ @: d o @:format @: 50 @:calc-over-notation@:}
- @r{ @: d p @: @: 12,50 @:calc-show-plain@:}
- @r{ @: d r @:radix @: 31,50 @:calc-radix@:}
- @r{ @: d s @: @: 5,50 @:calc-sci-notation@:}
- @r{ @: d t @: @: 27 @:calc-truncate-stack@:}
- @r{ @: d w @: @: 12,13 @:calc-auto-why@:}
- @r{ @: d z @: @: 12,50 @:calc-leading-zeros@:}
-
- @c
- @r{ @: d B @: @: 50 @:calc-big-language@:}
- @r{ @: d C @: @: 50 @:calc-c-language@:}
- @r{ @: d E @: @: 50 @:calc-eqn-language@:}
- @r{ @: d F @: @: 50 @:calc-fortran-language@:}
- @r{ @: d M @: @: 50 @:calc-mathematica-language@:}
- @r{ @: d N @: @: 50 @:calc-normal-language@:}
- @r{ @: d O @: @: 50 @:calc-flat-language@:}
- @r{ @: d P @: @: 50 @:calc-pascal-language@:}
- @r{ @: d T @: @: 50 @:calc-tex-language@:}
- @r{ @: d U @: @: 50 @:calc-unformatted-language@:}
- @r{ @: d W @: @: 50 @:calc-maple-language@:}
-
- @c
- @r{ a@: f [ @: @: 4 @:decr@:(a,n)}
- @r{ a@: f ] @: @: 4 @:incr@:(a,n)}
-
- @c
- @r{ a b@: f b @: @: 2 @:beta@:(a,b)}
- @r{ a@: f e @: @: 1 @:erf@:(a)}
- @r{ a@: I f e @: @: 1 @:erfc@:(a)}
- @r{ a@: f g @: @: 1 @:gamma@:(a)}
- @r{ a b@: f h @: @: 2 @:hypot@:(a,b)}
- @r{ a@: f i @: @: 1 @:im@:(a)}
- @r{ n a@: f j @: @: 2 @:besJ@:(n,a)}
- @r{ a b@: f n @: @: 2 @:min@:(a,b)}
- @r{ a@: f r @: @: 1 @:re@:(a)}
- @r{ a@: f s @: @: 1 @:sign@:(a)}
- @r{ a b@: f x @: @: 2 @:max@:(a,b)}
- @r{ n a@: f y @: @: 2 @:besY@:(n,a)}
-
- @c
- @r{ a@: f A @: @: 1 @:abssqr@:(a)}
- @r{ x a b@: f B @: @: @:betaI@:(x,a,b)}
- @r{ x a b@: H f B @: @: @:betaB@:(x,a,b)}
- @r{ a@: f E @: @: 1 @:expm1@:(a)}
- @r{ a x@: f G @: @: 2 @:gammaP@:(a,x)}
- @r{ a x@: I f G @: @: 2 @:gammaQ@:(a,x)}
- @r{ a x@: H f G @: @: 2 @:gammag@:(a,x)}
- @r{ a x@: I H f G @: @: 2 @:gammaG@:(a,x)}
- @r{ a b@: f I @: @: 2 @:ilog@:(a,b)}
- @r{ a b@: I f I @: @: 2 @:alog@:(a,b) b^a}
- @r{ a@: f L @: @: 1 @:lnp1@:(a)}
- @r{ a@: f M @: @: 1 @:mant@:(a)}
- @r{ a@: f Q @: @: 1 @:isqrt@:(a)}
- @r{ a@: I f Q @: @: 1 @:sqr@:(a) a^2}
- @r{ a n@: f S @: @: 2 @:scf@:(a,n)}
- @r{ y x@: f T @: @: @:arctan2@:(y,x)}
- @r{ a@: f X @: @: 1 @:xpon@:(a)}
-
- @c
- @r{ x y@: g a @: @: 28,40 @:calc-graph-add@:}
- @r{ @: g b @: @: 12 @:calc-graph-border@:}
- @r{ @: g c @: @: @:calc-graph-clear@:}
- @r{ @: g d @: @: 41 @:calc-graph-delete@:}
- @r{ x y@: g f @: @: 28,40 @:calc-graph-fast@:}
- @r{ @: g g @: @: 12 @:calc-graph-grid@:}
- @r{ @: g h @:title @: @:calc-graph-header@:}
- @r{ @: g j @: @: 4 @:calc-graph-juggle@:}
- @r{ @: g k @: @: 12 @:calc-graph-key@:}
- @r{ @: g l @: @: 12 @:calc-graph-log-x@:}
- @r{ @: g n @:name @: @:calc-graph-name@:}
- @r{ @: g p @: @: 42 @:calc-graph-plot@:}
- @r{ @: g q @: @: @:calc-graph-quit@:}
- @r{ @: g r @:range @: @:calc-graph-range-x@:}
- @r{ @: g s @: @: 12,13 @:calc-graph-line-style@:}
- @r{ @: g t @:title @: @:calc-graph-title-x@:}
- @r{ @: g v @: @: @:calc-graph-view-commands@:}
- @r{ @: g x @:display @: @:calc-graph-display@:}
- @r{ @: g z @: @: 12 @:calc-graph-zero-x@:}
-
- @c
- @r{ x y z@: g A @: @: 28,40 @:calc-graph-add-3d@:}
- @r{ @: g C @:command @: @:calc-graph-command@:}
- @r{ @: g D @:device @: 43,44 @:calc-graph-device@:}
- @r{ x y z@: g F @: @: 28,40 @:calc-graph-fast-3d@:}
- @r{ @: g H @: @: 12 @:calc-graph-hide@:}
- @r{ @: g K @: @: @:calc-graph-kill@:}
- @r{ @: g L @: @: 12 @:calc-graph-log-y@:}
- @r{ @: g N @:number @: 43,51 @:calc-graph-num-points@:}
- @r{ @: g O @:filename @: 43,44 @:calc-graph-output@:}
- @r{ @: g P @: @: 42 @:calc-graph-print@:}
- @r{ @: g R @:range @: @:calc-graph-range-y@:}
- @r{ @: g S @: @: 12,13 @:calc-graph-point-style@:}
- @r{ @: g T @:title @: @:calc-graph-title-y@:}
- @r{ @: g V @: @: @:calc-graph-view-trail@:}
- @r{ @: g X @:format @: @:calc-graph-geometry@:}
- @r{ @: g Z @: @: 12 @:calc-graph-zero-y@:}
-
- @c
- @r{ @: g C-l @: @: 12 @:calc-graph-log-z@:}
- @r{ @: g C-r @:range @: @:calc-graph-range-z@:}
- @r{ @: g C-t @:title @: @:calc-graph-title-z@:}
-
- @c
- @r{ @: h b @: @: @:calc-describe-bindings@:}
- @r{ @: h c @:key @: @:calc-describe-key-briefly@:}
- @r{ @: h f @:function @: @:calc-describe-function@:}
- @r{ @: h h @: @: @:calc-full-help@:}
- @r{ @: h i @: @: @:calc-info@:}
- @r{ @: h k @:key @: @:calc-describe-key@:}
- @r{ @: h n @: @: @:calc-view-news@:}
- @r{ @: h s @: @: @:calc-info-summary@:}
- @r{ @: h t @: @: @:calc-tutorial@:}
- @r{ @: h v @:var @: @:calc-describe-variable@:}
-
- @c
- @r{ @: j 1-9 @: @: @:calc-select-part@:}
- @r{ @: j @key{RET} @: @: 27 @:calc-copy-selection@:}
- @r{ @: j @key{DEL} @: @: 27 @:calc-del-selection@:}
- @r{ @: j ' @:formula @: 27 @:calc-enter-selection@:}
- @r{ @: j ` @:editing @: 27,30 @:calc-edit-selection@:}
- @r{ @: j " @: @: 7,27 @:calc-sel-expand-formula@:}
-
- @c
- @r{ @: j + @:formula @: 27 @:calc-sel-add-both-sides@:}
- @r{ @: j - @:formula @: 27 @:calc-sel-sub-both-sides@:}
- @r{ @: j * @:formula @: 27 @:calc-sel-mul-both-sides@:}
- @r{ @: j / @:formula @: 27 @:calc-sel-div-both-sides@:}
- @r{ @: j & @: @: 27 @:calc-sel-invert@:}
-
- @c
- @r{ @: j a @: @: 27 @:calc-select-additional@:}
- @r{ @: j b @: @: 12 @:calc-break-selections@:}
- @r{ @: j c @: @: @:calc-clear-selections@:}
- @r{ @: j d @: @: 12,50 @:calc-show-selections@:}
- @r{ @: j e @: @: 12 @:calc-enable-selections@:}
- @r{ @: j l @: @: 4,27 @:calc-select-less@:}
- @r{ @: j m @: @: 4,27 @:calc-select-more@:}
- @r{ @: j n @: @: 4 @:calc-select-next@:}
- @r{ @: j o @: @: 4,27 @:calc-select-once@:}
- @r{ @: j p @: @: 4 @:calc-select-previous@:}
- @r{ @: j r @:rules @:4,8,27 @:calc-rewrite-selection@:}
- @r{ @: j s @: @: 4,27 @:calc-select-here@:}
- @r{ @: j u @: @: 27 @:calc-unselect@:}
- @r{ @: j v @: @: 7,27 @:calc-sel-evaluate@:}
-
- @c
- @r{ @: j C @: @: 27 @:calc-sel-commute@:}
- @r{ @: j D @: @: 4,27 @:calc-sel-distribute@:}
- @r{ @: j E @: @: 27 @:calc-sel-jump-equals@:}
- @r{ @: j I @: @: 27 @:calc-sel-isolate@:}
- @r{ @: H j I @: @: 27 @:calc-sel-isolate@: (full)}
- @r{ @: j L @: @: 4,27 @:calc-commute-left@:}
- @r{ @: j M @: @: 27 @:calc-sel-merge@:}
- @r{ @: j N @: @: 27 @:calc-sel-negate@:}
- @r{ @: j O @: @: 4,27 @:calc-select-once-maybe@:}
- @r{ @: j R @: @: 4,27 @:calc-commute-right@:}
- @r{ @: j S @: @: 4,27 @:calc-select-here-maybe@:}
- @r{ @: j U @: @: 27 @:calc-sel-unpack@:}
-
- @c
- @r{ @: k a @: @: @:calc-random-again@:}
- @r{ n@: k b @: @: 1 @:bern@:(n)}
- @r{ n x@: H k b @: @: 2 @:bern@:(n,x)}
- @r{ n m@: k c @: @: 2 @:choose@:(n,m)}
- @r{ n m@: H k c @: @: 2 @:perm@:(n,m)}
- @r{ n@: k d @: @: 1 @:dfact@:(n) n!!}
- @r{ n@: k e @: @: 1 @:euler@:(n)}
- @r{ n x@: H k e @: @: 2 @:euler@:(n,x)}
- @r{ n@: k f @: @: 4 @:prfac@:(n)}
- @r{ n m@: k g @: @: 2 @:gcd@:(n,m)}
- @r{ m n@: k h @: @: 14 @:shuffle@:(n,m)}
- @r{ n m@: k l @: @: 2 @:lcm@:(n,m)}
- @r{ n@: k m @: @: 1 @:moebius@:(n)}
- @r{ n@: k n @: @: 4 @:nextprime@:(n)}
- @r{ n@: I k n @: @: 4 @:prevprime@:(n)}
- @r{ n@: k p @: @: 4,28 @:calc-prime-test@:}
- @r{ m@: k r @: @: 14 @:random@:(m)}
- @r{ n m@: k s @: @: 2 @:stir1@:(n,m)}
- @r{ n m@: H k s @: @: 2 @:stir2@:(n,m)}
- @r{ n@: k t @: @: 1 @:totient@:(n)}
-
- @c
- @r{ n p x@: k B @: @: @:utpb@:(x,n,p)}
- @r{ n p x@: I k B @: @: @:ltpb@:(x,n,p)}
- @r{ v x@: k C @: @: @:utpc@:(x,v)}
- @r{ v x@: I k C @: @: @:ltpc@:(x,v)}
- @r{ n m@: k E @: @: @:egcd@:(n,m)}
- @r{v1 v2 x@: k F @: @: @:utpf@:(x,v1,v2)}
- @r{v1 v2 x@: I k F @: @: @:ltpf@:(x,v1,v2)}
- @r{ m s x@: k N @: @: @:utpn@:(x,m,s)}
- @r{ m s x@: I k N @: @: @:ltpn@:(x,m,s)}
- @r{ m x@: k P @: @: @:utpp@:(x,m)}
- @r{ m x@: I k P @: @: @:ltpp@:(x,m)}
- @r{ v x@: k T @: @: @:utpt@:(x,v)}
- @r{ v x@: I k T @: @: @:ltpt@:(x,v)}
-
- @c
- @r{ @: m a @: @: 12,13 @:calc-algebraic-mode@:}
- @r{ @: m d @: @: @:calc-degrees-mode@:}
- @r{ @: m f @: @: 12 @:calc-frac-mode@:}
- @r{ @: m g @: @: 52 @:calc-get-modes@:}
- @r{ @: m h @: @: @:calc-hms-mode@:}
- @r{ @: m i @: @: 12,13 @:calc-infinite-mode@:}
- @r{ @: m m @: @: @:calc-save-modes@:}
- @r{ @: m p @: @: 12 @:calc-polar-mode@:}
- @r{ @: m r @: @: @:calc-radians-mode@:}
- @r{ @: m s @: @: 12 @:calc-symbolic-mode@:}
- @r{ @: m t @: @: 12 @:calc-total-algebraic-mode@:}
- @r{ @: m v @: @: 12,13 @:calc-matrix-mode@:}
- @r{ @: m w @: @: 13 @:calc-working@:}
- @r{ @: m x @: @: @:calc-always-load-extensions@:}
-
- @c
- @r{ @: m A @: @: 12 @:calc-alg-simplify-mode@:}
- @r{ @: m B @: @: 12 @:calc-bin-simplify-mode@:}
- @r{ @: m C @: @: 12 @:calc-auto-recompute@:}
- @r{ @: m D @: @: @:calc-default-simplify-mode@:}
- @r{ @: m E @: @: 12 @:calc-ext-simplify-mode@:}
- @r{ @: m F @:filename @: 13 @:calc-settings-file-name@:}
- @r{ @: m N @: @: 12 @:calc-num-simplify-mode@:}
- @r{ @: m O @: @: 12 @:calc-no-simplify-mode@:}
- @r{ @: m R @: @: 12,13 @:calc-mode-record-mode@:}
- @r{ @: m S @: @: 12 @:calc-shift-prefix@:}
- @r{ @: m U @: @: 12 @:calc-units-simplify-mode@:}
-
- @c
- @r{ @: s c @:var1, var2 @: 29 @:calc-copy-variable@:}
- @r{ @: s d @:var, decl @: @:calc-declare-variable@:}
- @r{ @: s e @:var, editing @: 29,30 @:calc-edit-variable@:}
- @r{ @: s i @:buffer @: @:calc-insert-variables@:}
- @r{ a b@: s l @:var @: 29 @:@:a (letting var=b)}
- @r{ a ...@: s m @:op, var @: 22,29 @:calc-store-map@:}
- @r{ @: s n @:var @: 29,47 @:calc-store-neg@: (v/-1)}
- @r{ @: s p @:var @: 29 @:calc-permanent-variable@:}
- @r{ @: s r @:var @: 29 @:@:v (recalled value)}
- @r{ @: r 0-9 @: @: @:calc-recall-quick@:}
- @r{ a@: s s @:var @: 28,29 @:calc-store@:}
- @r{ a@: s 0-9 @: @: @:calc-store-quick@:}
- @r{ a@: s t @:var @: 29 @:calc-store-into@:}
- @r{ a@: t 0-9 @: @: @:calc-store-into-quick@:}
- @r{ @: s u @:var @: 29 @:calc-unstore@:}
- @r{ a@: s x @:var @: 29 @:calc-store-exchange@:}
-
- @c
- @r{ @: s A @:editing @: 30 @:calc-edit-AlgSimpRules@:}
- @r{ @: s D @:editing @: 30 @:calc-edit-Decls@:}
- @r{ @: s E @:editing @: 30 @:calc-edit-EvalRules@:}
- @r{ @: s F @:editing @: 30 @:calc-edit-FitRules@:}
- @r{ @: s G @:editing @: 30 @:calc-edit-GenCount@:}
- @r{ @: s H @:editing @: 30 @:calc-edit-Holidays@:}
- @r{ @: s I @:editing @: 30 @:calc-edit-IntegLimit@:}
- @r{ @: s L @:editing @: 30 @:calc-edit-LineStyles@:}
- @r{ @: s P @:editing @: 30 @:calc-edit-PointStyles@:}
- @r{ @: s R @:editing @: 30 @:calc-edit-PlotRejects@:}
- @r{ @: s T @:editing @: 30 @:calc-edit-TimeZone@:}
- @r{ @: s U @:editing @: 30 @:calc-edit-Units@:}
- @r{ @: s X @:editing @: 30 @:calc-edit-ExtSimpRules@:}
-
- @c
- @r{ a@: s + @:var @: 29,47 @:calc-store-plus@: (v+a)}
- @r{ a@: s - @:var @: 29,47 @:calc-store-minus@: (v-a)}
- @r{ a@: s * @:var @: 29,47 @:calc-store-times@: (v*a)}
- @r{ a@: s / @:var @: 29,47 @:calc-store-div@: (v/a)}
- @r{ a@: s ^ @:var @: 29,47 @:calc-store-power@: (v^a)}
- @r{ a@: s | @:var @: 29,47 @:calc-store-concat@: (v|a)}
- @r{ @: s & @:var @: 29,47 @:calc-store-inv@: (v^-1)}
- @r{ @: s [ @:var @: 29,47 @:calc-store-decr@: (v-1)}
- @r{ @: s ] @:var @: 29,47 @:calc-store-incr@: (v-(-1))}
- @r{ a b@: s : @: @: 2 @:assign@:(a,b) a @t{:=} b}
- @r{ a@: s = @: @: 1 @:evalto@:(a,b) a @t{=>}}
-
- @c
- @r{ @: t [ @: @: 4 @:calc-trail-first@:}
- @r{ @: t ] @: @: 4 @:calc-trail-last@:}
- @r{ @: t < @: @: 4 @:calc-trail-scroll-left@:}
- @r{ @: t > @: @: 4 @:calc-trail-scroll-right@:}
- @r{ @: t . @: @: 12 @:calc-full-trail-vectors@:}
-
- @c
- @r{ @: t b @: @: 4 @:calc-trail-backward@:}
- @r{ @: t d @: @: 12,50 @:calc-trail-display@:}
- @r{ @: t f @: @: 4 @:calc-trail-forward@:}
- @r{ @: t h @: @: @:calc-trail-here@:}
- @r{ @: t i @: @: @:calc-trail-in@:}
- @r{ @: t k @: @: 4 @:calc-trail-kill@:}
- @r{ @: t m @:string @: @:calc-trail-marker@:}
- @r{ @: t n @: @: 4 @:calc-trail-next@:}
- @r{ @: t o @: @: @:calc-trail-out@:}
- @r{ @: t p @: @: 4 @:calc-trail-previous@:}
- @r{ @: t r @:string @: @:calc-trail-isearch-backward@:}
- @r{ @: t s @:string @: @:calc-trail-isearch-forward@:}
- @r{ @: t y @: @: 4 @:calc-trail-yank@:}
-
- @c
- @r{ d@: t C @:oz, nz @: @:tzconv@:(d,oz,nz)}
- @r{d oz nz@: t C @:$ @: @:tzconv@:(d,oz,nz)}
- @r{ d@: t D @: @: 15 @:date@:(d)}
- @r{ d@: t I @: @: 4 @:incmonth@:(d,n)}
- @r{ d@: t J @: @: 16 @:julian@:(d,z)}
- @r{ d@: t M @: @: 17 @:newmonth@:(d,n)}
- @r{ @: t N @: @: 16 @:now@:(z)}
- @r{ d@: t P @:1 @: 31 @:year@:(d)}
- @r{ d@: t P @:2 @: 31 @:month@:(d)}
- @r{ d@: t P @:3 @: 31 @:day@:(d)}
- @r{ d@: t P @:4 @: 31 @:hour@:(d)}
- @r{ d@: t P @:5 @: 31 @:minute@:(d)}
- @r{ d@: t P @:6 @: 31 @:second@:(d)}
- @r{ d@: t P @:7 @: 31 @:weekday@:(d)}
- @r{ d@: t P @:8 @: 31 @:yearday@:(d)}
- @r{ d@: t P @:9 @: 31 @:time@:(d)}
- @r{ d@: t U @: @: 16 @:unixtime@:(d,z)}
- @r{ d@: t W @: @: 17 @:newweek@:(d,w)}
- @r{ d@: t Y @: @: 17 @:newyear@:(d,n)}
-
- @c
- @r{ a b@: t + @: @: 2 @:badd@:(a,b)}
- @r{ a b@: t - @: @: 2 @:bsub@:(a,b)}
-
- @c
- @r{ @: u a @: @: 12 @:calc-autorange-units@:}
- @r{ a@: u b @: @: @:calc-base-units@:}
- @r{ a@: u c @:units @: 18 @:calc-convert-units@:}
- @r{ defn@: u d @:unit, descr @: @:calc-define-unit@:}
- @r{ @: u e @: @: @:calc-explain-units@:}
- @r{ @: u g @:unit @: @:calc-get-unit-definition@:}
- @r{ @: u p @: @: @:calc-permanent-units@:}
- @r{ a@: u r @: @: @:calc-remove-units@:}
- @r{ a@: u s @: @: @:usimplify@:(a)}
- @r{ a@: u t @:units @: 18 @:calc-convert-temperature@:}
- @r{ @: u u @:unit @: @:calc-undefine-unit@:}
- @r{ @: u v @: @: @:calc-enter-units-table@:}
- @r{ a@: u x @: @: @:calc-extract-units@:}
- @r{ a@: u 0-9 @: @: @:calc-quick-units@:}
-
- @c
- @r{ v1 v2@: u C @: @: 20 @:vcov@:(v1,v2)}
- @r{ v1 v2@: I u C @: @: 20 @:vpcov@:(v1,v2)}
- @r{ v1 v2@: H u C @: @: 20 @:vcorr@:(v1,v2)}
- @r{ v@: u G @: @: 19 @:vgmean@:(v)}
- @r{ a b@: H u G @: @: 2 @:agmean@:(a,b)}
- @r{ v@: u M @: @: 19 @:vmean@:(v)}
- @r{ v@: I u M @: @: 19 @:vmeane@:(v)}
- @r{ v@: H u M @: @: 19 @:vmedian@:(v)}
- @r{ v@: I H u M @: @: 19 @:vhmean@:(v)}
- @r{ v@: u N @: @: 19 @:vmin@:(v)}
- @r{ v@: u S @: @: 19 @:vsdev@:(v)}
- @r{ v@: I u S @: @: 19 @:vpsdev@:(v)}
- @r{ v@: H u S @: @: 19 @:vvar@:(v)}
- @r{ v@: I H u S @: @: 19 @:vpvar@:(v)}
- @r{ @: u V @: @: @:calc-view-units-table@:}
- @r{ v@: u X @: @: 19 @:vmax@:(v)}
-
- @c
- @r{ v@: u + @: @: 19 @:vsum@:(v)}
- @r{ v@: u * @: @: 19 @:vprod@:(v)}
- @r{ v@: u # @: @: 19 @:vcount@:(v)}
-
- @c
- @r{ @: V ( @: @: 50 @:calc-vector-parens@:}
- @r{ @: V @{ @: @: 50 @:calc-vector-braces@:}
- @r{ @: V [ @: @: 50 @:calc-vector-brackets@:}
- @r{ @: V ] @:ROCP @: 50 @:calc-matrix-brackets@:}
- @r{ @: V , @: @: 50 @:calc-vector-commas@:}
- @r{ @: V < @: @: 50 @:calc-matrix-left-justify@:}
- @r{ @: V = @: @: 50 @:calc-matrix-center-justify@:}
- @r{ @: V > @: @: 50 @:calc-matrix-right-justify@:}
- @r{ @: V / @: @: 12,50 @:calc-break-vectors@:}
- @r{ @: V . @: @: 12,50 @:calc-full-vectors@:}
-
- @c
- @r{ s t@: V ^ @: @: 2 @:vint@:(s,t)}
- @r{ s t@: V - @: @: 2 @:vdiff@:(s,t)}
- @r{ s@: V ~ @: @: 1 @:vcompl@:(s)}
- @r{ s@: V # @: @: 1 @:vcard@:(s)}
- @r{ s@: V : @: @: 1 @:vspan@:(s)}
- @r{ s@: V + @: @: 1 @:rdup@:(s)}
-
- @c
- @r{ m@: V & @: @: 1 @:inv@:(m) 1/m}
-
- @c
- @r{ v@: v a @:n @: @:arrange@:(v,n)}
- @r{ a@: v b @:n @: @:cvec@:(a,n)}
- @r{ v@: v c @:n >0 @: 21,31 @:mcol@:(v,n)}
- @r{ v@: v c @:n <0 @: 31 @:mrcol@:(v,-n)}
- @r{ m@: v c @:0 @: 31 @:getdiag@:(m)}
- @r{ v@: v d @: @: 25 @:diag@:(v,n)}
- @r{ v m@: v e @: @: 2 @:vexp@:(v,m)}
- @r{ v m f@: H v e @: @: 2 @:vexp@:(v,m,f)}
- @r{ v a@: v f @: @: 26 @:find@:(v,a,n)}
- @r{ v@: v h @: @: 1 @:head@:(v)}
- @r{ v@: I v h @: @: 1 @:tail@:(v)}
- @r{ v@: H v h @: @: 1 @:rhead@:(v)}
- @r{ v@: I H v h @: @: 1 @:rtail@:(v)}
- @r{ @: v i @:n @: 31 @:idn@:(1,n)}
- @r{ @: v i @:0 @: 31 @:idn@:(1)}
- @r{ h t@: v k @: @: 2 @:cons@:(h,t)}
- @r{ h t@: H v k @: @: 2 @:rcons@:(h,t)}
- @r{ v@: v l @: @: 1 @:vlen@:(v)}
- @r{ v@: H v l @: @: 1 @:mdims@:(v)}
- @r{ v m@: v m @: @: 2 @:vmask@:(v,m)}
- @r{ v@: v n @: @: 1 @:rnorm@:(v)}
- @r{ a b c@: v p @: @: 24 @:calc-pack@:}
- @r{ v@: v r @:n >0 @: 21,31 @:mrow@:(v,n)}
- @r{ v@: v r @:n <0 @: 31 @:mrrow@:(v,-n)}
- @r{ m@: v r @:0 @: 31 @:getdiag@:(m)}
- @r{ v i j@: v s @: @: @:subvec@:(v,i,j)}
- @r{ v i j@: I v s @: @: @:rsubvec@:(v,i,j)}
- @r{ m@: v t @: @: 1 @:trn@:(m)}
- @r{ v@: v u @: @: 24 @:calc-unpack@:}
- @r{ v@: v v @: @: 1 @:rev@:(v)}
- @r{ @: v x @:n @: 31 @:index@:(n)}
- @r{ n s i@: C-u v x @: @: @:index@:(n,s,i)}
-
- @c
- @r{ v@: V A @:op @: 22 @:apply@:(op,v)}
- @r{ v1 v2@: V C @: @: 2 @:cross@:(v1,v2)}
- @r{ m@: V D @: @: 1 @:det@:(m)}
- @r{ s@: V E @: @: 1 @:venum@:(s)}
- @r{ s@: V F @: @: 1 @:vfloor@:(s)}
- @r{ v@: V G @: @: @:grade@:(v)}
- @r{ v@: I V G @: @: @:rgrade@:(v)}
- @r{ v@: V H @:n @: 31 @:histogram@:(v,n)}
- @r{ v w@: H V H @:n @: 31 @:histogram@:(v,w,n)}
- @r{ v1 v2@: V I @:mop aop @: 22 @:inner@:(mop,aop,v1,v2)}
- @r{ m@: V J @: @: 1 @:ctrn@:(m)}
- @r{ m@: V L @: @: 1 @:lud@:(m)}
- @r{ v@: V M @:op @: 22,23 @:map@:(op,v)}
- @r{ v@: V N @: @: 1 @:cnorm@:(v)}
- @r{ v1 v2@: V O @:op @: 22 @:outer@:(op,v1,v2)}
- @r{ v@: V R @:op @: 22,23 @:reduce@:(op,v)}
- @r{ v@: I V R @:op @: 22,23 @:rreduce@:(op,v)}
- @r{ a n@: H V R @:op @: 22 @:nest@:(op,a,n)}
- @r{ a@: I H V R @:op @: 22 @:fixp@:(op,a)}
- @r{ v@: V S @: @: @:sort@:(v)}
- @r{ v@: I V S @: @: @:rsort@:(v)}
- @r{ m@: V T @: @: 1 @:tr@:(m)}
- @r{ v@: V U @:op @: 22 @:accum@:(op,v)}
- @r{ v@: I V U @:op @: 22 @:raccum@:(op,v)}
- @r{ a n@: H V U @:op @: 22 @:anest@:(op,a,n)}
- @r{ a@: I H V U @:op @: 22 @:afixp@:(op,a)}
- @r{ s t@: V V @: @: 2 @:vunion@:(s,t)}
- @r{ s t@: V X @: @: 2 @:vxor@:(s,t)}
-
- @c
- @r{ @: Y @: @: @:@:user commands}
-
- @c
- @r{ @: z @: @: @:@:user commands}
-
- @c
- @r{ c@: Z [ @: @: 45 @:calc-kbd-if@:}
- @r{ c@: Z | @: @: 45 @:calc-kbd-else-if@:}
- @r{ @: Z : @: @: @:calc-kbd-else@:}
- @r{ @: Z ] @: @: @:calc-kbd-end-if@:}
-
- @c
- @r{ @: Z @{ @: @: 4 @:calc-kbd-loop@:}
- @r{ c@: Z / @: @: 45 @:calc-kbd-break@:}
- @r{ @: Z @} @: @: @:calc-kbd-end-loop@:}
- @r{ n@: Z < @: @: @:calc-kbd-repeat@:}
- @r{ @: Z > @: @: @:calc-kbd-end-repeat@:}
- @r{ n m@: Z ( @: @: @:calc-kbd-for@:}
- @r{ s@: Z ) @: @: @:calc-kbd-end-for@:}
-
- @c
- @r{ @: Z C-g @: @: @:@:cancel if/loop command}
-
- @c
- @r{ @: Z ` @: @: @:calc-kbd-push@:}
- @r{ @: Z ' @: @: @:calc-kbd-pop@:}
- @r{ a@: Z = @:message @: 28 @:calc-kbd-report@:}
- @r{ @: Z # @:prompt @: @:calc-kbd-query@:}
-
- @c
- @r{ comp@: Z C @:func, args @: 50 @:calc-user-define-composition@:}
- @r{ @: Z D @:key, command @: @:calc-user-define@:}
- @r{ @: Z E @:key, editing @: 30 @:calc-user-define-edit@:}
- @r{ defn@: Z F @:k, c, f, a, n@: 28 @:calc-user-define-formula@:}
- @r{ @: Z G @:key @: @:calc-get-user-defn@:}
- @r{ @: Z I @: @: @:calc-user-define-invocation@:}
- @r{ @: Z K @:key, command @: @:calc-user-define-kbd-macro@:}
- @r{ @: Z P @:key @: @:calc-user-define-permanent@:}
- @r{ @: Z S @: @: 30 @:calc-edit-user-syntax@:}
- @r{ @: Z T @: @: 12 @:calc-timing@:}
- @r{ @: Z U @:key @: @:calc-user-undefine@:}
- @end format
- @noindent
- NOTES
- @enumerate
- @c 1
- @item
- Positive prefix arguments apply to @cite{n} stack entries.
- Negative prefix arguments apply to the @cite{-n}th stack entry.
- A prefix of zero applies to the entire stack. (For @key{LFD} and
- @kbd{M-@key{DEL}}, the meaning of the sign is reversed.)
- @c 2
- @item
- Positive prefix arguments apply to @cite{n} stack entries.
- Negative prefix arguments apply to the top stack entry
- and the next @cite{-n} stack entries.
- @c 3
- @item
- Positive prefix arguments rotate top @cite{n} stack entries by one.
- Negative prefix arguments rotate the entire stack by @cite{-n}.
- A prefix of zero reverses the entire stack.
- @c 4
- @item
- Prefix argument specifies a repeat count or distance.
- @c 5
- @item
- Positive prefix arguments specify a precision @cite{p}.
- Negative prefix arguments reduce the current precision by @cite{-p}.
- @c 6
- @item
- A prefix argument is interpreted as an additional step-size parameter.
- A plain @kbd{C-u} prefix means to prompt for the step size.
- @c 7
- @item
- A prefix argument specifies simplification level and depth.
- 1=Default, 2=like @kbd{a s}, 3=like @kbd{a e}.
- @c 8
- @item
- A negative prefix operates only on the top level of the input formula.
- @c 9
- @item
- Positive prefix arguments specify a word size of @cite{w} bits, unsigned.
- Negative prefix arguments specify a word size of @cite{w} bits, signed.
- @c 10
- @item
- Prefix arguments specify the shift amount @cite{n}. The @cite{w} argument
- cannot be specified in the keyboard version of this command.
- @c 11
- @item
- From the keyboard, @cite{d} is omitted and defaults to zero.
- @c 12
- @item
- Mode is toggled; a positive prefix always sets the mode, and a negative
- prefix always clears the mode.
- @c 13
- @item
- Some prefix argument values provide special variations of the mode.
- @c 14
- @item
- A prefix argument, if any, is used for @cite{m} instead of taking
- @cite{m} from the stack. @cite{M} may take any of these values:
- @iftex
- {@advance@tableindent10pt
- @end iftex
- @table @asis
- @item Integer
- Random integer in the interval @cite{[0 .. m)}.
- @item Float
- Random floating-point number in the interval @cite{[0 .. m)}.
- @item 0.0
- Gaussian with mean 1 and standard deviation 0.
- @item Error form
- Gaussian with specified mean and standard deviation.
- @item Interval
- Random integer or floating-point number in that interval.
- @item Vector
- Random element from the vector.
- @end table
- @iftex
- }
- @end iftex
- @c 15
- @item
- A prefix argument from 1 to 6 specifies number of date components
- to remove from the stack. @xref{Date Conversions}.
- @c 16
- @item
- A prefix argument specifies a time zone; @kbd{C-u} says to take the
- time zone number or name from the top of the stack. @xref{Time Zones}.
- @c 17
- @item
- A prefix argument specifies a day number (0-6, 0-31, or 0-366).
- @c 18
- @item
- If the input has no units, you will be prompted for both the old and
- the new units.
- @c 19
- @item
- With a prefix argument, collect that many stack entries to form the
- input data set. Each entry may be a single value or a vector of values.
- @c 20
- @item
- With a prefix argument of 1, take a single @c{$@var{n}\times2$}
- @i{@var{N}x2} matrix from the
- stack instead of two separate data vectors.
- @c 21
- @item
- The row or column number @cite{n} may be given as a numeric prefix
- argument instead. A plain @kbd{C-u} prefix says to take @cite{n}
- from the top of the stack. If @cite{n} is a vector or interval,
- a subvector/submatrix of the input is created.
- @c 22
- @item
- The @cite{op} prompt can be answered with the key sequence for the
- desired function, or with @kbd{x} or @kbd{z} followed by a function name,
- or with @kbd{$} to take a formula from the top of the stack, or with
- @kbd{'} and a typed formula. In the last two cases, the formula may
- be a nameless function like @samp{<#1+#2>} or @samp{<x, y : x+y>}, or it
- may include @kbd{$}, @kbd{$$}, etc. (where @kbd{$} will correspond to the
- last argument of the created function), or otherwise you will be
- prompted for an argument list. The number of vectors popped from the
- stack by @kbd{V M} depends on the number of arguments of the function.
- @c 23
- @item
- One of the mapping direction keys @kbd{_} (horizontal, i.e., map
- by rows or reduce across), @kbd{:} (vertical, i.e., map by columns or
- reduce down), or @kbd{=} (map or reduce by rows) may be used before
- entering @cite{op}; these modify the function name by adding the letter
- @code{r} for ``rows,'' @code{c} for ``columns,'' @code{a} for ``across,''
- or @code{d} for ``down.''
- @c 24
- @item
- The prefix argument specifies a packing mode. A nonnegative mode
- is the number of items (for @kbd{v p}) or the number of levels
- (for @kbd{v u}). A negative mode is as described below. With no
- prefix argument, the mode is taken from the top of the stack and
- may be an integer or a vector of integers.
- @iftex
- {@advance@tableindent-20pt
- @end iftex
- @table @cite
- @item -1
- (@var{2}) Rectangular complex number.
- @item -2
- (@var{2}) Polar complex number.
- @item -3
- (@var{3}) HMS form.
- @item -4
- (@var{2}) Error form.
- @item -5
- (@var{2}) Modulo form.
- @item -6
- (@var{2}) Closed interval.
- @item -7
- (@var{2}) Closed .. open interval.
- @item -8
- (@var{2}) Open .. closed interval.
- @item -9
- (@var{2}) Open interval.
- @item -10
- (@var{2}) Fraction.
- @item -11
- (@var{2}) Float with integer mantissa.
- @item -12
- (@var{2}) Float with mantissa in @cite{[1 .. 10)}.
- @item -13
- (@var{1}) Date form (using date numbers).
- @item -14
- (@var{3}) Date form (using year, month, day).
- @item -15
- (@var{6}) Date form (using year, month, day, hour, minute, second).
- @end table
- @iftex
- }
- @end iftex
- @c 25
- @item
- A prefix argument specifies the size @cite{n} of the matrix. With no
- prefix argument, @cite{n} is omitted and the size is inferred from
- the input vector.
- @c 26
- @item
- The prefix argument specifies the starting position @cite{n} (default 1).
- @c 27
- @item
- Cursor position within stack buffer affects this command.
- @c 28
- @item
- Arguments are not actually removed from the stack by this command.
- @c 29
- @item
- Variable name may be a single digit or a full name.
- @c 30
- @item
- Editing occurs in a separate buffer. Press @kbd{M-# M-#} (or @kbd{C-c C-c},
- @key{LFD}, or in some cases @key{RET}) to finish the edit, or press
- @kbd{M-# x} to cancel the edit. The @key{LFD} key prevents evaluation
- of the result of the edit.
- @c 31
- @item
- The number prompted for can also be provided as a prefix argument.
- @c 32
- @item
- Press this key a second time to cancel the prefix.
- @c 33
- @item
- With a negative prefix, deactivate all formulas. With a positive
- prefix, deactivate and then reactivate from scratch.
- @c 34
- @item
- Default is to scan for nearest formula delimiter symbols. With a
- prefix of zero, formula is delimited by mark and point. With a
- non-zero prefix, formula is delimited by scanning forward or
- backward by that many lines.
- @c 35
- @item
- Parse the region between point and mark as a vector. A nonzero prefix
- parses @var{n} lines before or after point as a vector. A zero prefix
- parses the current line as a vector. A @kbd{C-u} prefix parses the
- region between point and mark as a single formula.
- @c 36
- @item
- Parse the rectangle defined by point and mark as a matrix. A positive
- prefix @var{n} divides the rectangle into columns of width @var{n}.
- A zero or @kbd{C-u} prefix parses each line as one formula. A negative
- prefix suppresses special treatment of bracketed portions of a line.
- @c 37
- @item
- A numeric prefix causes the current language mode to be ignored.
- @c 38
- @item
- Responding to a prompt with a blank line answers that and all
- later prompts by popping additional stack entries.
- @c 39
- @item
- Answer for @cite{v} may also be of the form @cite{v = v_0} or
- @cite{v - v_0}.
- @c 40
- @item
- With a positive prefix argument, stack contains many @cite{y}'s and one
- common @cite{x}. With a zero prefix, stack contains a vector of
- @cite{y}s and a common @cite{x}. With a negative prefix, stack
- contains many @cite{[x,y]} vectors. (For 3D plots, substitute
- @cite{z} for @cite{y} and @cite{x,y} for @cite{x}.)
- @c 41
- @item
- With any prefix argument, all curves in the graph are deleted.
- @c 42
- @item
- With a positive prefix, refines an existing plot with more data points.
- With a negative prefix, forces recomputation of the plot data.
- @c 43
- @item
- With any prefix argument, set the default value instead of the
- value for this graph.
- @c 44
- @item
- With a negative prefix argument, set the value for the printer.
- @c 45
- @item
- Condition is considered ``true'' if it is a nonzero real or complex
- number, or a formula whose value is known to be nonzero; it is ``false''
- otherwise.
- @c 46
- @item
- Several formulas separated by commas are pushed as multiple stack
- entries. Trailing @kbd{)}, @kbd{]}, @kbd{@}}, @kbd{>}, and @kbd{"}
- delimiters may be omitted. The notation @kbd{$$$} refers to the value
- in stack level three, and causes the formula to replace the top three
- stack levels. The notation @kbd{$3} refers to stack level three without
- causing that value to be removed from the stack. Use @key{LFD} in place
- of @key{RET} to prevent evaluation; use @kbd{M-=} in place of @key{RET}
- to evaluate variables.@refill
- @c 47
- @item
- The variable is replaced by the formula shown on the right. The
- Inverse flag reverses the order of the operands, e.g., @kbd{I s - x}
- assigns @c{$x \coloneq a-x$}
- @cite{x := a-x}.
- @c 48
- @item
- Press @kbd{?} repeatedly to see how to choose a model. Answer the
- variables prompt with @cite{iv} or @cite{iv;pv} to specify
- independent and parameter variables. A positive prefix argument
- takes @i{@var{n}+1} vectors from the stack; a zero prefix takes a matrix
- and a vector from the stack.
- @c 49
- @item
- With a plain @kbd{C-u} prefix, replace the current region of the
- destination buffer with the yanked text instead of inserting.
- @c 50
- @item
- All stack entries are reformatted; the @kbd{H} prefix inhibits this.
- The @kbd{I} prefix sets the mode temporarily, redraws the top stack
- entry, then restores the original setting of the mode.
- @c 51
- @item
- A negative prefix sets the default 3D resolution instead of the
- default 2D resolution.
- @c 52
- @item
- This grabs a vector of the form [@var{prec}, @var{wsize}, @var{ssize},
- @var{radix}, @var{flfmt}, @var{ang}, @var{frac}, @var{symb}, @var{polar},
- @var{matrix}, @var{simp}, @var{inf}]. A prefix argument from 1 to 12
- grabs the @var{n}th mode value only.
- @end enumerate
- @iftex
- (Space is provided below for you to keep your own written notes.)
- @page
- @endgroup
- @end iftex
- @c [end-summary]
- @node Key Index, Command Index, Summary, Top
- @unnumbered Index of Key Sequences
- @printindex ky
- @node Command Index, Function Index, Key Index, Top
- @unnumbered Index of Calculator Commands
- Since all Calculator commands begin with the prefix @samp{calc-}, the
- @kbd{x} key has been provided as a variant of @kbd{M-x} which automatically
- types @samp{calc-} for you. Thus, @kbd{x last-args} is short for
- @kbd{M-x calc-last-args}.
- @printindex pg
- @node Function Index, Concept Index, Command Index, Top
- @unnumbered Index of Algebraic Functions
- This is a list of built-in functions and operators usable in algebraic
- expressions. Their full Lisp names are derived by adding the prefix
- @samp{calcFunc-}, as in @code{calcFunc-sqrt}.
- @iftex
- All functions except those noted with ``*'' have corresponding
- Calc keystrokes and can also be found in the Calc Summary.
- @end iftex
- @printindex tp
- @node Concept Index, Variable Index, Function Index, Top
- @unnumbered Concept Index
- @printindex cp
- @node Variable Index, Lisp Function Index, Concept Index, Top
- @unnumbered Index of Variables
- The variables in this list that do not contain dashes are accessible
- as Calc variables. Add a @samp{var-} prefix to get the name of the
- corresponding Lisp variable.
- The remaining variables are Lisp variables suitable for @code{setq}ing
- in your @file{.emacs} file.
- @printindex vr
- @node Lisp Function Index, , Variable Index, Top
- @unnumbered Index of Lisp Math Functions
- The following functions are meant to be used with @code{defmath}, not
- @code{defun} definitions. For names that do not start with @samp{calc-},
- the corresponding full Lisp name is derived by adding a prefix of
- @samp{math-}.
- @printindex fn
- @summarycontents
- @c [end]
- @contents
- @bye
|