Mathematica 新版10.3.0试水

Mathematica_Banner
Standard

博客好久没写东西了也该来拔拔草了。今天想在机房新机器上装个Mathematica,于是看到了最新版已经到10.3.0了(我之前用的只是10.0.1而已),就心血来潮下了一个玩玩。打开界面时并没有感觉到什么神奇之处,然而在输入的瞬间被吓尿了,它大概是长这个样子的:

KeywordChineseHint

新版(10.2.0 起)增加了语法关键词的中文解释

妈妈再也不用担心我看不懂英文了!看完中文名称,基本上对这个函数就有个大概的了解了。

然而更加精彩的还在后面,当我输完一行代码的时候,它就变成了这样:

ExprChineseHint

关键词自动注解

咦?关键词下面竟然还有代码说明,好神奇啊!这样子一来,根本不需要向别人解释这段代码什么意思了,能看得懂中文的应该都能懂了。简直是文科妹子要学编程的福音啊 (✿◕‿◕✿)

然而转念一想,这件事好像并不那么的单纯。在编程界,有一条广为人知的“定律”:1. 每个写代码的都希望别人的代码有注释,2. 然而他自己写代码的时候又不想写注释。此定律在江湖传播甚九,数十年未有人破。而今日Mma发现此中玄机,搞出这样一个自动代码注解,若放任其行,编程界势必大乱啊!

调侃完了,说些正经事。这东西有多大帮助我并不好说,但可以确定的是,对初学者的帮助是巨大的。Mma的文档系统本身就设计的比较亲民,学习曲线比较平缓,但依旧有好多人不知道要点F1(啧啧)。这次直接将解释放到了UI界面上,可见其对待新用户的认真程度了。

(不过这个东西可以干嘛用呢,或许可以用来写诗?开个脑洞下次来玩玩。)

回到原先的主题,下面便来简单介绍一下这次更新的内容以及个人的comment。


如果你是南大、东大学生,可以在紫荆的这个页面下载。边下边看,效率更高哦!

Continue reading

MATHEMATICA例程2——小数循环节

Standard

 

Hello大家好,这里是Mathematica例程大讲堂。

之前发现从关键词 Mathematica 过来的搜索流量偏高,于是便跑过来填这个许久之前挖的坑。上一篇文章是讲关于如何用 Mathematica 生成 Look And Say 序列,反复看了之后觉得难度太高,不适合初学,于是这次便来讲一点简单的、比较基本的例子。


一、主要目标

这次要计算的是 1/n 的小数部分的最小循环节长度,其中 n 最好是质数,例如:

1 / 3  = 0.333...
1 / 7  = 0.142857142857...
1 / 19 = 0.0526315789473684210526...

1/7 的循环节是"142857",有6位,而 1/19 的循环节是"052631578947368421",有18位,以此类推。

如果你觉得从中找到了规律,不妨来猜一下 1/81,1/9801 的循环节长度是多少位呢?^_^


Continue reading

【欧拉计划】一个组合问题

Balls_Banner
Standard

前几天又开始刷欧拉计划,遇到一道很有意思的题,把它化简之后,核心在于解这样一个组合问题:

一个袋子里有4个红球、2个蓝球,按顺序从中取出不多于2个球,问有多少种结果?(计取出顺序,且认为同色球都相同)

全部列出来就知道共有6种组合,分别是r, b, rr, rb, br, bb。

推广到一般情形,即:

有 $m$ 种不同的元素,分别有 $n_1, n_2, \ldots , n_m$ 个,其中 $n=n_1+n_2+\ldots+n_m$ 。现在要从中取出不多于 $L$ 个,问有多少种可能的取法?

对于 $m=2, n_1=4, n_2=2, L=2$ 的情形,结果是6。

那对于一般的情形,又该如何计算这个值呢?

下面我将给出两种解答这个问题的思路:第一种是我当时解答这个问题的思路,第二种则是在论坛里看到的高人的解答。

Continue reading

【欧拉计划 #49】记一次神奇的解题经过

Standard

了解我的人应该都知道欧拉计划吧,就不多介绍了,这次是第49题,如下:

The arithmetic sequence, 1487, 4817, 8147, in which each of the terms increases by 3330, is unusual in two ways: each of the three terms are prime, and, (ii) each of the 4-digit numbers are permutations of one another.

There are no arithmetic sequences made up of three 1-, 2-, or 3-digit primes, exhibiting this property, but there is one other 4-digit increasing sequence.

What 12-digit number do you form by concatenating the three terms in this sequence?

 

翻译概括如下:

寻找一个3位的序列,满足:

  1. 每个数都是4位数的质数
  2. 构成等差数列
  3. 每个数的4个数字是另两个数的置换(例如1487, 4817, 8147)

已知这样的序列一共只有两组,一组是(1487,4817,8147),问另一组是什么?

 

这道题我想了半天,没有在数学上把它化简出来,就准备用枚举法做了。

因为要求的是一个3个数的有序序列,其总的可能数不超过9000^3/3!≈1.215e+11,直接枚举每个数会死人的。

由条件2,它是等差序列,这样知道两个数就能算第三个数,枚举的压力小了一点,上限是9000^2/2!/2≈2.0e+7,大概是两千万这个量级,依旧无法接受。

再由条件1,或许可以先生成1000~9999间的质数列表,再从中进行枚举,经计算这一区间内共有1061个质数,于是枚举量上限为1061^2/2!≈562860,五十万次。。唔。。还行吧。

但还有最后一个条件,每个数的数字构成必须相同,这个条件的验证还是有点麻烦的,目前还没想到特别高效的验证方法。但是其生成确是比较高效的。

 

想着想着,我就在想能否归纳出这类带约束的枚举类问题的通性,最终我画出了如下的表:

类型 验证 生成
质数 简单 简单
等差数列 相当容易 困难,情况数十分多
数位同构 比较麻烦,不够效率 中等,共C104 = 210组,每组至多24个元素

 

枚举固然有很多种方式,但说到底还是在于你对每一个维度选择了生成策略还是验证策略,而且其可能难度很不相同,这颇有点NP问题的感觉。

Continue reading

Mathematica语法拾遗

Standard

这里是用来总结Mathematica中的一些语法、句式、函数等,不一定很有条理,只是作为记录而已。

以及,本页的代码是有语法高亮的,如果看不到,可能是js没有加载完全,稍等片刻即可。 ╯_╰

 

2014-07-07 Update 4 新增Inner/Outer及范例,新增一些关于列表操作的 One-liners 实例。
2014-06-23 Update 3 新增Sow/Reap以及Gather等价类操作,更新分配部分。
2014-06-22 Update 2 新增规则匹配部分。
2014-06-21 Update 1 新增列表操纵、分配操作、简写符号、四种表达式形式,以及新增In/Out显示。
2014-06-17 初稿 新增基本函数调用、简单函数式用法。

Continue reading

Euler Project(欧拉计划)刷题记(Problem 1~50)

Standard

EulerProject官网地址)是一系列问题的集合,涉及数学与计算机方面。有的问题看起来是一个计算机问题,但却可以用数学推导去化简,有的问题化简到最后,也需要用编程技巧写代码来求解它。

EulerProject不限制你所用的语言,你可以使用Mathematica这样的数学工具,也可以使用PythonC++,甚至可能连编程语言都不需要,如果是自己推导算出答案的话。在解决完一道题后,会开放该题的讨论区,在那里你就能看到其他人是怎么解决这道题的。

EulerProject强调的是解决问题的想法,而不是你用什么编程语言。并且上面的题都是围绕一个很有趣的“一分钟法则”来设计的。这个法则是说,有可能你写了一个算法花了很长时间才算出结果,但总存在一个高效的算法能够在一分钟内得出结果,即使在一台性能比较差的计算机上。

然后,我就是开始了在EP上艰难的旅程,我用的是Mathematica语言。

 

如果说把每一道题的解答过程都写出来的话,就会显得很麻烦,而且已经有人做过这种事了。如果不写的话,又没什么好说的,真是太纠结了。干脆就这么水掉吧。

转念一想,很多人可能是第一次听到EulerProject,为了让更多人了解它,我觉得还是有必要举点例子,把一些有代表性的题拿出来说一下的。

 

EP Problem 1

If we list all the natural numbers below 10 that are multiples of 3 or 5, we get 3, 5, 6 and 9. The sum of these multiples is 23.

Find the sum of all the multiples of 3 or 5 below 1000.

 

题目意思是这样的:如果把10以下的3或5的因子列出来的话,有3,5,6,9,它们的和是23. 现在问1000以下3或5的因子之和是多少。

这道题作为整个EulerProject的第一题,一定程度上能传达出整个系列题目的风格,也侧面反映出能刷它的要求。就这道题而言,一般有两种做法,一种做法是写个算法枚举,另一种是通过数学推导直接求和。两种思路都能解决问题,并且实现起来也不难,就看你喜欢哪一种了。

如果是前者,只要有一点基本的代码功底,写一个这样的程序算一下应该没什么问题,实际上,对编码能力的要求并不是很高。因为它不是POJ,它不考验你算法理论、数据结构学的怎么样,只要求你能够用代码的工具去把问题实现即可。(像Python这种轻巧的脚本式语言就是不错的选择)

如果是后者,只要你能反应过来是“3的倍数+5的倍数-15的倍数”就足够了,容斥原理而已。拥有较强数学思维能力的同学可能会觉得后者更加适合。毕竟闭上眼睛想象,画画草稿纸就能蹦出一个答案,还是很了不起的。

 

EP Problem 7

By listing the first six prime numbers: 2, 3, 5, 7, 11, and 13, we can see that the 6th prime is 13.

What is the 10 001st prime number?

 

好逗的题目啊,问你第10001个质数是什么?

100内的质数还能背一下,可第10001个质数恐怕没人能直接报出来吧。

我用Mathematica我自豪,下面的代码可以直接得到答案:

Prime[10001]

用Python的话就要长一点了。

 

好像上面的题都有点水了,就没有有点挑战性的题目么?别急,前面题号才是个位数呢。

Continue reading

Mathematica中的四种括号

Standard

Mathematica中,一共有四种括号,它们有着不同的含义,熟悉它们的用法是看懂Mathematica代码的基础。

类型 示例 说明
圆括号 (term) 表示组合顺序的圆括号
方括号 f[x] 表示函数调用的方括号
花括号 {a,b,c} 表示列表数组的花括号
双括号 v[[i]] 表示下标索引的双括号 (Part[v, i]

 

一、基本用法

(圆括号)

a. 圆括号比较简单,它表示着运算的优先顺序,和数学中的圆括号意义相同:

Mathematica_TB_11a

Continue reading

Mathematica例程1——LookAndSay序列

details-of-lookandsay
Standard

Hello大家好,这里是Mathematica例程大讲堂。

有什么好的入门Mathematica的方法呢?一种办法是看帮助文档,很详细;另外,绝大部分文档下面都会有一个“巧妙范例”,解释一些函数的巧妙用法,我觉得这对学习Mathematica会有很大帮助。

但是Mathematica语法博大精深,有些看起来很废的函数在某些地方便会发挥很神奇的作用,也可以用来辅助理解Mathematica语言设计中的一些架构。

Continue reading

Mathematica连接远程内核那些事

Standard

最近要做一个并行的东东,用的是Mathematica语言,它里面是内置的远程内核的连接功能的。由于自己的电脑跑分实在太渣,所以想着要是能连上机群的服务器那也是不错的呢!然后坑爹的事就从这里开始了。

然后就去找Mathematica的各种资料啊,还好,找到一篇英文的官方文档。里面看起来很详细的说了几种连接的办法。比如,Lightweight Grid Server啦,机群整合啊,还有一个远程登录的连接。前两个都很复杂的样子,就准备试试最后一个。

照教程输入ip地址,看起来很简单的样子。然后运行,等了好久好久。。然后它告诉我没连上。再试,还是连不上。

Continue reading