Archive for Default

Time-Energy Uncertainty Principle

\displaystyle\Delta E\Delta t\geq \frac{h}{2}

这个式子解释起来破费周折,因为t不是一个物理量(至少在Quantum Mechanics的框架内),不能表示为一个Hermitian算符(Pauli定理),只是一个参数。以前对这个问题没有深究,最近读Nature上一篇关于量子计算物理极限的文章,才又想到这个老问题。

文章的想法很有意思。所有量子计算机,都必须用两个可以区分的态|0\rangle|1\rangle来表示二进制的0和1,而Bool运算,例如NOT,必定需要在两个态之间进行跃迁,而这个跃迁是需要时间的。事实上前面的Time-Energy Uncertainty Principle就给出了一个两个态间跃迁的最小时间,反过来这也是这一关系的一个物理解释。

原文中用了一种比较直观的说明:考虑一个两能级系统,两个能量本征态为|E_1\rangle|E_2\rangleE_1<E_2。令|0\rangle=|E_1\rangle+|E_2\rangle|1\rangle=|E_1\rangle-|E_2\rangle\Delta E=E_2-E_1,则|0\rangle随时间的演化为

|0(t)\rangle=e^{-iE_1t}|E_1\rangle+e^{-iE_2t}|E_2\rangle

其处于|1\rangle态上的概率就是

\displaystyle|\langle 1|0(t)\rangle|^2=\frac{1-\cos \Delta E t}{2}

所以一次跃迁需要的时间为\frac{\pi \hbar}{\Delta E}。这个结论还可以推广到任意两个正交的量子态(只要不是能量本征态)之间。

还可以从另外一个角度看。假设|0\rangle|1\rangle就是|E_1\rangle|E_2\rangle。为了实现跃迁,必须有一个非对角的外场H_{12}项。

阅读(312 次)

Comments

Using LAPACK in C

