Board logo

标题: [数值计算] 批处理高效率大数阶乘运算 [打印本页]

作者: terse    时间: 2013-6-6 15:59     标题: 批处理高效率大数阶乘运算

因朋友叫写个效率能提高点的大数阶乘
发在这里 能有提高效率的 盼指教
如版主认为 重复贴 可删除
  1. @echo off&setlocal enabledelayedexpansion
  2. Set /a "X=1,X_len=6"
  3. set i=000000000000&set X=!i:~,5!!X!
  4. for /l %%i in (2 1 1000) do (
  5.     for /l %%j in (6 6 !X_len!) do (
  6.         if "!x:~-%%j,6!" neq "000000" (
  7.            for /f "tokens=* delims=0" %%k in ("!x:~-%%j,6!") do (
  8.        set /a "i=%%i*%%k+1!i:~-6!+0X3B8B87C0"
  9.            )
  10.         )
  11.        set T=!i:~-6!!T!&set "i=000000!i:~1,-6!"
  12.     )
  13.        for /f "tokens=* delims=0" %%j in ("!i!!t!") do set "x=00000%%j"
  14.        if "!i:0=!" neq "" set /a "X_len+=6"
  15.        set t=&set "i=%i%"
  16. )
  17. echo !X:~5!
  18. pause
复制代码

作者: terse    时间: 2013-6-6 16:29

这样 大数乘法似乎效率可以高点了
论坛上 乘法的运算应该有了
如版主认为 重复贴 可删除
  1. @echo off&setlocal enabledelayedexpansion
  2. set X=33478071698956898786044169848212690817704794983713768568912431388982883793878002287614711652531743087737814467999489
  3. set Y=36746043666799590428244633799627952632279158164343087642676032283815739666511279233373417143396810270092798736308917
  4. for %%i in (X Y) do (
  5. set $%%i=000!%%i!&set S=!$%%i!&set #%%i=1
  6.     for %%j in (4096 2048 1024 512 256 128 64 32 16 8 4 2 1)do if "!S:~%%j!" neq "" set/a #%%i+=%%j&set "S=!S:~%%j!"
  7. )
  8. set j=0000
  9. for /l %%i in (4 4 %#X%) do (
  10.     for /f "tokens=* delims=0" %%a in ("!$x:~-%%i,4!") do (
  11.         if "%%a" neq "" (
  12.            set s=&set i=0000
  13.            for /l %%j in (4 4 %#Y%) do (
  14.                for /f "tokens=* delims=0" %%b in ("!$y:~-%%j,4!") do (
  15.                    if "%%b" neq "" (
  16.                       set /a i=%%a*%%b+1!i:~-4!+1!j:~-%%j,4!+0x5F592E0
  17.                    ) else set/a i=1!i:~-4!+1!j:~-%%j,4!+0x5F592E0
  18.                )
  19.                      set s=!i:~-4!!s!&set i=!i:~,-4!
  20.            )
  21.                      set j=!i!!s!
  22.         )
  23.                      set str=!j:~-4!!str!
  24.                      set j=%j%!j:~1,-4!
  25.     )
  26. )
  27. for /f "tokens=* delims=0" %%i in ("!j!!str!") do echo %%i
  28. pause
复制代码

作者: terse    时间: 2013-6-6 16:32

把大数除法  大数开方 以及加减 运算效率提上去
权当自娱自乐
作者: plp626    时间: 2013-7-4 21:52

http://www.bathome.net/viewthread.php?tid=17686&highlight=%BD%D7%B3%CB
数学研发网的一个网友,这是他学批处理的第一个程序,
作者: terse    时间: 2013-7-4 22:40

为 学批处理的第一个程序 汗一个
作者: PowerShell    时间: 2013-7-5 10:35

本帖最后由 PowerShell 于 2013-7-5 19:16 编辑

1 这些代码我都看不懂
2 2楼和4楼能算多大的数捏?
3 我写过用powershell + .net4 算 9个9的阶乘的脚本习作,再大了就太慢了,毕竟是脚本语言。但是代码在家呢,今明天我会编辑此贴发上来共赏。
4 python也能算,在win中,算数学最恰当的应该是f#语言,各位菜鸟不可不知。其他的有matlab,pascal之类的。主要就是玩数学库。用cpu,显卡玩。用bat玩阶乘,我觉得算是原始时代,最差的。

