forcal 发表于 2010-8-10 10:49:32

以下八皇后问题,测试的是函数递归调用的速度,一直想看看lua的速度,但不会写代码,谁能帮忙写一个?// 在运行不同的程序时,Forcal的速度,从接近C++到只有C++速度的几十分之一。
// Forcal的建议是:对运行时间较长的程序,如确有必要,设计成二级函数由Forcal调用,从而获得接近C++速度的性能。
// Forcal与C++是无缝链接的。故C++能实现的功能,借助二级函数,Forcal完全可以实现。
// 但没有Forcal支持的C++程序,将无法获得高效率地实时编译计算字符串表达式的功能。

// 据测定,以下八皇后问题,Forcal的运行速度约为C++的1/10。
// 八皇后问题是一个古老而著名的问题,是回溯算法的典型例题。
// 该问题是19世纪著名的数学家高斯1850年提出:在8×8格的国际象棋盘上摆放8个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。
// 高斯认为有76种方案。1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。
// 以下算法是从网上搜来的,该算法没有最终给出排列组合,仅仅给出有多少种组合,但是算法确实十分奥妙。

//Forcal源程序
i:(::sum,upperlim)= sum=0,upperlim=1,SetIntStackMax(1000);
i:test(row, ld, rd : pos,p : sum,upperlim)=
{
        which {        row != upperlim,
                {        pos = and{upperlim , not},
                        while{        pos,
                                p = and(pos,-pos),
                                pos = pos -p,
                                test(row+p, shl(ld+p,1), shr(rd+p,1))
                        }
                },
                sum++
        }
};
i:main(:tm,n:sum,upperlim)=
{
        n=15,
        tm=sys::clock(),
        printff{"\r\nQueens:{1,i} , ",n},
        upperlim=shl(upperlim,n)-1,
        test(0,0,0),
        printff{"sum:{1,i} , {2,i} millisecond.\r\n",sum,sys::clock()-tm}
};

//完成相同功能的C++程序
/*
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

long sum=0,upperlim=1;

void test(long row, long ld, long rd){

        if (row != upperlim){
                long pos = upperlim & ~(row | ld | rd);
                while (pos){
                        long p = pos& -pos;
                        pos -= p;
                        test(row+p, (ld+p)<<1, (rd+p)>>1);
                }
        }
        else
        sum++;
}

int main(int argc, char *argv[])
{
        time_t tm;
        int n=15;

        if(argc!=1)n=atoi(argv);
        tm=time(0);
        if((n<1)||(n>32))
        {
                printf(" heh..I can’t calculate that.\n");
                exit(-1);
        }
        printf("%d Queens\n",n);
        upperlim=(upperlim<<n)-1;

        test(0,0,0);
        printf("Number of solutions is %ld, %d seconds\n", sum,(int)(time(0)-tm));
}
*/

wayne 发表于 2010-8-10 11:59:45

20# forcal

你说过“不使用MSVC运行库的静态库版本”, 是说forcal可以有linux版本吗?

lua可以与wxwidgets胶合的,叫wxlua,编写界面特别简洁,跟Tcl/Tk一样。

mathe 发表于 2010-8-10 12:02:31

个人以为,让别人接受一种新语言是非常困难的,除非说它有非常非常多非常非常强大的功能。

wayne 发表于 2010-8-10 12:20:24

mathe掷话 一针见血,
现在的编程语言实在是太多太多了,
新的编程语言如果没有显著的招牌特点,是很难发展下去的。

无心人 发表于 2010-8-10 12:48:50

可以支持函数式编程
不过编译解释器难度很大

forcal 发表于 2010-8-10 14:42:48

20# forcal

你说过“不使用MSVC运行库的静态库版本”, 是说forcal可以有linux版本吗?

lua可以与wxwidgets胶合的,叫wxlua,编写界面特别简洁,跟Tcl/Tk一样。
wayne 发表于 2010-8-10 11:59 http://bbs.emath.ac.cn/images/common/back.gif
Forcal是用C/C++设计的,里面没有用C++复杂的高级特征,也没有使用汇编,因此有很强的移植性。如果在windows下能获得认可,再发展linux版本。
Forcal现在没有与其他任何东西胶合,如界面库、数据库等等。
但Forcal是一个dll,可以被任何可加载dll的程序使用。从计算简单的数学表达式到构建复杂的系统,Forcal都可以提供支持。所有的Forcal扩展库都是根据核心库Forcal32w.dll的输出函数设计的。

forcal 发表于 2010-8-10 14:51:16

个人以为,让别人接受一种新语言是非常困难的,除非说它有非常非常多非常非常强大的功能。
mathe 发表于 2010-8-10 12:02 http://bbs.emath.ac.cn/images/common/back.gif

非常赞同这个观点,呵呵。

在某些方面,Mathematica 和Maple 提供了比matlab更好的实现和功能,但一般人遇到要解决的问题,多数还是选matlab,尽管Mathematica 和Maple 会做得更好。

无心人 发表于 2010-8-11 10:19:25

楼上,因为这两个都太数学化了

wayne 发表于 2010-8-11 10:28:50

27# forcal
提及MATLAB,我忍不住要说几句,
大学里面的什么自动化,机械电子,甚至经管,数学系的教科书都动不动就使用 MATLAB,还有计算机系根本就没怎么动及linux操作系统, 我甚是不解,真不知道搞大学教育的那些爷们是怎么吃这口教育饭的

wayne 发表于 2010-8-11 10:38:30

我看过不少国外影印版的英文教科书,工科方面的,就是自动控制,数字信号处理,图像处理什么的,也是大谈MATLAB,我想,MATLAB在中国教育界的盛行 大概就是中国教育制度跟在西方屁股后面,亦步亦趋的结果,
西化就西化呗,可三十年来就没怎么换过发型~~
页: 1 2 [3] 4
查看完整版本: GMP大数运算库的一个Qt界面小程序