郭溢譞

郭溢譞的博客

他的个人主页  他的博客

Perl + 一点数论

郭溢譞  2010年07月05日 星期一 23:45 | 1432次浏览 | 0条评论

看到abigail的一个著名的one-liner之后写的。

一开始,我看见这个程序,检测素数的:

#Test primality (by abigail)
perl -le '(1x shift)=~/^1?$|^(11+?)\1+$/||print"Prime"' p

(最后的p代表一个正整数,下同)

 

感觉比较有意思,然后加工了一下。

于是写了这个,求最大公约数:
#gcd (m, n)
perl -le '@_=@ARGV;(1x$_[0]." ".1x$_[1])=~/^(1+)\1* \1+$/;print length$1;' m n

 

然后还有欧拉函数的(Euler's phi(n)):

perl -le '$n=shift;(1x$n." ".1x$_)=~/^(11+)\1* \1+$/o or$p++for 1..$n;print$p;'  n

# perl v5.8 tested
perl -le '$n=shift;(1x$n." ".1x$n)=~/(?>(11+)\1* \1+$(?{$n--}))./;print$n;'  n

# only >= v5.10
perl -le '$n=shift;(1x$n." ".1x$n)=~/(?>(11+)\1* \1+$(?{$n--}))(*FAIL)/;print$n;'  n
# use PRUNE
perl -le '$n=shift;(1x$n." ".1x$n)=~/(*:s)(11+)\1* \1+$(?{$n--})(*PRUNE:s)g/;print$n;'  n

 

求一个正整数的所有因子,从小到大排列:
perl -le '(1x shift)=~/^(1+?)\1*\z(?{print length$1})./' n

 

素因数分解,(这个太长了,应该再改短一点)

perl -le '$n=shift;$_=1x$n;while(s/^(1+)\1+$/$1/){print($n/length);$n=length}' n

(注:这些程序因为要写得很短,所以速度就不重要了,效率都不高)

评论

我的评论:

发表评论

请 登录 后发表评论。还没有在Zeuux哲思注册吗?现在 注册 !

暂时没有评论

Zeuux © 2024

京ICP备05028076号