--------------------------------------
搞错了,下面的是5个9的,我的机子跑5个9的话,半分钟左右。单cpu核心。汗啊。
不过如果9个9的话,你有大内存+快cpu,跑几个小时应该也能成。5个9那块要改成9个9,其他代码不用改任何。
-------------------------------------------------------------------------
Write-Host "注意:安装 .net4 先!"
Write-Host "注意:本程序已经测试过,成功运行,结果前n位为:28462596809170545189064132121198688901480"

[reflection.assembly]::loadwithpartialname("System.Numerics")
$anser_first="1"
$大数=[System.Numerics.BigInteger]:arse($anser_first)
$开始时间 = Get-Date
for ($i=99999;$i -gt 1;$i--)
{
$大数 *= $i

}
$结束时间 = Get-Date

$计算用时 = $结束时间 - $开始时间
Write-Host '计算用时为:',$计算用时,'请按回车键显示结果'
timeout /t 20
$大数.ToString()
作者: terse    时间: 2013-7-5 12:28

本帖最后由 terse 于 2013-7-5 12:31 编辑

回复 6# PowerShell
首先bat 做此类肯定有局限的
不过在前面说了权当自娱自乐
BAT支持最大变量字节是8k
bat做此类真的是自娱自乐 玩玩算法而已 故本人后做的 大数开方 和 大数除法 也就不放上来了

另 一楼是 大数阶乘 二楼是大数乘法
作者: PowerShell    时间: 2013-7-5 18:58

数学 数值 计算是严谨的,能做多大的不敢说么?
作者: terse    时间: 2013-7-5 19:05

尊敬的PowerShell版主大人   什么叫"能做多大的不敢说么"
清楚的说了 BAT支持最大变量字节是8k
也就是8192字节
你要是运算中无论是运算数还是运算结果 不超过这个限制 至少理论上可以 除非代码有问题
也就是说所有运算中用到的变量长度(包括结果)不超过这个限制就好 说得够明吗
作者: PowerShell    时间: 2013-7-5 19:21

本帖最后由 PowerShell 于 2013-7-5 19:35 编辑

说得够明吗----我觉得你说的不够明白。

n的阶乘应该用n!来表示,你的bat程序n最大能是多少?------n是一个数字,一个正整数。我问的你能听明白么?我要你回答一个确切的数字,即n,你告诉我8192字节干什么?
批处理高效率大数阶乘运算 - 大数是多大的数?n是多少?
作者: terse    时间: 2013-7-5 19:36

回复 10# PowerShell
抱歉了 本人到真没测试你说 N 最大到多少
我想来这个论坛是学习的交流 感觉和你交流 寥寥几句  就火药味太浓 不觉得吗
至于你身为版主 我想一定在某方面 做的很好 但做什么都 人先要做好
就此。。。。。
作者: terse    时间: 2013-7-5 19:43

正如你所说 计算是严谨 但我开始也说了 自娱自乐一下 是你来较真一下?
我也不做学术 你先做你的严谨  我先自娱自乐 不行吗
我之所以告诉你8192字节 BAT有了这个限制 你不理解 或其他的 我不得而知
难道要说大数 就非要说个数吗 至少这里的大数 是突破BAT 本身限制的
作者: Demon    时间: 2013-7-5 19:51

1 这些代码我都看不懂
2 2楼和4楼能算多大的数捏?
3 我写过用powershell + .net4 算 9个9的阶乘的脚本习作 ...
PowerShell 发表于 2013-7-5 10:35



我还以为传教士大人有什么精妙算法呢,原来是靠BigInteger类啊。
作者: Python    时间: 2013-7-5 20:12

回复 12# terse


    terse兄何必跟这种不知天高地厚的年轻人一般见识,让他一个人凉快去吧。
作者: PowerShell    时间: 2013-7-5 20:30

