验证哥德巴赫猜想:
my $n;
for (my $k=9999999000; $k<9999999999; $k +=2) {
$n = goldbach($k);
print "$k -> $n ", $k - $n , "\n";
}
# 由外部代码负责校验传给函数的参数正确:不小于6的偶数。
sub goldbach {
my $number = $_[0];
for (my $i=3; $i<=($number/2); $i+= 2) {
next unless (prime_judge($i));
return $i if (prime_judge($number - $i));
}
return 0;
}
sub prime_judge {
my $n = $_[0];
return 1 if ($n == 2);
return 0 unless ($n % 2);
my $factor = int(sqrt($n)) + 1;
for (my $i=3; $i<=$factor; $i+=2)
{ return 0 unless ($n % $i) }
return 1;
}
2007年7月30日星期一
2007年7月29日星期日
Prime number
判断一个整数是否素数。刚才在网上搜了一下,竟然发现有人在到处找什么一百万以内、一亿以内的素数表,纳闷ing...,几行代码不就出来了么?还找个什么劲。
sub prime_judge {
my $n = $_[0];
return 1 if ($n == 2); # 2 是唯一的偶数素数
return 0 unless ($n % 2); # 其它偶数为非素数
my $factor = int(sqrt($n)) + 1;
for (my $i=3; $i<=$factor; $i+=2)
{ return 0 unless ($n % $i) }
return 1;
}
sub prime_judge {
my $n = $_[0];
return 1 if ($n == 2); # 2 是唯一的偶数素数
return 0 unless ($n % 2); # 其它偶数为非素数
my $factor = int(sqrt($n)) + 1;
for (my $i=3; $i<=$factor; $i+=2)
{ return 0 unless ($n % $i) }
return 1;
}
2007年7月28日星期六
LaTeX note
看了 CTeX 的 LaTeX 入门视频教程,复习一下 LaTeX 最基本的知识。原来我的文档标题、作者、日期信息都是写在导言区的,现在才知道也可以写在文档环境中(\begin{document} 后面),而且写在文档环境中应该在语法上更符合逻辑。
\makebox[ width][pos]{ text} TEXT
参数 width 是指盒子的宽度,参数 pos 接受一个字符,决定 text 的排列:c-居中、l-靠左、r-靠右、s-将文本均匀分布到整个盒子中。若盒子的宽度小于 text 的宽度,则 text 多出的部分就会与后继的文字 TEXT 重叠。
for example: \makebox[1cm][c]{测试 makebox 指令} 重叠部分
\framebox 和 \makebox 完成同样的功能,只是 \framebox 将在包含的文字周围画一个矩形框。
若文档中有中文字符,需要引用 color 宏包时,应将 color 宏包的引用指令写在 \begin{CJK}{GBK}{fs}后面,否则可能造成编译错误。即:
\begin{CJK}{GBK}{fs}
\usepackage{color}
指令 \textcolor{color}{text} 为text着色,
指令 \colorbox{color}{text} 为text加底色
\makebox[ width][pos]{ text} TEXT
参数 width 是指盒子的宽度,参数 pos 接受一个字符,决定 text 的排列:c-居中、l-靠左、r-靠右、s-将文本均匀分布到整个盒子中。若盒子的宽度小于 text 的宽度,则 text 多出的部分就会与后继的文字 TEXT 重叠。
for example: \makebox[1cm][c]{测试 makebox 指令} 重叠部分
\framebox 和 \makebox 完成同样的功能,只是 \framebox 将在包含的文字周围画一个矩形框。
若文档中有中文字符,需要引用 color 宏包时,应将 color 宏包的引用指令写在 \begin{CJK}{GBK}{fs}后面,否则可能造成编译错误。即:
\begin{CJK}{GBK}{fs}
\usepackage{color}
指令 \textcolor{color}{text} 为text着色,
指令 \colorbox{color}{text} 为text加底色
2007年7月24日星期二
Customize LaTeX
创建新的命令:
自定义宏包:
写一个宏包的基本工作就是把原本很长的文档导言写入一个分离的文件中,这个文件的扩展名是 .sty ,并且在这个文件的开头要使用一个特殊命令 \Providespackage{ package name} ,它用于告诉 LaTeX 宏包的名称,从而允许 LaTeX 在你尝试重复引入同一个宏包的时候给出错误提示。
- \newcommand{name}[num]{ definition} 第一个参数 name 是想要创建的命令名称,参数 definition 是命令的定义,参数 num 是可选的,用于指定命令所需的参数数目,最多可有 9 个参数,若省略此项,则不接受参数。创建的新命令不能与已有的命令重名
- \renewcommand 与上个命令语法相同,但可用于更改已有命令的定义。
- \providecommand 与上面的语法相同,当创建的新命令与已有命令重名时,新命令被忽略
- \newenvironment{name}[num]{ before}{after} 在参数 before 中提供的内容将在被命令包含的文本之前处理,而在参数 after 中提供的内容将恰好在 \end{name} 的前面处理。
- \renewenvironment{name}[num]{ before}{after} 与上面语法相同,但允许重新定义已有的环境。
自定义宏包:
写一个宏包的基本工作就是把原本很长的文档导言写入一个分离的文件中,这个文件的扩展名是 .sty ,并且在这个文件的开头要使用一个特殊命令 \Providespackage{ package name} ,它用于告诉 LaTeX 宏包的名称,从而允许 LaTeX 在你尝试重复引入同一个宏包的时候给出错误提示。
2007年7月17日星期二
Google vs. China
这篇 blog 的标题本来是 "Google vs. baidu" ,想了想改成现在的名字,因为 Google 在中国市场面对的不仅仅是 baidu 。
近几天在 ChinaUnix bbs 和国内几个网站的新闻上攻击 Goolge 的评论和新闻突然多了起来,说 Google 的中文搜索质量不好、服务不好、做流氓软件搞软件捆绑等等。
Google 作为一个成功的企业到中国开拓市场,虽然有着强大的资金、技术支持,但也遇到了特殊的困难:
我现在常用的 Google 服务: 搜索引擎(几乎离不开的)、picasaweb(网络图册)、blogger(blog服务)、Gmail(邮件)、igoogle(个性化主页)、Google 日历、Google 工具条、Google 桌面,另外 Google 实验室还提供了许多实用有趣的工具,例如 Google 趋势、机器翻译等。
一个电视节目把 Google 搜索引擎出现之前的互联网时期称为"互联网的黑暗时代",一点都不过分。Google 模式的搜索引擎在互联网上起到的作用,每一个使用 Internet 的人都应该有深切体会。
blogger 提供了强大的 blog 服务,自由的、可完全定制的模板,可以方便地通过 email 发布日志(同时起到了备份的效果) 。可惜 blogspot 在国内登录不了,只能通过 ftp 转发。
加上 Gmail 我用过 8个(有7个是国内的)免费邮件服务,Gmail 是唯一不在邮件内容中添加广告的。
igoogle 可以在简洁的 Google 搜索首页添加各种个性化的、有趣实用的工具。我在上面添加了收藏夹,嘿嘿,再也不用为重装系统丢了收藏夹郁闷了,而且在任何一台机器上都可以用。
现在许多软件中都捆绑了 Google 工具条,但是把 Google 工具条定义为流氓软件纯属恶意攻击。首先,Google 工具条在安装前有明确的提示和选项,用户可以选择不安装它,而且不会对捆绑了 Google 工具条的软件造成任何影响。其次,在需要卸载 Google 工具条的时候,可以方便地彻底卸载它。更何况对于使用 Google 搜索的用户来说,它确实是一个非常方面实用的小工具。这样的软件能称为流氓软件么?
为什么像 IE 那样流氓的捆绑方式、像中文网址那样流氓的强制安装都没多少人质疑,却有人不遗余力地攻击 Google 工具条,是不是另有隐情?
还有非常重要的一点就是:Google 对于不同操作系统,尤其是 Unix-like 的系统兼容性非常好。指望国内公司开发 Linux 应用看来是够呛。Google DeskTop 已经出了 for Linux 版本,希望 Linux 下的 Google 应用越来越丰富,越来越好。
近几天在 ChinaUnix bbs 和国内几个网站的新闻上攻击 Goolge 的评论和新闻突然多了起来,说 Google 的中文搜索质量不好、服务不好、做流氓软件搞软件捆绑等等。
Google 作为一个成功的企业到中国开拓市场,虽然有着强大的资金、技术支持,但也遇到了特殊的困难:
- 本土化人才,虽然 Google在美国和其它国家获得了巨大的成功,但基本上它以前的搜索主要是面向英语和其它一些西方语言的,做中文搜索,还需要有好的了解中文和中国文化的技术专家;
- 中国特色,Google 本来坚守的"Don't be evil"信条在进军中国市场的途中受到严峻的挑战。Googlepages 被封了,blogger 被封了,搜索结果被过滤了
我现在常用的 Google 服务: 搜索引擎(几乎离不开的)、picasaweb(网络图册)、blogger(blog服务)、Gmail(邮件)、igoogle(个性化主页)、Google 日历、Google 工具条、Google 桌面,另外 Google 实验室还提供了许多实用有趣的工具,例如 Google 趋势、机器翻译等。
一个电视节目把 Google 搜索引擎出现之前的互联网时期称为"互联网的黑暗时代",一点都不过分。Google 模式的搜索引擎在互联网上起到的作用,每一个使用 Internet 的人都应该有深切体会。
blogger 提供了强大的 blog 服务,自由的、可完全定制的模板,可以方便地通过 email 发布日志(同时起到了备份的效果) 。可惜 blogspot 在国内登录不了,只能通过 ftp 转发。
加上 Gmail 我用过 8个(有7个是国内的)免费邮件服务,Gmail 是唯一不在邮件内容中添加广告的。
igoogle 可以在简洁的 Google 搜索首页添加各种个性化的、有趣实用的工具。我在上面添加了收藏夹,嘿嘿,再也不用为重装系统丢了收藏夹郁闷了,而且在任何一台机器上都可以用。
现在许多软件中都捆绑了 Google 工具条,但是把 Google 工具条定义为流氓软件纯属恶意攻击。首先,Google 工具条在安装前有明确的提示和选项,用户可以选择不安装它,而且不会对捆绑了 Google 工具条的软件造成任何影响。其次,在需要卸载 Google 工具条的时候,可以方便地彻底卸载它。更何况对于使用 Google 搜索的用户来说,它确实是一个非常方面实用的小工具。这样的软件能称为流氓软件么?
为什么像 IE 那样流氓的捆绑方式、像中文网址那样流氓的强制安装都没多少人质疑,却有人不遗余力地攻击 Google 工具条,是不是另有隐情?
还有非常重要的一点就是:Google 对于不同操作系统,尤其是 Unix-like 的系统兼容性非常好。指望国内公司开发 Linux 应用看来是够呛。Google DeskTop 已经出了 for Linux 版本,希望 Linux 下的 Google 应用越来越丰富,越来越好。
2007年7月16日星期一
emule_Perl_JavaScript_etc.
公司封了 bt 的端口,现在改用 emule 了,HOHO~ 从软件授权来看我还是比较喜欢 emule ,但似乎在国内从资源方面来说,还是 bt 要丰富一些。
Perl 现在对我来说有几个问题:
论坛上看到有人用 javascript 写程序,挺好玩,一直对 java 没有好感,感觉 java 太复杂了(主要是 JVM 安装太麻烦,资源占用也比较大),所以也没有认真看 javascript,虽然知道它们不是一回事,但名字也看着不爽。为了考虑改进我的 blog 模板,弥补一下 Perl 的部分空白,从网上下载了一部"JavaScript权威指南第四版",是扫描版的,代码部分很模糊。
Perl 现在对我来说有几个问题:
- 发布不方便,尤其需要用到标准发布版以外的模块时。在 windows 上用 PPM 安装,需要连接 Internet ,如果编译安装,windows 本身又没有 C/C++ 编译器,要另外安装(windows垃圾点之一)。
- 编写图形界面的程序不方便
- 操作 windows 系统不太方便,这也是 windows 造成的问题。
论坛上看到有人用 javascript 写程序,挺好玩,一直对 java 没有好感,感觉 java 太复杂了(主要是 JVM 安装太麻烦,资源占用也比较大),所以也没有认真看 javascript,虽然知道它们不是一回事,但名字也看着不爽。为了考虑改进我的 blog 模板,弥补一下 Perl 的部分空白,从网上下载了一部"JavaScript权威指南第四版",是扫描版的,代码部分很模糊。
2007年7月10日星期二
Multi-processes
使用 fork() 时需要注意的问题:
1. 记录 fork 出的子进程 id,收割进程时验证
2. parent process 和 child process 有各自独立的进程空间
3. 使用 exit 结束 child process
4. 已没有需要回收的 child process 时 wait() 返回 -1
下面是测试局域网中机器联网状态的程序(使用 icmp 扫描,可接收到反馈则认为已联网)。
#! /usr/bin/perl
use warnings;
use strict;
my $host_prefix = '192.168.0.';
my @hosts;
for ( 80 .. 200) {
my $host = $host_prefix . " $_";
push(@hosts, $host);
}
my $number_of_process = 20;
my %counter_process;
use Net::Ping;
my $p = Net::Ping->new('icmp', 2);
for my $h (@hosts) {
if (keys(%counter_process) > $number_of_process)
{ reap_process(\%counter_process) }
if (my $process = fork)
{ $counter_process{$process} = $h }
elsif (defined($process)) {
if ($p->ping($h)) { print "$h is alive\n" }
else { print "$h is not alive \n" }
exit 0;
} else { die "Something wrong at this $! " }
}
$p->close;
1 while (reap_process(\%counter_process ));
# functions definition -----------------
sub reap_process {
my $process_hash = $_[0];
my $pid = wait;
return 0 if ( $pid == -1);
delete($process_hash->{$pid}) or warn(" Cannot see $pid\n");
1; # if reap a child
}
1. 记录 fork 出的子进程 id,收割进程时验证
2. parent process 和 child process 有各自独立的进程空间
3. 使用 exit 结束 child process
4. 已没有需要回收的 child process 时 wait() 返回 -1
下面是测试局域网中机器联网状态的程序(使用 icmp 扫描,可接收到反馈则认为已联网)。
#! /usr/bin/perl
use warnings;
use strict;
my $host_prefix = '192.168.0.';
my @hosts;
for ( 80 .. 200) {
my $host = $host_prefix . " $_";
push(@hosts, $host);
}
my $number_of_process = 20;
my %counter_process;
use Net::Ping;
my $p = Net::Ping->new('icmp', 2);
for my $h (@hosts) {
if (keys(%counter_process) > $number_of_process)
{ reap_process(\%counter_process) }
if (my $process = fork)
{ $counter_process{$process} = $h }
elsif (defined($process)) {
if ($p->ping($h)) { print "$h is alive\n" }
else { print "$h is not alive \n" }
exit 0;
} else { die "Something wrong at this $! " }
}
$p->close;
1 while (reap_process(\%counter_process ));
# functions definition -----------------
sub reap_process {
my $process_hash = $_[0];
my $pid = wait;
return 0 if ( $pid == -1);
delete($process_hash->{$pid}) or warn(" Cannot see $pid\n");
1; # if reap a child
}
2007年7月4日星期三
Echo's story
记得在 BASH 中的 echo 命令么?在希腊神话中,Echo 是一位最漂亮的仙女,也是一位最不幸的女神。Zeus(众神之王宙斯)爱上了 Echo,Hera(Zeus的lp赫拉)便迁怒于 Echo,罚她永远不能说自己的话,只能重复别人对她说过的话。
然而 Echo 爱上了 Narcissus。他是一位英俊而高傲的美男子,每一个见过他的姑娘都会深深爱上他,可 Narcissus 却对她们不屑一顾。
Echo 对他最为痴情,但她却不能对 Narcissus 倾吐衷肠,只能像影子一样追随着他。无情的 Narcissus 对 Echo 很反感,竟对她说:"你别梦想我会为你着迷!"可怜的 Echo 只能不断重复:"我为你着迷!我为你着迷!……" Narcissus 却拂袖而去。
羞愧万分的 Echo 躲进山洞,终日少言寡语,形销骨立,直到整个玉体全部消失,只留下她的声音,在山洞里日复一日地重复着别人说的话。
Echo 这个词也因此进入英语中,有回音、回声、重复、随声附和之意。残酷无情的 Narcissus 也因爱恋自己在水中的倒影,最终憔悴而死,化成一朵水仙花。Narcissus 和水仙花也成为自恋的象征。
然而 Echo 爱上了 Narcissus。他是一位英俊而高傲的美男子,每一个见过他的姑娘都会深深爱上他,可 Narcissus 却对她们不屑一顾。
Echo 对他最为痴情,但她却不能对 Narcissus 倾吐衷肠,只能像影子一样追随着他。无情的 Narcissus 对 Echo 很反感,竟对她说:"你别梦想我会为你着迷!"可怜的 Echo 只能不断重复:"我为你着迷!我为你着迷!……" Narcissus 却拂袖而去。
羞愧万分的 Echo 躲进山洞,终日少言寡语,形销骨立,直到整个玉体全部消失,只留下她的声音,在山洞里日复一日地重复着别人说的话。
Echo 这个词也因此进入英语中,有回音、回声、重复、随声附和之意。残酷无情的 Narcissus 也因爱恋自己在水中的倒影,最终憔悴而死,化成一朵水仙花。Narcissus 和水仙花也成为自恋的象征。
Area of Squares
#! /usr/bin/perl
use warnings;
use strict;
=problem
author: redspid@gmail.com
计算下图中所有正方形的面积之和
_____________
|__|__|__|__|__| 00 01 02 03 04 05
|__|__|__|__|__| 10 11 12 13 14 15
|__|__|__|__|__| 20 21 22 23 24 25
|__|__|__|__|__| 30 31 32 33 34 35
|__|__|__|__|__| 40 41 42 43 44 45
|__|__|__|__|__| 50 51 52 53 54 55
=cut
# 开启整数环境。使用整数环境后,
# 可计算大正方形的最大边长减小,因整数数值范围比浮点数小
# 但计算速度有所提升。
# dprofpp 测试结果显示:
# 大正方形边长为 120个单位时速度约提升 5% 。
# 大正方形边长越大,速度提升越明显。
use integer;
my $n = 20; # 大正方形边长
my $area = 0;
for my $row (0 .. $n- 1) {
for my $col (0 .. $n- 1) {
my $m = $row > $col ? $n-$row : $n-$col;
if ( $m == 1) { $area += 1 }
else { for my $i (1 .. $m ) { $area += $i *$i } }
}
}
print $area, "\n";
use warnings;
use strict;
=problem
author: redspid@gmail.com
计算下图中所有正方形的面积之和
_____________
|__|__|__|__|__| 00 01 02 03 04 05
|__|__|__|__|__| 10 11 12 13 14 15
|__|__|__|__|__| 20 21 22 23 24 25
|__|__|__|__|__| 30 31 32 33 34 35
|__|__|__|__|__| 40 41 42 43 44 45
|__|__|__|__|__| 50 51 52 53 54 55
=cut
# 开启整数环境。使用整数环境后,
# 可计算大正方形的最大边长减小,因整数数值范围比浮点数小
# 但计算速度有所提升。
# dprofpp 测试结果显示:
# 大正方形边长为 120个单位时速度约提升 5% 。
# 大正方形边长越大,速度提升越明显。
use integer;
my $n = 20; # 大正方形边长
my $area = 0;
for my $row (0 .. $n- 1) {
for my $col (0 .. $n- 1) {
my $m = $row > $col ? $n-$row : $n-$col;
if ( $m == 1) { $area += 1 }
else { for my $i (1 .. $m ) { $area += $i *$i } }
}
}
print $area, "\n";
订阅:
博文 (Atom)