标题: [数值计算] 批处理高效率大数阶乘运算 [打印本页]
作者: terse 时间: 2013-6-6 15:59 标题: 批处理高效率大数阶乘运算
因朋友叫写个效率能提高点的大数阶乘
发在这里 能有提高效率的 盼指教
如版主认为 重复贴 可删除- @echo off&setlocal enabledelayedexpansion
- Set /a "X=1,X_len=6"
- set i=000000000000&set X=!i:~,5!!X!
- for /l %%i in (2 1 1000) do (
- for /l %%j in (6 6 !X_len!) do (
- if "!x:~-%%j,6!" neq "000000" (
- for /f "tokens=* delims=0" %%k in ("!x:~-%%j,6!") do (
- set /a "i=%%i*%%k+1!i:~-6!+0X3B8B87C0"
- )
- )
- set T=!i:~-6!!T!&set "i=000000!i:~1,-6!"
- )
- for /f "tokens=* delims=0" %%j in ("!i!!t!") do set "x=00000%%j"
- if "!i:0=!" neq "" set /a "X_len+=6"
- set t=&set "i=%i%"
- )
- echo !X:~5!
- pause
复制代码
作者: terse 时间: 2013-6-6 16:29
这样 大数乘法似乎效率可以高点了
论坛上 乘法的运算应该有了
如版主认为 重复贴 可删除- @echo off&setlocal enabledelayedexpansion
- set X=33478071698956898786044169848212690817704794983713768568912431388982883793878002287614711652531743087737814467999489
- set Y=36746043666799590428244633799627952632279158164343087642676032283815739666511279233373417143396810270092798736308917
- for %%i in (X Y) do (
- set $%%i=000!%%i!&set S=!$%%i!&set #%%i=1
- 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!"
- )
- set j=0000
- for /l %%i in (4 4 %#X%) do (
- for /f "tokens=* delims=0" %%a in ("!$x:~-%%i,4!") do (
- if "%%a" neq "" (
- set s=&set i=0000
- for /l %%j in (4 4 %#Y%) do (
- for /f "tokens=* delims=0" %%b in ("!$y:~-%%j,4!") do (
- if "%%b" neq "" (
- set /a i=%%a*%%b+1!i:~-4!+1!j:~-%%j,4!+0x5F592E0
- ) else set/a i=1!i:~-4!+1!j:~-%%j,4!+0x5F592E0
- )
- set s=!i:~-4!!s!&set i=!i:~,-4!
- )
- set j=!i!!s!
- )
- set str=!j:~-4!!str!
- set j=%j%!j:~1,-4!
- )
- )
- for /f "tokens=* delims=0" %%i in ("!j!!str!") do echo %%i
- 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)) 一行搞定怎么破- import datetime
- t1 = datetime.datetime.now()
- print reduce(lambda x,y:x*y,range(1,99999))
- t2 = datetime.datetime.now()
- t = t2-t1
- print t.microseconds
复制代码
惭愧,4核虚拟8核的中高端配置居然跑了将近一分钟之久,果然比不了 powershell...膜拜
不想扯人品的,我只想说,万般皆下品的宣传策略恐怕最多只能算是负面营销,酒香不怕巷子深,没人会毫无理由地拒绝真正的好东西
作者: cutebe 时间: 2013-7-6 23:31
弱弱地问一下,这个怎么用?
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |