21 Feb

[问题解答]有多少位数字?

解决完上一题《有多少个5?》后,子瑞表示看到一道类似的题目,当然,这道题比上一道难一些:

一个数,各个数字加起来等于900,乘以2后各个数字加起来还是等于900,已知这个数字只有3、4、5、6组成,请问满足条件的最大数与最小数的积有多少位数?

要解答这个问题,我们只需要知道最大数和最小数分别有多少位即可。因为最大数必然是6...3的形式,而最小数只能是3...6的形式,它们的位数之和就是所求的位数。

怎样比较两个数的大小呢?显然,在不同位数的数时,位数多的数要大,同样位数才从高到低逐位比较。因此,我们应当考虑位数的最大与最小。

点击阅读全文...

5 Jul

齐次对称多项式初等表示的新尝试

这是我的这学期高等代数课的一个小论文。说到这里,其实我挺喜欢那些不用考试,通过平时考核以及写论文、报告或者做实验的方式来评成绩的方式,毕竟我觉得这才是比较综合地体现了知识和技能的水平(当然更重要的一个原因是我比较喜欢写作啦~~)。我们高等代数有两门课程,一是基本的上课,二是研讨课,分别考核。老师照顾我们,研讨课不用考试,写小论文就行了。Yeah~~

我写的是有关对称多项式的。其实这文章在半个学期之前就酝酿着了,当时刚学到对称多项式的初等表示。所谓初等表示,就是将一个多元对称多项式表示为$\sigma_1,\sigma_2,\sigma_3,...$的组合。其中
$$\begin{aligned}\sigma_1=x_1+x_2+...+x_n \\ \sigma_2=x_1 x_2+x_1 x_3+...+x_1 x_n+x_2 x_3+...+x_{n-1} x_n \\ ... \\ \sigma_n=x_1 x_2 ... x_n\end{aligned}$$
书本上给出了待定系数法,但是每次都要求解方程组,让我甚是烦恼,所以我研究直接展开的方案,最终得出了两种方法。当时也刚好接触着张量的知识,了解到“爱因斯坦求和约定”,于是想充分发挥其威力,就促成了这篇文章。其实我自定义了“方括弧”和“圆括弧”两种运算,都是符号上的简化。两种方法在某种意义上相互补充,笔者自感颇为满意,遂与大家分享。具体内容就不贴出来了,请大家下载pdf文件观看吧。

点击阅读全文...

6 Jul

齐次多项式不等式的机器证明(差分代换)

在高中阶段,笔者也像很多学生一样参加过数学竞赛,而在准备数学竞赛的过程中,也做过一些竞赛题,其中当然少不了不等式题目。当时,面对各种各样的不等式证明题,我总是非常茫然,因为看到答案之后,总感觉证明的构造非常神奇,但是每当我自己独立去做时,却总想不出来。于是后来就萌生了“有没有办法可以通用地证明这些不等式?”的想法。为了实现这个目的,当时就想出了本文的技巧——通过牺牲计算的简便性来换取证明的有效性。后来,我虽然没有走上数学竞赛这条路,但这个方法还是保留了下来,近日,在和数学研发论坛的朋友们讨论不等式问题时,重新拾起了这个技巧。

此前,在本博客的文章《对称多项式不等式的“物理证明”》中,已经谈到了这个技巧,只是限制于当时的知识储备,了解并不深入。而在本文中,则进行拓展了。这个技巧在当时是我自己在证明中独立发现的,而现在在网上查找时发现,前辈们(杨路、姚勇、杨学枝等)早已研究过这个技巧,称之为“差分代换”,并且已经探究过它在机器证明中的作用。该技巧可以很一般化地用于齐次/非其次不等式的证明,限于篇幅,本文只谈齐次多项式不等式,特别地,是对称齐次多项式不等式,并且发现某些可以简化之处。

点击阅读全文...

7 Oct

班门弄斧:Python的代码能有多简洁?

此文很水,高手略过...

Python以它的开发效率而闻名,优秀的开发效率自然意味着它能够用更少的代码实现更多的功能。那么,对于同一个问题,Python的代码能有多简洁?而我们怎么平衡开发效率和运行效率?笔者学了几个月Python,略懂一点,在此班门弄斧一翻。

在此,我们来编程计算
$$\sum_{n=0}^{10} n^2$$
这当然是一道非常简单的习题。按照一般思路,写出来的最自然的代码就是:

s=0
for i in range(11):
    s = s + i**2

print(s)

点击阅读全文...

4 Dec

结果恒为整数的多项式

昨晚上初等数论的时候,有这么一道题

求证
$$\frac{1}{3}x^3+\frac{1}{5}x^5+\frac{7}{15}x$$
恒为整数,其中$x$是一个整数。

更一般地,可以得到
$$\sum_{p\in\mathbb{P}}\frac{1}{p}x^p + \left(1-\sum_{p\in\mathbb{P}}\frac{1}{p}\right)x$$
恒为整数,其中$\mathbb{P}$是有限个素数的集合,还有更多整数值函数问题。要证明这些函数的值恒为整数,可以通过同余分析,证明分子总能被分母整除。但是,更妙的、同时往往会更简单的方法是,将结果赋予必然为整数的意义——可以是计算上的,也可以是操作上的。

点击阅读全文...

22 Dec

将多项式分解为两个不可约多项式之和

在高等代数的多项式一章中,通常会有这样的一道练习题:

证明任意有理数域上的多项式都能够表示为两个有理数域上的不可约多项式之和。

这是道简单的练习题,证明方法有多种。首先来介绍一个巧妙的证法。

一个巧妙证明

有理数域上的多项式问题等价于整数域上的多项式问题,因此,只需要对整数域上的多项式进行证明(这步转换使得我们可以使用艾森斯坦判别法)。设$f(x)$是整数域上的一个$n$次多项式:
$$f(x)=a_n x^n+a_{n-1} x^{n-1}+\dots+a_1 x+a_0$$
我们只需要注意到
$$p f(x)=\left[p f(x)+x^n+p\right]-(x^{n}+p)$$

点击阅读全文...

19 Dec

【备忘】Python中断多重循环的几种思路

跳出单循环

不管是什么编程语言,都有可能会有跳出循环的需求,比如枚举时,找到一个满足条件的数就终止。跳出单循环是很简单的,比如

for i in range(10):
    if i > 5:
        print i
        break

然而,我们有时候会需要跳出多重循环,而break只能够跳出一层循环,比如

for i in range(10):
    for j in range(10):
        if i+j > 5:
            print i,j
            break

这样的代码并非说找到一组i+j > 5就停止,而是连续找到10组,因为break只跳出了for j in range(10)这一重循环。那么,怎么才能跳出多重呢?在此记录备忘一下。

点击阅读全文...

19 Feb

Python的多进程编程技巧

过程

在Python中,如果要多进程运算,一般是通过multiprocessing来实现的,常用的是multiprocessing中的进程池,比如:

from multiprocessing import Pool
import time

def f(x):
    time.sleep(1)
    print x+1
    return x+1

a = range(10)
pool = Pool(4)
b = pool.map(f, a)
pool.close()
pool.join()

print b

这样写简明清晰,确实方便,有趣的是,只需要将multiprocessing换成multiprocessing.dummy,就可以将程序从多进程改为多线程了。

点击阅读全文...