简单的说就是如何在C程序中调用Fortran子程序。我不想再学一门语言,所以直接调用库函数是最好的办法。google了一下,在VS2005里调试成功。简单来说你只需要:

  • 编译好的LAPACK库
  • 相应的头文件
  • 知道Fortran数组内存布局的特点
  • 知道如何在C程序中调用DLL
  • 就没问题。dll和头文件可以在这里下载。建议动手前查看一下头文件中的f2c.h,里面定义了一些常用的数据类型,混个眼熟。

    怎么在C程序中链接外部DLL库,这个和编译器有关,就不在这儿罗嗦了。

    主要的问题是怎样在C的数据类型和Fortran中的类型间进行转换。基本的类型,比如REAL, DOUBLEREAL之类的定义,都在f2c.h里写好了。最要紧的一点:Fortran中二维数组是按列存储的,而C是按行存储。当然,我个人的意见是干脆不要用C提供的多维数组,直接用一维数组,元素按Fortran惯例存放就行了,顺便定义一套宏什么的,用起来省事,看起来顺眼。此外,Fortran中函数传参是call by reference,和C的call by value截然相反,所以所有参数都必须是指针。记住这两条就差不多了。

    我要用LAPACK对角化Hamiltonian,感觉应该用zheev, compute all eigenvalues and, optionally, eigenvectors of a complex Hermitian matrix

    附精美范例一则,在VS 2005下编译通过:

    #include <stdio.h>
    #include "f2c.h"
    #include "zgeev.h"
    
    #define SIZE 3
    
    int main(int argc, char *argv[]) {
      doublecomplex A[SIZE][SIZE], b[SIZE];
      doublecomplex DUMMY[1][1],WORK[2*SIZE];
      doublecomplex AT[SIZE*SIZE];
      int i, j, ok, c1, c2, c3;
      char c4;
    
      /* initializing A */
    
      for (i = 0; i < SIZE; i++) {
        for (j = 0; j < SIZE; j++) {
          AT[j + SIZE*i].r = A[j][i].r;
          AT[j + SIZE*i].i = A[j][i].i;
        }
      }
    
      c1 = SIZE;
      c2 = 2*SIZE;
      c3 = 1;
      c4 = ‘N’;
    
      zgeev_(&c4, &c4, &c1, AT, &c1, b,
            DUMMY, &c3, DUMMY, &c3, WORK, &c2, WORK, &ok);
    
      if (ok == 0)
        for (i = 0; i < SIZE; i++)
          printf("%f + %fi\n", b[i].r, b[i].i);
      else
        printf("An error occured");
    
      return 0;
    }
    

    并非原创,来自Using LAPACK Routines in C Programs,略微做了些调整。

    阅读(351 次)

    Comments

    暴力求解24点

    是真正的暴力求解……穷举法。不过这个问题似乎也没有更好的方法了,各种算法除了暴力的程度,似乎也没有其他本质的区别。

    好久没写程序,今天写得这个75%是从网上参考过来的。那个产生所有可能的后缀表达式的算法很漂亮,产生所有排列的函数也很简洁。唯一的缺点是,这个方法会搜索大量重复的表达式,总的搜索空间是全排列数乘上Catalan数,比指数增长还要彪悍。但是对一般4个数的24点,这个低效率还体现不出来。此外,输出的表达式是后缀的,看起来不怎么顺眼。但是后缀转中缀又很麻烦,我就懒得再折腾了。

    import sys
    
    def add(a,b):
      return a + b
    def sub(a,b):
      return a - b
    def mul(a,b):
      return a*b
    def div(a,b):
      return float(a)/b
    
    ops = {add:’+‘, sub:’-‘, mul:’*‘, div:’/‘}
    
    def permute(seq):
      seqn = [[seq.pop()]]
      while seq:
        newseq = []
        new = seq.pop()
        for i in range(len(seqn)):
          item = seqn[i]
          for j in range(len(item) + 1):
            newseq.append(item[:j] + [new] + item[j:])
        seqn = newseq
      return seqn
    
    def _exprs(expr, stk_depth, vals, ops):
      if not vals and stk_depth == 1:
        yield expr
      if stk_depth > 1:
        for op in ops:
          for e in _exprs(expr + [op], stk_depth - 1, vals, ops):
            yield e
      if vals:
        for e in _exprs(expr + [vals[0]], stk_depth + 1, vals[1:], ops):
          yield e
    
    def exprs(vals, ops):
      return _exprs([], 0, vals, ops)
    
    def eval(expr):
      stack = []
      for e in expr:
        if callable(e):
          b = stack.pop()
          a = stack.pop()
          try:
            stack.append(e(a, b))
          except ArithmeticError:
            return None
        else:
          stack.append(e)
      return stack[0]
    
    def tostr(expr):
      ret = []
      for e in expr:
        if callable(e):
          ret.append(ops[e])
        else:
          ret.append(str(e))
        ret.append(’ ‘)
      return ”.join(ret)
    
    if __name__ == "__main__":
      vals = [int(x) for x in sys.argv[1]]
      goal = int(sys.argv[2])
      for p in permute(vals):
        for e in exprs(p, ops.keys()):
          if eval(e) == goal:
            print tostr(e)
    

    阅读(359 次)

    Comments

    新年好

    居然年三十了,同志们新年快乐。
    转载ws短信一条:工资翻个十倍,爱情出点小轨(这个免了),理想早日放飞,卧佛快点到来,百合多多灌水,BN再战三百回。
    我来继续ws:多收offer(此条送本宿舍申请团),多看动画(此条送所有宅男),多泡mm(此条特送Bcui和Bhui),多写禁书(此条送Bluo),等等等等。

    阅读(504 次)

    Comments (2)

    Mathematics in Physics

    我向来认为学数学的都是一等一的聪明人;学物理的就要稍微差一些。但是物理学家有个硕大的优势,就是他的研究对象有时远比研究者聪明。大自然往往出人意料,所以物理学影响数学的名例数不胜数,反过来的就逊色很多。以前高中时看杨振宁的演讲,谈到规范场和纤维丛的对应关系,真是漂亮的结果。二十世纪的数学肯定是几何和数学的天下,荣耀几乎都归于几何学家和拓扑学家。这个风气估计也影响到了物理学界,大家都喜欢把自己的结果拔高到topological的高度,这样才能吸引到足够的眼球和引用率。

    作为一个物理系学生,我自己对数学和物理之间关系的认识这几年也有很大变化,很大程度上受到了南大物理系氛围的影响,毕竟南大物理主攻凝聚态,和玄之又玄的超弦比起来,能量在几个eV的电子无疑是再实在不过的东西。以前刚进物理系的时候,满怀着对理论物理的热情,对场论和数学物理无比向往。数学与物理学结合最密切的分支,无疑是场论(包括弦论在内)。弦论对数学的要求更是到了令人发指的程度,我想我一辈子都不会搞明白代数几何到底在说些什么。当然,弄那么多复杂的数学结构,到底是好是坏,不是我一个外行人能判断的。不过从目前看来,弦论对数学的影响似乎还要在物理学之上,想想教皇E. Witten是Fields奖得主就明白了。

    还是回头谈谈我熟悉的凝聚态物理。其实在低能范围也能出现很多足够吓死人的数学结构,最具威慑力的估计还是geometric phase,都用不着量子场论,在所谓elementary的量子力学里都能出现non-Abelian gauge field和monopole,理所当然的有connection, curvature, fibre buddle。当然,我觉得玩那么玄的必要性是值得推敲的,它有如此清晰的物理意义,这些微分几何的数学解释更像是锦上添花。我比较感兴趣的Quantum Hall Effect,整数情形Hall电导可以用第一陈类表示。第一陈类是个什么东西?说实在我不懂,我更愿意把它看作Berry’s Phase,这已经足够了。第一陈类或许可以解释Hall电导的量子化和平台,除此之外似乎并不能给我们更多东西。FQHE的的水更深,场论的描述就是Chern-Simons Theory,很遗憾,是所谓的Topological Field Theory,下面可以做深的一脚下去就出不来的文章。

    经常能看到很多讨论学物理的需要掌握多少数学之类的文章。目前看来,除非要去挤场论这块高地,需要学很深的拓扑和几何,微积分,复分析和线性代数,加上一点点群论已经足够对付了。过于抽象和形式化,未必是好事。不过学点几何和拓扑也很有好处,有时候还是用得着的,所以我很想谁来教教我微分几何。

    话说前几天看到一篇剖析装逼艺术的网文,提到一个小tip:就是提到外国人名时能用原文就用原文。我自信提到欧美人时大部分能写原文,日文就比较麻烦,但是可以用罗马音混一下。我觉得更装的技术是提到美籍华人都是用让人看了牙疼的英文拼写,比如T. D. Lee, C. N. Yang, X. G. Wen,等等。

    阅读(334 次)

    Comments

    杂博

    今天早上起来,习惯性的开邮箱……看到一封Admission 2008……激动莫名。Boston College虽然物理排名不怎么样,但好歹是个offer,终于摆脱了三无状态。

    随后又有一条坏消息。UMich发面试通知;2月29日在上海。但是我没收到,难道这个学校就这样黄了?

    在家里实在无聊,银魂补完计划进度喜人,已经扫荡了50集。开始几天几乎是除了吃饭睡觉都在看,现在每天睡觉前看三集。所谓物极必反,我终于想起来还带了一堆paper回来看。但是做了一阵,数值模拟的结果总是不对,也很让人郁闷。

    阅读(442 次)

    Comments

    龙书第二版下载

    compiler-aho.pdf
    今天终于把龙书第二版的电子书传上去了。不知道链接什么时候会失效。
    失误,一开始写成第三版了

    阅读(722 次)

    Comments (3)

    推荐一篇博文

    因为我老是在blog写一些半桶水的技术文,大家的感觉可能是这个家伙无趣得很。今天决定推荐一篇博文,顺便给maoz同学拉拉票(虽然我这儿的访问量实在趋近于零)。maoz同学参加了Feedsky主办的博客大赛,有点像环法,每天都要写一篇命题作文(或者应该叫话题作文),坚持不懈一个月,你就完成比赛了。至于能不能拿到那台作为奖品的手提,鉴于有像和菜头那样的巨无霸参赛,我对maoz同学不表乐观。说实话看到这篇文章还是通过和菜头的blog。写了半天,不见庐山真面目,赶紧给一个链接:

    关于父亲

    下面是投票链接:投票点此

    插播广告完毕。

    对于这篇文章,我不知道该做些什么评论。也许就用鲁迅的话,直面惨淡的人生。maoz同学,据我所知(如果我没弄错的话),是属于产量极少的高智商人类,而且,强调一下,是个非常有趣好玩的人。说到这儿插几句,其实以前就看过maoz的blog,但没想到这个挺有意思的blog的主人居然是我的旧识,虽然也有许多年未见了(这句话可能不准确),我对maoz同学的印象也基本停留在N年以前,但想来现在应该也差不太远(希望如此)。但这篇文章,确实不像出自一个比我还小一岁的女孩子之手。

    最近似乎几个国产Web 2.0网站都挺热闹,feedsky在办博客大赛,豆瓣的注册用户忽然就到了1000000个。中国的网络,真的是在夹缝里生存,从一开始就营养不良,到现在都不知营养良为何物了,但看到这些成绩,还是值得高兴一下。

    阅读(791 次)

    Comments (1)

    龙书第二版

    说到龙书(Dragon Book),喜欢玩编译器和程序语言的老大们肯定是人手一册,在编译器技术这一块的教科书中地位几乎有如圣经。说到这儿又要鄙视一下国产的什么编译原理教材,简直是不知所云,抄都抄得这么潦草。

    计算机领域的经典著作,常常会有些“小名”或俗名,如无人不知的TAOCP,C语言圣经K&R,算法入门宝典CLR。TAOCP是书名的缩写,此书堪称最有名的算法书籍,我估计也是被完整阅读次数最少的计算机书籍,之一都省掉了。K&R和CLR都是作者名字的开头第一个字母。龙书算是比较有个性的,这个外号来自其封面。1977年,Alfred V. Aho和Jeffrey D. Ullman写了一本Principles of Compiler Design,封面是一位骑士枪挑一头绿色恐龙,因此得名龙书。到了1986年,此书升级换代,书名变成了Compilers: Principles, Techniques and Tools,沿用至今,作者增加了Ravi Sethi。封面依然是一位骑士和一头恐龙,只不过恐龙变成了红色,骑士则坐在了电脑前。仔细看的话,发现龙身上纹身“Complexity of Compiler Design”,骑士全副武装,盔甲上书“Data Flow Analysis”,夹着一把写着”LALR Parser Generator”的宝剑,盾牌上则写着”Syntax Directed Translation”。

    一晃过了20年,龙书终于出了新版。封面当然是骑士斗恶龙。作者又加了一位,篇幅猛增了200多页,变化十分巨大。除了一些古典内容如词法分析,语法分析,语法制导翻译,中间代码生成没怎么动,后面的运行环境,代码优化部分可谓焕然一新。从Run-time Environment这一部分就可以看出程序语言这些年来的变化:Java,.NET,Python,Ruby…自动内存管理已经不是什么新鲜事,所以龙书里开了近半章的篇幅给垃圾收集。内存管理是个大题目,完全铺开来一本书都不够,从目录上看,龙书已经包括了现在主流的一些技术,估计作者安排这一块内容时也死了不少脑细胞。变化最大的当属代码优化,原来只有一章,现在一下子撑成了四章,洋洋洒洒近400页,可以单独成一本书了,较之第一版,作者似乎不满足于做一本入门教材,要一揽子把从入门到高级全包了。

    其他内容上的变化,暂时只能从目录上看一下。Flow Analysis增加了一些较新的算法,比如Region-Based Analysis。优化部分花了不少力气讲Parallel Machine,现在看来也是大势所趋。

    书肯定是不可能仔细看了;也不知道什么时候会有中文版;这么一本1000页的大砖头翻成中文后也不知道厚成什么样。我个人的一点观察,最近几年动态语言与函数式语言开始逐渐成为主流,用马克思的话,一个函数式编程的幽灵开始在C++/C#/Java中徘徊。现在的编译技术,似乎应该包括Dynamic Typing, JIT等等,特别是种种针对动态语言的优化(比如方法缓存)。作为一本教材,不可能面面俱到,更不能跟风,编者总有自己的原则和取舍,大概龙书的四位作者认为这些东西还不值得进入大学的编译技术课程。但我觉得现在正是一个计算环境变革的前夜;或者说变革已经在进行时了。这样的话,也许下一个版本,不用再让我们等20年。

    说到这儿,又要损一下中国这帮写教科书的人。为了避免打击面过广,不失一般性,限定于计算机行业。老外写书,一版二版三版,真是与时俱进。当年Dirichlet写了一本数论讲义,每次重版他的学生Dedekind都会在后面添个附录反映一下最新的研究进展,到最后附录比正文还厚得多。在我国,就少见这种延续性。人家真是把教材当作一项事业来做的。中国最有名的计算机书估计是谭老师的C语言,去年貌似也出了个新版,除了换个封面,里面新瓶装旧酒,继续误人子弟。对谭老师C语言书的声讨网上已经进行多年,我也没有重复的必要。只是想到这些状况,不能不有点觉得外国月亮有点圆。

    本来想把电子版放上来,但尺寸实在吓人(近50M),我估计赛族上对这个感兴趣的人也不会太多,如果想要电子版的话,私人联系吧。当然直接google也可以。

    下面是三版龙书封面展览:
    db_2.jpgdb_3.jpg

    db_1.jpg

    阅读(1172 次)

    Comments (9)

    GTM eBook Download

    发现一个非常好的电子书下载点,专门收集GTM系列的书。这些书我一本都没看过,但在书店里经常瞻仰。我不知道这样做是不是有版权问题,但是站长的努力还是值得一赞的。自己也下了一堆,我怀疑我到底会不会去看这些数学书,硬盘上已经堆积了无数的电子书了。

    地址在这里

    阅读(764 次)

    Comments (9)

    « Previous entries