Автор |
Сообщение |
|
|
Заголовок сообщения: |
Re: *вычисление факториала разными способами |
|
|
Не стал переделывать алго для чисел двойной точности ибо изюминка не в ней. Код: \ Организация суперциклов - рекурсивной конструкции START..?DIVE..EMERGE \ , где START и EMERGE ограничивают функцию, ?DIVE снимает слово со стека \ и если оно "истина" вызывает функцию рекурсивно
\ Определим вспомогательные слова : : (START) R> DUP @ >R CELL+ >R ; : (?DIVE) R> TUCK CELL+ >R IF @ >R ELSE DROP THEN ;
\ Определим слова конструкции : : START POSTPONE (START) HERE 0 , ; IMMEDIATE : ?DIVE POSTPONE (?DIVE) DUP CELL+ , ; IMMEDIATE : EMERGE POSTPONE EXIT HERE SWAP ! ; IMMEDIATE
\ Используем суперцикл для вычисления факториала : FACTORIAL ( u1 -- u2 ) DUP 0= - DUP 1- IF START DUP 1- DUP 1- ?DIVE * EMERGE THEN ;
8 FACTORIAL U. BYE
Внутри конструкции может быть сколько угодно ?DIVE , например : ... START ... ?DIVE ... ?DIVE ... ?DIVE ... EMERGE ...
Не стал переделывать алго для чисел двойной точности ибо изюминка не в ней. [code] \ Организация суперциклов - рекурсивной конструкции START..?DIVE..EMERGE \ , где START и EMERGE ограничивают функцию, ?DIVE снимает слово со стека \ и если оно "истина" вызывает функцию рекурсивно
\ Определим вспомогательные слова : : (START) R> DUP @ >R CELL+ >R ; : (?DIVE) R> TUCK CELL+ >R IF @ >R ELSE DROP THEN ;
\ Определим слова конструкции : : START POSTPONE (START) HERE 0 , ; IMMEDIATE : ?DIVE POSTPONE (?DIVE) DUP CELL+ , ; IMMEDIATE : EMERGE POSTPONE EXIT HERE SWAP ! ; IMMEDIATE
\ Используем суперцикл для вычисления факториала : FACTORIAL ( u1 -- u2 ) DUP 0= - DUP 1- IF START DUP 1- DUP 1- ?DIVE * EMERGE THEN ;
8 FACTORIAL U. BYE [/code]Внутри конструкции может быть сколько угодно ?DIVE , например : ... START ... ?DIVE ... ?DIVE ... ?DIVE ... EMERGE ...
|
|
|
|
Добавлено: Сб июл 23, 2011 08:52 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
Слова повторного исполненения слов - некая замена типовым циклам
Код: : t-rep { a } 0 DO a EXECUTE LOOP ;
: NOTFOUND 2DUP S" nrep" COMPARE 0<> IF NOTFOUND EXIT THEN 2DROP NextWord SFIND DROP STATE @ 0= IF t-rep ELSE LIT, POSTPONE t-rep THEN ;
\ применение: 4 nrep WORD ( код слова WORD будет исполнен 4 раза)
\ и применительно к факториалу : (!) SWAP 1+ TUCK * ;
: fact ( n -- n!) 0 1 ROT nrep (!) NIP ;
5 fact 120 Ok
Слова повторного исполненения слов - некая замена типовым циклам
[code]: t-rep { a } 0 DO a EXECUTE LOOP ;
: NOTFOUND 2DUP S" nrep" COMPARE 0<> IF NOTFOUND EXIT THEN 2DROP NextWord SFIND DROP STATE @ 0= IF t-rep ELSE LIT, POSTPONE t-rep THEN ;
\ применение: 4 nrep WORD ( код слова WORD будет исполнен 4 раза)
\ и применительно к факториалу : (!) SWAP 1+ TUCK * ;
: fact ( n -- n!) 0 1 ROT nrep (!) NIP ;
5 fact 120 Ok[/code]
|
|
|
|
Добавлено: Ср фев 10, 2010 17:26 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
"Длинные" факториалы
Код: 17 VALUE nbyte ( 17*32=544 разряда) 0 VALUE ct
: UQ* ( Q1 .... Qnbyte n -- Q1 .... Qnbyte ) TUCK * >R nbyte 2- TO ct BEGIN TUCK UM* 2>R ct 1- TO ct ct 0= UNTIL UM* nbyte 2- TO ct BEGIN 0 2R> D+ ct 1- TO ct ct 0= UNTIL R> + ;
: fact 1+ >R 1 nbyte 1 DO 0 LOOP R> 1 DO I UQ* LOOP ;
\ вывод длинных чисел с простейшим форматным преобразованием для base=hex : fact. 1+ 1 DO I CR DUP 3 .0 ." ! = " fact nbyte 0 DO HEX 8 .0 DECIMAL LOOP LOOP ;
100 fact. LOG Код: 001! = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 002! = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002 003! = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006 004! = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000018 005! = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000078 006! = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002D0 007! = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000013B0 008! = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009D80 009! = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000058980 010! = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000375F00 011! = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002611500 012! = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001C8CFC00 013! = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000017328CC00 014! = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000144C3B2800 015! = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000013077775800 016! = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000130777758000 017! = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001437EEECD8000 018! = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016BEECCA730000 019! = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001B02B9306890000 020! = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000021C3677C82B40000 021! = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002C5077D36B8C40000 022! = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003CEEA4C2B3E0D80000 023! = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000057970CD7E2933680000 024! = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000083629343D3DCD1C00000 025! = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000CD4A0619FB0907BC00000 026! = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000014D9849EA37EEAC91800000 027! = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000232F0FCBB3E62C3358800000 028! = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003D925BA47AD2CD59DAE000000 029! = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006F99461A1E9E1432DCB6000000 030! = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000D13F6370F96865DF5DD54000000 031! = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001956AD0AAE33A4560C5CD2C000000 032! = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000032AD5A155C6748AC18B9A580000000 033! = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000688589CC0E9505E2F2FEE5580000000 034! = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000DE1BC4D19EFCAC82445DA75B00000000 035! = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001E5DCBE8A8BC8B95CF58CDE17100000000 036! = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044530ACB7BA83A111287CF3B3E400000000 037! = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009E0008F68DF506477ADA0F38FFF400000000 038! = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001774015499125EEE9C3C5E4275FE3800000000 039! = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000392AC33E351CC7659CD325C1FF9BA8800000000 040! = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008EEAE81B84C7F27E080FDE64FF05254000000000 041! = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016E39F2C684405D62F4A8A9E2CD7D2F74000000000 042! = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003C1581D491B28F523C23ABDF35B689C908000000000 043! = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A179CCEB478FE12D019FDDE7E05A924C458000000000 044! = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001BC0EF38704CBAB3BC477A23DA8F91251BF20000000000 045! = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004E0EA0CEBBD7CD1981890784D6B3C8385E98A0000000000 046! = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000E06A0E525C0C6DA95469F59DE944DFA20FF6CC0000000000 047! = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000293378A11EE64822167F7417FDD3A50EC0EE4F740000000000 048! = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000007B9A69E35CB2D866437E5C47F97AEF2C42CAEE5C00000000000 049! = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000017A88E4484BE3B6B92EB2FA9C6C087C778C8D79F9C00000000000 050! = 000000000000000000000000000000000000000000000000000000000000000000000000000000000049EEBC961ED279B02B1EF4F28D19A84F5973A1D2C7800000000000 051! = 000000000000000000000000000000000000000000000000000000000000000000000000000000000EBA8F91E823EE3E18972ACC521C1C87CED2093CFDBE800000000000 052! = 00000000000000000000000000000000000000000000000000000000000000000000000000000002FDE529A3274C649CFEB4B180ADB5CB9602A9E0638AB2000000000000 053! = 0000000000000000000000000000000000000000000000000000000000000000000000000000009E90719EC722D0D480BB68BFA3F6A3260E8D2B749BB6DA000000000000 054! = 0000000000000000000000000000000000000000000000000000000000000000000000000000217277F77E01580CD32788186C96066A0711C72A98D891FC000000000000 055! = 00000000000000000000000000000000000000000000000000000000000000000000000000072F97C62C1249EAC15D7E3D3F543B60C784D1CA26D6875D24000000000000 056! = 0000000000000000000000000000000000000000000000000000000000000000000000000192693359A4002B5A4C739D65DA6CFD2BA50DE4387EED9C5FE0000000000000 057! = 00000000000000000000000000000000000000000000000000000000000000000000000059996C6EF58409A71B05BE0BADA2445EB7C017D09442E7D158E0000000000000 058! = 0000000000000000000000000000000000000000000000000000000000000000000000144CC291239FEA2FDC1F4D0EA556C37D75A18565419728856E22C0000000000000 059! = 0000000000000000000000000000000000000000000000000000000000000000000004ADB0D77335DAF907BB36C2601AFF0DEA1C39BE561DD656C0620240000000000000 060! = 0000000000000000000000000000000000000000000000000000000000000000000118B5727F009F525DCFE0D58E8653C742DE9D889C2EFE3C5516F88700000000000000 061! = 00000000000000000000000000000000000000000000000000000000000000000042E33C484325F6A05A8892E2F601F67AEF0B898D373294604679382B00000000000000 062! = 000000000000000000000000000000000000000000000000000000000000000010330899804331BAD5ED1392F79479B1C5E4CB50335E3FEF51115B9A6A00000000000000 063! = 0000000000000000000000000000000000000000000000000000000000000003FC8F1DC690893CFAA557D12AED89F2BFB34E08BCA431BBE4F3458B001600000000000000 064! = 00000000000000000000000000000000000000000000000000000000000000FF23C771A4224F3EA955F44ABB627CAFECD3822F290C6EF93CD162C0058000000000000000 065! = 00000000000000000000000000000000000000000000000000000000000040C815A3DAACB61EE8FED306F99401A8AB21B40DF96C282D48712A12C1658000000000000000 066! = 000000000000000000000000000000000000000000000000000000000010B395943E6086F3F811B267CC58286D7C1EB06B9A4DE25BACAD2CD8D5DC2B0000000000000000 067! = 00000000000000000000000000000000000000000000000000000000045F0025CC534351D9ECA1B12A7B1294A77C082C2962623DFE3152BCBFF89F410000000000000000 068! = 00000000000000000000000000000000000000000000000000000001293C0A0A461DE1BDE2DAF30F48B0EF7C7CF22BBAFE2218778519FA22FE0A4D440000000000000000 069! = 000000000000000000000000000000000000000000000000000000501D2EB4C4E60DD82E2503831E97B08C8DAD45C9667F309836E0006B6E78C6D3540000000000000000 070! = 000000000000000000000000000000000000000000000000000015E7FAC56DD6E7C91C9E1EF5DA5D7A466EBD61151206C7499F01401D6035065DC8F80000000000000000 071! = 000000000000000000000000000000000000000000000000000613568CC1769A48C6EFDA962F8FECE988B685ECD7FFE1456B1958C825AEB4C402BCC80000000000000000 072! = 00000000000000000000000000000000000000000000000001B5705796695B6477F3757A3D607AA1AE7355AA9CBFF75B861F20F84A9922D720C518400000000000000000 073! = 0000000000000000000000000000000000000000000000007CBD08F9E40B0FA6346C7FDB8082F81ABEE36DA6B2BD89193EE066CD45AAEF585833EA400000000000000000 074! = 0000000000000000000000000000000000000000000000240EA4983BEB32860B275CF57325DBB7BB2DBDB22FAAC9A14C2CDDB75623692F897F01B6800000000000000000 075! = 000000000000000000000000000000000000000000000A904A38998DE7CD4544883BE8BC175ED3D6669333F70912415124F4B63C5FD0ED48358077800000000000000000 076! = 0000000000000000000000000000000000000000000322D608CD9620D0F0905871C917D6F026E3A673B36D56B16B6416F8A619EC7206716FE2237A000000000000000000 077! = 000000000000000000000000000000000000000000F17A60A5D627DED85B6A9A397C2BA63BB27910CCF7E3135D4D1AE8C9F5CC1E4BF01EA704ABB2000000000000000000 078! = 000000000000000000000000000000000000000049934972874025E5EBDA7AFD83D54CA63060E31E73872FE66D7E32ED88E4313B232956E36C503C000000000000000000 079! = 0000000000000000000000000000000000000016B473AA57BCCBB1F3C86BF43BAED2A748EDE61665A6B7C81BC9F1B74D3E6B313FD9C1D02E6CC284000000000000000000 080! = 000000000000000000000000000000000000071864253B6AFFA79C2EA1BC52A6A1D446CA57E6FFC4196E88AF1B894823817F63F40C910E81FCC940000000000000000000 081! = 0000000000000000000000000000000000023EB7AFC7CCDAE4086AC12C9626B9342A6605D016ED0C0BF93F67B66FD33BF94EA037F9E59720FBAD40000000000000000000 082! = 0000000000000000000000000000000000B816D64DFF9E1D0AB231E048186752B594ADDCA757EDDBD5D64F386FD1A935DB2F51EE0B8A68909D7E80000000000000000000 083! = 000000000000000000000000000000003BAF677B49E0436A77C62BB75FE97FD0DF345E8A41821E46547BAF4C40F9DC761057902DBDDFE6E3100380000000000000000000 084! = 00000000000000000000000000000013958DF4743D961EEF4D06582B789DF0893D2F055D7EB1EF13B895850551FC56BD5CBB4F024D77C281412600000000000000000000 085! = 00000000000000000000000000000680A8222A9872D84574931B466F0C70DD91509CC80B1114618C49A52AC438C8CCDFCA313BC3B8C394EAA19E00000000000000000000 086! = 00000000000000000000000000022F387B7A4F3694A755296B29A94E2DEA6ED114AB33B7BCD8C520BD7C5DEB1374D32DEC8A13C011B406D24B1400000000000000000000 087! = 00000000000000000000000000BE0C31F690EB8C84DDF1136B2889919AABA90E062E93712DAAFE206543EAE39CB3C49B62ECB646042E517783CC00000000000000000000 088! = 0000000000000000000000004154312CC1D0F84DAC4ADEACD5EF4A0D2B021CD22002AEE7B2C75B22CF58BE3DDDCB956A015EA8116FEC01154E2000000000000000000000 089! = 000000000000000000000016B645188F61A65300E6076A166030BE93F3BC050D20EECE8D274EAF1A15DA23821BC6F1DA79E86E0FE90C6068292000000000000000000000 090! = 0000000000000000000007FC144AA26854792E50DE9B4BDDD1230003B019C69D93F49D9FD1A98F2BAEB07BBDC3F106CEDBB6B197EE59E49E754000000000000000000000 091! = 00000000000000000002D69B3687BB16071376BF2133F7D95771014F99299A0397F407CF8745E48718BBFC74A6AD6B8819F12101B9F44453ADC000000000000000000000 092! = 000000000000000001051FC798C73BEA8AFEACAFEEAD121B6C9C789B0AF3594A9BB2CE949D1E208CE38EB9EBE652A4E952A7DC9ED3C88E12710000000000000000000000 093! = 00000000000000005EDC8B828060C4347E84BBE9B4DF93F674D7D052FA67701A8FF50BFD13F1D32EAAD98AB2AC05E8C306FB25B2EFDB9CB30D0000000000000000000000 094! = 0000000000000022D4FB39EB23880B4674BCFFD06A18547EE73E7E77F1FB29C0DBFA66ED52CB8B22BBE0ED9B2A2B779C9037D7B412A389BEC60000000000000000000000 095! = 0000000000000CED093A7E422F7C2F255222EE575F075B17D030EE82CC347E91A1EC3211B988A1E3B8782C94A621631984B90BD2EAB01DCB7A0000000000000000000000 096! = 000000000004D8E375EF58D1CE91ADFECD1960C3A2C228EE1259710C93AF769CB892C6A5933CB5652D10B7BE4C852991C5646F18020B2C4DC00000000000000000000000 097! = 0000000001D62E2FAFB0A77F4532ED8BB69DAA20AB918234F3E3D5C3F57BF161EF9D44BCCA00BB5613559F1AFE74C03BCB0E1818C63BC975C00000000000000000000000 098! = 00000000B3FDAE4141A01EB87D7EEF7BE85B2081ADB3D8455D37D503F972677DBA3450455447B6F366C6E85568B196E3BB65397BE2E31F13800000000000000000000000 099! = 000000459B1A633C60EBE15888169CEADB3D92262C8CA2D30C976089773E059F023B0ACF97BBC020BEEBD9077CAD5A1178253AE8BDD5048A800000000000000000000000 100! = 00001B30964EC395DC24069528D54BBDA40D16E966EF9A70EB21B5B2943A321CDF10391745570CCA9420C6ECB3B72ED2EE8B02EA2735C61A000000000000000000000000 Ok пс. разрядность может быть любая - только смотреть неудобно и долго считается, да и еще может не хватить глубины стека параметров. Код: : Nh. nbyte 0 DO HEX 8 .0 DECIMAL LOOP ; 270 TO nbyte CR 1000 fact Nh. \ здесь число nbyte не должно превышать максимальной глубины стека в ячейках(в СПФ глубина около 1000). для 1000! Код: 0000000000000000000000000002A2A773338969B740DE6E2B291FD8DD6EE62A2B41525AB61CBE52489B6CF344C23231711B6D9F34E0F13AB50EAF1AD3DD92771EC26B4B9EA804 11C866B1CCBD855F8326EDAB10832755E1682D3E7A91335E3670329BC1571B5208D72F7D6BE81483A6E6708ABF913B789F41838E9A73C1BA82E3A956570405A660A17E1125838BC810C 8D2C63915481914EA202867A563A41B6AEFEF5FEAC300A78803A30EB995208842EBEBA8729397A8CD9087E28FB155A3DE0F18DD90E64A9293AF6487A5AABDAB855FA254FCBDC9F11160 60BC2E2B4410E55E7368B844D9BF0AECA92DEB017DEF69AF777E8D4EDB1F1B926AE01DF3366ABB9E4568FC08FE255B68BCA0E48382A8E6DF1C7B0BA33BC2225CC512B39176A26B13098 E733E51417224BE36FBD933A8A7D98A08F356CF010F0FC59B9F1E32D3FB43209A82FA0E7F69E302FCB0F20362B86CBBEB08B81B1BA07F08AB119CE5E092D09996B710588779327D91EE80 EB679A99F0FDCA7EB4A50EF174295E94D590E3CF8BF37D23E5B22DCD79A4AC2C1EA7D1D55170789FCD2FCBB3EA52EAD4F7116F862578F5E22421C90CD0A7EE095903150631F273051914 29A54CACE66DD076C51A94034B31BEBEC406EE460181225E03A9A22C51E6A2A8DB4A94FD352605115CAF251B14DF0CEC523C48B79B58B0FC0676792D38A0D61523EB75F5CBC33EBDA1B 19933878CE7050356BD228CE9327A9916F9FF3BB5B6BEEDFE5382B861D6C4DA52A9754B6FEEC8A99372B43AFA7808836D281C5B2CDF791CF76D6C737AAD32C5ED7475855FC15C3F45C47 05DD0D6B4078656D027CFEE6F37772E03C35C0DCBBDAA25EA64D6865C87CAC0A9A999EB88D7A16515811A77192071189C353C1E72242A4F3106CEF2BAD1075549B4EFD6885690F3F58C1 F4686951CC543118428EC653E3C6FBDB427930F624680672C1E70C25DB7E7B67016A95B30DBA56D0083759EAC93A8E4D0C54853AA43F197B96FD70696AE5750D7D1F0427B8DBCFAFC8B9 924D51340FBF71BC22780FBA76525F5E5B91A2461983B60BF087DFDD89DCBC6F7892D9E4C5D55D106D45F77E4FC1C44A376D693BFB8B160F12ED1BDF5F4F1127E61D9DEC2DC1BBA43A6F F47D294DE7A67CDF3EF90937667092517E985642D195031C6F5339C1CEA607A699C55E75C5479CBD30DDACCAB307472AA67A6A9A547D7E1EBA123144193E6D2933556DDEB516151EACF0 B48CE08892236ABFB74BF0CEE3A0E45997301027F2A53990697694F14DE4FAC0C908EEAEEDF3DBB45C4CE9F744FEF88EC1068C52056B16DA099E1FB620BD90DE25534B5E820B367A400000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
"Длинные" факториалы
[code]17 VALUE nbyte ( 17*32=544 разряда) 0 VALUE ct
: UQ* ( Q1 .... Qnbyte n -- Q1 .... Qnbyte ) TUCK * >R nbyte 2- TO ct BEGIN TUCK UM* 2>R ct 1- TO ct ct 0= UNTIL UM* nbyte 2- TO ct BEGIN 0 2R> D+ ct 1- TO ct ct 0= UNTIL R> + ;
: fact 1+ >R 1 nbyte 1 DO 0 LOOP R> 1 DO I UQ* LOOP ;
\ вывод длинных чисел с простейшим форматным преобразованием для base=hex : fact. 1+ 1 DO I CR DUP 3 .0 ." ! = " fact nbyte 0 DO HEX 8 .0 DECIMAL LOOP LOOP ;
100 fact.[/code] LOG [code]001! = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 002! = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002 003! = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006 004! = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000018 005! = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000078 006! = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002D0 007! = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000013B0 008! = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009D80 009! = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000058980 010! = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000375F00 011! = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002611500 012! = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001C8CFC00 013! = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000017328CC00 014! = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000144C3B2800 015! = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000013077775800 016! = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000130777758000 017! = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001437EEECD8000 018! = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016BEECCA730000 019! = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001B02B9306890000 020! = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000021C3677C82B40000 021! = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002C5077D36B8C40000 022! = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003CEEA4C2B3E0D80000 023! = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000057970CD7E2933680000 024! = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000083629343D3DCD1C00000 025! = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000CD4A0619FB0907BC00000 026! = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000014D9849EA37EEAC91800000 027! = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000232F0FCBB3E62C3358800000 028! = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003D925BA47AD2CD59DAE000000 029! = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006F99461A1E9E1432DCB6000000 030! = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000D13F6370F96865DF5DD54000000 031! = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001956AD0AAE33A4560C5CD2C000000 032! = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000032AD5A155C6748AC18B9A580000000 033! = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000688589CC0E9505E2F2FEE5580000000 034! = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000DE1BC4D19EFCAC82445DA75B00000000 035! = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001E5DCBE8A8BC8B95CF58CDE17100000000 036! = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044530ACB7BA83A111287CF3B3E400000000 037! = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009E0008F68DF506477ADA0F38FFF400000000 038! = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001774015499125EEE9C3C5E4275FE3800000000 039! = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000392AC33E351CC7659CD325C1FF9BA8800000000 040! = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008EEAE81B84C7F27E080FDE64FF05254000000000 041! = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016E39F2C684405D62F4A8A9E2CD7D2F74000000000 042! = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003C1581D491B28F523C23ABDF35B689C908000000000 043! = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A179CCEB478FE12D019FDDE7E05A924C458000000000 044! = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001BC0EF38704CBAB3BC477A23DA8F91251BF20000000000 045! = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004E0EA0CEBBD7CD1981890784D6B3C8385E98A0000000000 046! = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000E06A0E525C0C6DA95469F59DE944DFA20FF6CC0000000000 047! = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000293378A11EE64822167F7417FDD3A50EC0EE4F740000000000 048! = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000007B9A69E35CB2D866437E5C47F97AEF2C42CAEE5C00000000000 049! = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000017A88E4484BE3B6B92EB2FA9C6C087C778C8D79F9C00000000000 050! = 000000000000000000000000000000000000000000000000000000000000000000000000000000000049EEBC961ED279B02B1EF4F28D19A84F5973A1D2C7800000000000 051! = 000000000000000000000000000000000000000000000000000000000000000000000000000000000EBA8F91E823EE3E18972ACC521C1C87CED2093CFDBE800000000000 052! = 00000000000000000000000000000000000000000000000000000000000000000000000000000002FDE529A3274C649CFEB4B180ADB5CB9602A9E0638AB2000000000000 053! = 0000000000000000000000000000000000000000000000000000000000000000000000000000009E90719EC722D0D480BB68BFA3F6A3260E8D2B749BB6DA000000000000 054! = 0000000000000000000000000000000000000000000000000000000000000000000000000000217277F77E01580CD32788186C96066A0711C72A98D891FC000000000000 055! = 00000000000000000000000000000000000000000000000000000000000000000000000000072F97C62C1249EAC15D7E3D3F543B60C784D1CA26D6875D24000000000000 056! = 0000000000000000000000000000000000000000000000000000000000000000000000000192693359A4002B5A4C739D65DA6CFD2BA50DE4387EED9C5FE0000000000000 057! = 00000000000000000000000000000000000000000000000000000000000000000000000059996C6EF58409A71B05BE0BADA2445EB7C017D09442E7D158E0000000000000 058! = 0000000000000000000000000000000000000000000000000000000000000000000000144CC291239FEA2FDC1F4D0EA556C37D75A18565419728856E22C0000000000000 059! = 0000000000000000000000000000000000000000000000000000000000000000000004ADB0D77335DAF907BB36C2601AFF0DEA1C39BE561DD656C0620240000000000000 060! = 0000000000000000000000000000000000000000000000000000000000000000000118B5727F009F525DCFE0D58E8653C742DE9D889C2EFE3C5516F88700000000000000 061! = 00000000000000000000000000000000000000000000000000000000000000000042E33C484325F6A05A8892E2F601F67AEF0B898D373294604679382B00000000000000 062! = 000000000000000000000000000000000000000000000000000000000000000010330899804331BAD5ED1392F79479B1C5E4CB50335E3FEF51115B9A6A00000000000000 063! = 0000000000000000000000000000000000000000000000000000000000000003FC8F1DC690893CFAA557D12AED89F2BFB34E08BCA431BBE4F3458B001600000000000000 064! = 00000000000000000000000000000000000000000000000000000000000000FF23C771A4224F3EA955F44ABB627CAFECD3822F290C6EF93CD162C0058000000000000000 065! = 00000000000000000000000000000000000000000000000000000000000040C815A3DAACB61EE8FED306F99401A8AB21B40DF96C282D48712A12C1658000000000000000 066! = 000000000000000000000000000000000000000000000000000000000010B395943E6086F3F811B267CC58286D7C1EB06B9A4DE25BACAD2CD8D5DC2B0000000000000000 067! = 00000000000000000000000000000000000000000000000000000000045F0025CC534351D9ECA1B12A7B1294A77C082C2962623DFE3152BCBFF89F410000000000000000 068! = 00000000000000000000000000000000000000000000000000000001293C0A0A461DE1BDE2DAF30F48B0EF7C7CF22BBAFE2218778519FA22FE0A4D440000000000000000 069! = 000000000000000000000000000000000000000000000000000000501D2EB4C4E60DD82E2503831E97B08C8DAD45C9667F309836E0006B6E78C6D3540000000000000000 070! = 000000000000000000000000000000000000000000000000000015E7FAC56DD6E7C91C9E1EF5DA5D7A466EBD61151206C7499F01401D6035065DC8F80000000000000000 071! = 000000000000000000000000000000000000000000000000000613568CC1769A48C6EFDA962F8FECE988B685ECD7FFE1456B1958C825AEB4C402BCC80000000000000000 072! = 00000000000000000000000000000000000000000000000001B5705796695B6477F3757A3D607AA1AE7355AA9CBFF75B861F20F84A9922D720C518400000000000000000 073! = 0000000000000000000000000000000000000000000000007CBD08F9E40B0FA6346C7FDB8082F81ABEE36DA6B2BD89193EE066CD45AAEF585833EA400000000000000000 074! = 0000000000000000000000000000000000000000000000240EA4983BEB32860B275CF57325DBB7BB2DBDB22FAAC9A14C2CDDB75623692F897F01B6800000000000000000 075! = 000000000000000000000000000000000000000000000A904A38998DE7CD4544883BE8BC175ED3D6669333F70912415124F4B63C5FD0ED48358077800000000000000000 076! = 0000000000000000000000000000000000000000000322D608CD9620D0F0905871C917D6F026E3A673B36D56B16B6416F8A619EC7206716FE2237A000000000000000000 077! = 000000000000000000000000000000000000000000F17A60A5D627DED85B6A9A397C2BA63BB27910CCF7E3135D4D1AE8C9F5CC1E4BF01EA704ABB2000000000000000000 078! = 000000000000000000000000000000000000000049934972874025E5EBDA7AFD83D54CA63060E31E73872FE66D7E32ED88E4313B232956E36C503C000000000000000000 079! = 0000000000000000000000000000000000000016B473AA57BCCBB1F3C86BF43BAED2A748EDE61665A6B7C81BC9F1B74D3E6B313FD9C1D02E6CC284000000000000000000 080! = 000000000000000000000000000000000000071864253B6AFFA79C2EA1BC52A6A1D446CA57E6FFC4196E88AF1B894823817F63F40C910E81FCC940000000000000000000 081! = 0000000000000000000000000000000000023EB7AFC7CCDAE4086AC12C9626B9342A6605D016ED0C0BF93F67B66FD33BF94EA037F9E59720FBAD40000000000000000000 082! = 0000000000000000000000000000000000B816D64DFF9E1D0AB231E048186752B594ADDCA757EDDBD5D64F386FD1A935DB2F51EE0B8A68909D7E80000000000000000000 083! = 000000000000000000000000000000003BAF677B49E0436A77C62BB75FE97FD0DF345E8A41821E46547BAF4C40F9DC761057902DBDDFE6E3100380000000000000000000 084! = 00000000000000000000000000000013958DF4743D961EEF4D06582B789DF0893D2F055D7EB1EF13B895850551FC56BD5CBB4F024D77C281412600000000000000000000 085! = 00000000000000000000000000000680A8222A9872D84574931B466F0C70DD91509CC80B1114618C49A52AC438C8CCDFCA313BC3B8C394EAA19E00000000000000000000 086! = 00000000000000000000000000022F387B7A4F3694A755296B29A94E2DEA6ED114AB33B7BCD8C520BD7C5DEB1374D32DEC8A13C011B406D24B1400000000000000000000 087! = 00000000000000000000000000BE0C31F690EB8C84DDF1136B2889919AABA90E062E93712DAAFE206543EAE39CB3C49B62ECB646042E517783CC00000000000000000000 088! = 0000000000000000000000004154312CC1D0F84DAC4ADEACD5EF4A0D2B021CD22002AEE7B2C75B22CF58BE3DDDCB956A015EA8116FEC01154E2000000000000000000000 089! = 000000000000000000000016B645188F61A65300E6076A166030BE93F3BC050D20EECE8D274EAF1A15DA23821BC6F1DA79E86E0FE90C6068292000000000000000000000 090! = 0000000000000000000007FC144AA26854792E50DE9B4BDDD1230003B019C69D93F49D9FD1A98F2BAEB07BBDC3F106CEDBB6B197EE59E49E754000000000000000000000 091! = 00000000000000000002D69B3687BB16071376BF2133F7D95771014F99299A0397F407CF8745E48718BBFC74A6AD6B8819F12101B9F44453ADC000000000000000000000 092! = 000000000000000001051FC798C73BEA8AFEACAFEEAD121B6C9C789B0AF3594A9BB2CE949D1E208CE38EB9EBE652A4E952A7DC9ED3C88E12710000000000000000000000 093! = 00000000000000005EDC8B828060C4347E84BBE9B4DF93F674D7D052FA67701A8FF50BFD13F1D32EAAD98AB2AC05E8C306FB25B2EFDB9CB30D0000000000000000000000 094! = 0000000000000022D4FB39EB23880B4674BCFFD06A18547EE73E7E77F1FB29C0DBFA66ED52CB8B22BBE0ED9B2A2B779C9037D7B412A389BEC60000000000000000000000 095! = 0000000000000CED093A7E422F7C2F255222EE575F075B17D030EE82CC347E91A1EC3211B988A1E3B8782C94A621631984B90BD2EAB01DCB7A0000000000000000000000 096! = 000000000004D8E375EF58D1CE91ADFECD1960C3A2C228EE1259710C93AF769CB892C6A5933CB5652D10B7BE4C852991C5646F18020B2C4DC00000000000000000000000 097! = 0000000001D62E2FAFB0A77F4532ED8BB69DAA20AB918234F3E3D5C3F57BF161EF9D44BCCA00BB5613559F1AFE74C03BCB0E1818C63BC975C00000000000000000000000 098! = 00000000B3FDAE4141A01EB87D7EEF7BE85B2081ADB3D8455D37D503F972677DBA3450455447B6F366C6E85568B196E3BB65397BE2E31F13800000000000000000000000 099! = 000000459B1A633C60EBE15888169CEADB3D92262C8CA2D30C976089773E059F023B0ACF97BBC020BEEBD9077CAD5A1178253AE8BDD5048A800000000000000000000000 100! = 00001B30964EC395DC24069528D54BBDA40D16E966EF9A70EB21B5B2943A321CDF10391745570CCA9420C6ECB3B72ED2EE8B02EA2735C61A000000000000000000000000 Ok[/code] пс. разрядность может быть любая - только смотреть неудобно и долго считается, да и еще может не хватить глубины стека параметров. :) [code]: Nh. nbyte 0 DO HEX 8 .0 DECIMAL LOOP ; 270 TO nbyte CR 1000 fact Nh. \ здесь число nbyte не должно превышать максимальной глубины стека в ячейках(в СПФ глубина около 1000).[/code] для 1000! [code]0000000000000000000000000002A2A773338969B740DE6E2B291FD8DD6EE62A2B41525AB61CBE52489B6CF344C23231711B6D9F34E0F13AB50EAF1AD3DD92771EC26B4B9EA804 11C866B1CCBD855F8326EDAB10832755E1682D3E7A91335E3670329BC1571B5208D72F7D6BE81483A6E6708ABF913B789F41838E9A73C1BA82E3A956570405A660A17E1125838BC810C 8D2C63915481914EA202867A563A41B6AEFEF5FEAC300A78803A30EB995208842EBEBA8729397A8CD9087E28FB155A3DE0F18DD90E64A9293AF6487A5AABDAB855FA254FCBDC9F11160 60BC2E2B4410E55E7368B844D9BF0AECA92DEB017DEF69AF777E8D4EDB1F1B926AE01DF3366ABB9E4568FC08FE255B68BCA0E48382A8E6DF1C7B0BA33BC2225CC512B39176A26B13098 E733E51417224BE36FBD933A8A7D98A08F356CF010F0FC59B9F1E32D3FB43209A82FA0E7F69E302FCB0F20362B86CBBEB08B81B1BA07F08AB119CE5E092D09996B710588779327D91EE80 EB679A99F0FDCA7EB4A50EF174295E94D590E3CF8BF37D23E5B22DCD79A4AC2C1EA7D1D55170789FCD2FCBB3EA52EAD4F7116F862578F5E22421C90CD0A7EE095903150631F273051914 29A54CACE66DD076C51A94034B31BEBEC406EE460181225E03A9A22C51E6A2A8DB4A94FD352605115CAF251B14DF0CEC523C48B79B58B0FC0676792D38A0D61523EB75F5CBC33EBDA1B 19933878CE7050356BD228CE9327A9916F9FF3BB5B6BEEDFE5382B861D6C4DA52A9754B6FEEC8A99372B43AFA7808836D281C5B2CDF791CF76D6C737AAD32C5ED7475855FC15C3F45C47 05DD0D6B4078656D027CFEE6F37772E03C35C0DCBBDAA25EA64D6865C87CAC0A9A999EB88D7A16515811A77192071189C353C1E72242A4F3106CEF2BAD1075549B4EFD6885690F3F58C1 F4686951CC543118428EC653E3C6FBDB427930F624680672C1E70C25DB7E7B67016A95B30DBA56D0083759EAC93A8E4D0C54853AA43F197B96FD70696AE5750D7D1F0427B8DBCFAFC8B9 924D51340FBF71BC22780FBA76525F5E5B91A2461983B60BF087DFDD89DCBC6F7892D9E4C5D55D106D45F77E4FC1C44A376D693BFB8B160F12ED1BDF5F4F1127E61D9DEC2DC1BBA43A6F F47D294DE7A67CDF3EF90937667092517E985642D195031C6F5339C1CEA607A699C55E75C5479CBD30DDACCAB307472AA67A6A9A547D7E1EBA123144193E6D2933556DDEB516151EACF0 B48CE08892236ABFB74BF0CEE3A0E45997301027F2A53990697694F14DE4FAC0C908EEAEEDF3DBB45C4CE9F744FEF88EC1068C52056B16DA099E1FB620BD90DE25534B5E820B367A400000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000[/code]
|
|
|
|
Добавлено: Вт фев 09, 2010 11:15 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
значения-то можно и не вычислять: \ список значений факториала CREATE farr 0`1 D, 0`2 D, 0`6 D, 0`24 D, 0`120 D, 0`720 D, 0`5040 D, 0`40320 D, 0`362880 D, 3`628800 D, 3`9916800 D, 4`79001600 D, 6`227020800 D, 8`7178291200 D, 1`307674368000 D, 2`0922789888000 D, 3`55687428096000 D, 6`402373705728000 D, 1`21645100408832000 D, 2`432902008176640000 D,
\ нахождение факториала числа : Fact ( u --> ud ) 1 - -IF ERROR" Определено только для положительных чисел!" THEN 20 OVER > IF DOUBLES farr + D@ ;THEN ERROR" Переполнение разрядной сетки!" ;
значения-то можно и не вычислять: [pre]\ список значений факториала CREATE farr 0`1 D, 0`2 D, 0`6 D, 0`24 D, 0`120 D, 0`720 D, 0`5040 D, 0`40320 D, 0`362880 D, 3`628800 D, 3`9916800 D, 4`79001600 D, 6`227020800 D, 8`7178291200 D, 1`307674368000 D, 2`0922789888000 D, 3`55687428096000 D, 6`402373705728000 D, 1`21645100408832000 D, 2`432902008176640000 D,
\ нахождение факториала числа : Fact ( u --> ud ) 1 - -IF ERROR" Определено только для положительных чисел!" THEN 20 OVER > IF DOUBLES farr + D@ ;THEN ERROR" Переполнение разрядной сетки!" ;[/pre]
|
|
|
|
Добавлено: Вс фев 07, 2010 14:17 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
Код: : dn* ( d n -- d ) TUCK * >R UM* R> + ;
: fact ( n -- d ) >R 1. R> 1+ 1 DO I dn* LOOP ;
: fact. 1 DO I fact CR D. LOOP ; 21 fact. LOG Код: 1 2 6 24 120 720 5040 40320 362880 3628800 39916800 479001600 6227020800 87178291200 1307674368000 20922789888000 355687428096000 6402373705728000 121645100408832000 2432902008176640000 Ok
[code]: dn* ( d n -- d ) TUCK * >R UM* R> + ;
: fact ( n -- d ) >R 1. R> 1+ 1 DO I dn* LOOP ;
: fact. 1 DO I fact CR D. LOOP ; 21 fact.[/code]
LOG [code]1 2 6 24 120 720 5040 40320 362880 3628800 39916800 479001600 6227020800 87178291200 1307674368000 20922789888000 355687428096000 6402373705728000 121645100408832000 2432902008176640000 Ok[/code]
|
|
|
|
Добавлено: Вс фев 07, 2010 13:37 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
еще одно решение, уже с вариантом "ленивых вычислений" branch/ for-next.fts memory/ double.fts math/ double.fts
\ массив-список значений факториала USER-CREATE FactArr 21 DOUBLES USER-ALLOT \ всего-то 21 значение включая 0
\ найти n! . результат число двойной длины d : fact ( n --> d ) *IF 0:1 ROT ABS FOR R@ ROT ROT SD* TILL ;THEN 0 ;
\ более быстрый вариант факториала за счет кеширования уже найденных значений : FACT ( n --> d ) *IF ELSE 1 ;THEN \ 0 - особый случай DUP >L FactArr D[@] DDUP OR IF LDROP ;THEN DDROP L@ 21 < IF L@ fact DDUP L> FactArr D[!] ;THEN ERROR" значение факториала превышает double" ;
еще одно решение, уже с вариантом "ленивых вычислений" [pre]branch/ for-next.fts memory/ double.fts math/ double.fts
\ массив-список значений факториала USER-CREATE FactArr 21 DOUBLES USER-ALLOT \ всего-то 21 значение включая 0
\ найти n! . результат число двойной длины d : fact ( n --> d ) *IF 0:1 ROT ABS FOR R@ ROT ROT SD* TILL ;THEN 0 ;
\ более быстрый вариант факториала за счет кеширования уже найденных значений : FACT ( n --> d ) *IF ELSE 1 ;THEN \ 0 - особый случай DUP >L FactArr D[@] DDUP OR IF LDROP ;THEN DDROP L@ 21 < IF L@ fact DDUP L> FactArr D[!] ;THEN ERROR" значение факториала превышает double" ;[/pre]
|
|
|
|
Добавлено: Сб фев 06, 2010 17:21 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
1*2*3*4*5*6*7*8*9= (1*2*3*4) * (5 *6 *7 * 8 *9) = (1*2) * (3*4) * (5*6) * (7*8 ) * 9
1*2*3*4*5*6*7*8*9= (1*2*3*4) * (5 *6 *7 * 8 *9) = (1*2) * (3*4) * (5*6) * (7*8 ) * 9
|
|
|
|
Добавлено: Сб фев 06, 2010 17:13 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
WingLion писал(а): \ инициализировать таблицу по схеме f(i) = i*f(i-1) : init 1F 1 DO I 1 - Ftab[]@ I S>D D* I Ftab[] D! LOOP ; init в форке в данном случае можно писать просто: 0x1F 1 DO I 1 - Ftab[]@ I S>D D* I Ftab[] D! LOOP WingLion писал(а): HEX \ ну вот, привык я в HEX-е работать! ну, тогда надо писать: HEX always тогда даже после возникновения ошибки основание системы счисления останется в HEX вопрос писал(а): По определению полагают 0! = 1. Факториал определён только для целых неотрицательных чисел. для отрицательных тоже определен, и для нечетных чисел получается отрицательным, а для четных положительным. Но, это не значит, что с помощью float нельзя работать с целыми числами, не так ли?
[quote="WingLion"]\ инициализировать таблицу по схеме f(i) = i*f(i-1) [pre]: init 1F 1 DO I 1 - Ftab[]@ I S>D D* I Ftab[] D! LOOP ; init[/pre] [/quote] в форке в данном случае можно писать просто: [pre]0x1F 1 DO I 1 - Ftab[]@ I S>D D* I Ftab[] D! LOOP[/pre]
[quote="WingLion"]HEX \ ну вот, привык я в HEX-е работать![/quote] ну, тогда надо писать: [pre]HEX always[/pre] тогда даже после возникновения ошибки основание системы счисления останется в HEX
[quote="вопрос"]По определению полагают 0! = 1. Факториал определён только для целых неотрицательных чисел.[/quote] для отрицательных тоже определен, и для нечетных чисел получается отрицательным, а для четных положительным. Но, это не значит, что с помощью float нельзя работать с целыми числами, не так ли? :D
|
|
|
|
Добавлено: Сб фев 06, 2010 16:52 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
Код:
Код: \ write by WingLion admin@winglion.ru \ для fork410233
\ подключение нужных деталей
branch/ doloop.fts math/ double.fts
HEX \ ну вот, привык я в HEX-е работать!
CREATE Ftab 100 ALLOT ;CREATE \ резервируется 256 байт под 32 табличных значения Ftab 100 ERASE \ инициализация таблицы нулями, на всякий случай, а бес его знает, зачем...
: Ftab[] ( i -> adr ) \ расчет адреса в массиве 1F AND \ ограничитель на номер массива больше 20! все равно в двойное целое не влезет 8 * Ftab + ; \ вычисление адреса : Ftab[]@ Ftab[] D@ ; \ получение результата из таблицы ( без ограничений на индекс )
1 S>D 0 Ftab[] D! \ инициализировать нулевой элемент таблицы единицей \ инициализировать таблицу по схеме f(i) = i*f(i-1) : init 1F 1 DO I 1 - Ftab[]@ I S>D D* I Ftab[] D! LOOP ; init
\ вычисление факториала : fact DUP 14 < IF Ftab[]@ ELSE \ для аргумента от 0 до 20 взять из таблицы -1 S>D THEN \ если результат вылезает за сетку выдается -1 ;
: test 1F 0 DO I . ." ! = " I fact D. CR LOOP ;
DECIMAL \ хотите результат в десятичном виде - пожалуйста! test
результат: Код: 0 ! = 1 1 ! = 1 2 ! = 2 3 ! = 6 4 ! = 24 5 ! = 120 6 ! = 720 7 ! = 5040 8 ! = 40320 9 ! = 362880 10 ! = 3628800 11 ! = 39916800 12 ! = 479001600 13 ! = 6227020800 14 ! = 87178291200 15 ! = 1307674368000 16 ! = 20922789888000 17 ! = 355687428096000 18 ! = 6402373705728000 19 ! = 121645100408832000 20 ! = -1 21 ! = -1 22 ! = -1 23 ! = -1 24 ! = -1 25 ! = -1 26 ! = -1 27 ! = -1 28 ! = -1 29 ! = -1 30 ! = -1
Код:
[code] \ write by WingLion admin@winglion.ru \ для fork410233
\ подключение нужных деталей
branch/ doloop.fts math/ double.fts
HEX \ ну вот, привык я в HEX-е работать!
CREATE Ftab 100 ALLOT ;CREATE \ резервируется 256 байт под 32 табличных значения Ftab 100 ERASE \ инициализация таблицы нулями, на всякий случай, а бес его знает, зачем...
: Ftab[] ( i -> adr ) \ расчет адреса в массиве 1F AND \ ограничитель на номер массива больше 20! все равно в двойное целое не влезет 8 * Ftab + ; \ вычисление адреса : Ftab[]@ Ftab[] D@ ; \ получение результата из таблицы ( без ограничений на индекс )
1 S>D 0 Ftab[] D! \ инициализировать нулевой элемент таблицы единицей \ инициализировать таблицу по схеме f(i) = i*f(i-1) : init 1F 1 DO I 1 - Ftab[]@ I S>D D* I Ftab[] D! LOOP ; init
\ вычисление факториала : fact DUP 14 < IF Ftab[]@ ELSE \ для аргумента от 0 до 20 взять из таблицы -1 S>D THEN \ если результат вылезает за сетку выдается -1 ;
: test 1F 0 DO I . ." ! = " I fact D. CR LOOP ;
DECIMAL \ хотите результат в десятичном виде - пожалуйста! test
[/code]
результат: [code] 0 ! = 1 1 ! = 1 2 ! = 2 3 ! = 6 4 ! = 24 5 ! = 120 6 ! = 720 7 ! = 5040 8 ! = 40320 9 ! = 362880 10 ! = 3628800 11 ! = 39916800 12 ! = 479001600 13 ! = 6227020800 14 ! = 87178291200 15 ! = 1307674368000 16 ! = 20922789888000 17 ! = 355687428096000 18 ! = 6402373705728000 19 ! = 121645100408832000 20 ! = -1 21 ! = -1 22 ! = -1 23 ! = -1 24 ! = -1 25 ! = -1 26 ! = -1 27 ! = -1 28 ! = -1 29 ! = -1 30 ! = -1 [/code]
|
|
|
|
Добавлено: Сб фев 06, 2010 15:51 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
мой вариант для форка: branch/ for-next.fts memory/ double.fts math/ double.fts
\ произведение # чисел, получаемых с помощью xt : П ( # xt --> d ) A>L NOW 0`1 SINCE R@ AL@ EXECUTE -ROT SD* TILL ALDROP ;
: fact ( # --> ) ' NOOP П D. ;
мой вариант для форка: [pre]branch/ for-next.fts memory/ double.fts math/ double.fts
\ произведение # чисел, получаемых с помощью xt : П ( # xt --> d ) A>L NOW 0`1 SINCE R@ AL@ EXECUTE -ROT SD* TILL ALDROP ;
: fact ( # --> ) ' NOOP П D. ;[/pre]
|
|
|
|
Добавлено: Сб фев 06, 2010 13:11 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
Код: : N! ( n --n!) dup 0= IF drop 1 S>D ELSE 1 S>D rot DO i S>D D* LOOP THEN ;
[code]: N! ( n --n!) dup 0= IF drop 1 S>D ELSE 1 S>D rot DO i S>D D* LOOP THEN ;[/code]
|
|
|
|
Добавлено: Сб фев 06, 2010 12:30 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
Цитата: Факториа́л числа n (обозначается n!, произносится эн факториа́л) — произведение всех натуральных чисел до n включительно: .
По определению полагают 0! = 1. Факториал определён только для целых неотрицательных чисел. http://ru.wikipedia.org/wiki/Факториал Цитата: решения для чисел с плавающей точкой ?
[quote]Факториа́л числа n (обозначается n!, произносится эн факториа́л) — произведение всех натуральных чисел до n включительно: .
По определению полагают 0! = 1. Факториал определён только для целых неотрицательных чисел.[/quote] http://ru.wikipedia.org/wiki/Факториал
[quote]решения для чисел с плавающей точкой[/quote] ?
|
|
|
|
Добавлено: Сб фев 06, 2010 12:20 |
|
|
|
|
|
Заголовок сообщения: |
*вычисление факториала разными способами |
|
|
найти факториал числа, результат должен быть двойной длины. решения должны быть разными!(интересно, сколько найдется интересных способов решения : fact ( u --> ud ) ; впрочем, решения для чисел с плавающей точкой, а так же для "длинных" чисел так же приветствуются!
найти факториал числа, результат должен быть двойной длины. решения должны быть разными!(интересно, сколько найдется интересных способов решения 8) [pre]: fact ( u --> ud ) ;[/pre]
впрочем, решения для чисел с плавающей точкой, а так же для "длинных" чисел так же приветствуются!
|
|
|
|
Добавлено: Сб фев 06, 2010 09:25 |
|
|
|
|