14楼的孙子从哪冒出来的?
作者: terse    时间: 2013-7-5 20:48

来论坛这么多时间 其他的不说 其他大小论坛 也跑过不少了 还真没有见过你这样素质的人  何况也是版主
看样子你不是来交流的 你是来寻衅的? 或者 或多或少带有挑衅性
人不要妄自菲薄 但更不要妄自尊大!
作者: PowerShell    时间: 2013-7-5 20:56

Demon:
【关于BigInteger类】
BigInteger类是。net中的无限大整数,和python中的整数类似,都是无限大的,真正大小只受当时的存储空间限制。阶乘的结果很大,用此正合用。况且powershell本身是。net的封装。我用BigInteger类有什么不妥么?

【关于算法】
玩脚本的都不太注重算法吧?我认为注重算法的都在玩c之类的。我认为玩脚本的更应该注重库和虚拟机(或者叫脚本解释器)。你注重算法么?


阶乘的话,不是能算更大的数,越好么?----大数阶乘,用powershell算法简单,数又没有啥限制,也就是说代码好写,功能又强,不是更好么?我想这样的语言(如powershell脚本语言,python脚本语言)大家才爱用吧。

我这个脚本最大能算多大的数(n)?我也不道,谁有32g内存的,高主频的服务器,可以试着测测。
作者: PowerShell    时间: 2013-7-5 21:03

本帖最后由 PowerShell 于 2013-7-5 21:35 编辑

楼主在本鞋市,喊道“快来买啊,我做出来的鞋子适合大脚丫”

我来围观道“你这鞋能适合多大的脚大小我看不透,你这鞋最大能适合,多少号的脚啊?我也是个做鞋的,我用艹x神兽皮,做过999999999---即9个9号脚穿的鞋 ”

楼主开始顾左右而言它道 “我做出来的鞋是自娱自乐的,我的鞋中原料的占地面积是8192”

我道 做鞋这件事是严谨的 ^_^ ,自娱自乐的鞋也有尺码啊,你不敢说么?

楼主道 “什么不敢说,我这就是8192”

我道 “我问的是多大尺码的脚能穿”

楼主道 “那我没测试过,你真是来买鞋的么?我看你火药味很重啊,你是砸场子来的吧?真正买鞋的都不应该问适合多大脚才对啊!我都说我自娱自乐了”


楼主道“我去过论坛千千万,我转过的鞋市万万千,真没见过你这样素质的人,你不要妄自尊大”


我哭道   “555天理呀!我就问了你做出来的鞋,适合多大号脚,却成了素质差,妄自尊大 ,谁给我块砖,我要一头撞死 ”


-----------------------------------------------
我放出了我做的鞋的3d打印图后,daemon道,原来你用了蚕丝啊,我还以为你用了天衣无缝针法和粗麻布呢.
我道蚕丝质地柔软,凉滑秀美,乃做鞋之上好之料也。
作者: terse    时间: 2013-7-5 21:43

楼主在本鞋市,喊道“快来买啊,我做出来的鞋子适合大脚丫”

我来围观道“你这鞋能适合多大的脚大小我看 ...
PowerShell 发表于 2013-7-5 21:03


没做作家真是可惜了
你就叫吧  无聊
作者: CrLf    时间: 2013-7-6 20:26

本帖最后由 CrLf 于 2013-7-6 20:31 编辑

回复 18# PowerShell


    python 代码用 print reduce(lambda x,y:x*y,range(1,99999)) 一行搞定怎么破
  1. import datetime
  2. t1 = datetime.datetime.now()
  3. print reduce(lambda x,y:x*y,range(1,99999))
  4. t2 = datetime.datetime.now()
  5. t = t2-t1
  6. print t.microseconds
复制代码
惭愧,4核虚拟8核的中高端配置居然跑了将近一分钟之久,果然比不了 powershell...膜拜
不想扯人品的,我只想说,万般皆下品的宣传策略恐怕最多只能算是负面营销,酒香不怕巷子深,没人会毫无理由地拒绝真正的好东西
作者: cutebe    时间: 2013-7-6 23:31

弱弱地问一下,这个怎么用?




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2