CSK.Blog--个人原创Weblog

终于,D828被拆了

我自从小时候开始变有个习惯:拆东西。

当时基本到手的玩具在2天内基本就会被我拆解,可惜当时科学技术和经验点不够,拆解的东西无法重新组装。但通过拆东西的确让我增加了不少经验。那些电动玩具的内部构造小时候就一清二楚,虽然到了大学才学了数电模电,但是小学4年级我就会用LM386作音频放大电路。所以说拆东西这个习惯还是有好处的...

不过作为牺牲,很多东西被我拆了就无法再修复了,有时往往失大于得,其中的例子是我读一年级时把妈妈的一块瑞士手表拆开了,据说当时一些修表的都没法打开(可能是家长的夸张之辞),后来导致那块手表至今走时不准。

高中时候是一次是把联想的PDA拆了,而且把LCD也拆了,当时因为PDA不小心被我摔倒地上,是LCD驱动升压电路的电感磁心断裂而以,不过我当时没想到这个问题,直接去拆LCD。将内部的背光光栅也弄了出来。不过自然没法修复,无奈送修。后来奇迹的是LCD被我那样破坏在组装后仍旧工作正常,不过不是在无尘环境中,导致面板上有小的杂质..

最近的一次大家应该都知道,就是把我笔记本给拆了,导致排线断裂:http://www.csksoft.net/blog/post/171.html

虽然当时因为拆笔记本造成了不小损失,幸亏还是能享受保修。但等维修回来第二周开始至今我又拆了近5回。至今拆笔记本已经是家常便饭。

当谈还是有些东西我没法去拆,比如CRT显示器或者电视机,大家电(我没那么无聊)。不过也有我有能力但还没去拆的,如PSP和手机。就像某人曾对我说的“你迟早会去拆的”,这次就轮到了我的手机:

 

前盖背面

 

主键盘后的PCB,CPU、Nand和射频模块在此

 

全家福

 

事情经过是我无意打翻了玻璃杯,水全部浇在手机上,导致当场死机..等把水甩干已经无法开始了。这无疑是个拆机器的良好借口,而且本来有些按键已经将近失灵,所以打算修复。

因为这次网上已有现成的拆机照片公布,所以拆起来比较顺利,不过还是差点弄断排线。拆LCD时候又犯了同样错误,把灰尘带了进去。而且等装起来发现方向键失灵,又拆了一次。后来怀疑是耍机造成的,目前看来还能维持这样的假说,否则这又是本次拆机的代价?

电子产品对我而言,一旦拆了,就没有神秘感了,而且下次拆起来就更肆无忌惮。不过还是别拆了。PSP尽量不去拆...

 

 

gift:多彩Console输出函数

什么是多彩Console输出?就是上篇文章中benchmark的效果图

其实windows有专门的console API实现这样效果,.Net里面也有封装,但是VC要实现还真是麻烦。所以在写CiperLib时候我顺便写了个帮助库,提供下面几个函数,使用很方便。

BOOL clr_foregnd(WORD clr);//设置文字颜色
BOOL clr_bkgnd(WORD clr);//设置背景色

BOOL clr_underline(BOOL bUnderLine=TRUE);//文字有下划线
BOOL clr_highlight(BOOL bHighlight=TRUE, BOOL foregnd = TRUE);//是否高亮度显示
BOOL clr_reverse();//背景和前景交换色彩
VOID clr_restore();//恢复默认的显示格式
VOID con_cls();//清屏幕

 

要注意适用时需要using namespace consolehelper;

使用方法是,调用了格式设定函数后,在之后的输出都会采用设定的色彩或者格式。

比如

clr_foregnd(CON_CLR.RED);

printf("Red Text");

 

对于颜色,提供了结构:

struct CON_CLR
{
    static const WORD RED  =  FOREGROUND_RED;
    static const WORD GREEN = FOREGROUND_GREEN;
    static const WORD BLUE = FOREGROUND_BLUE;

};

 

还可以这样使用:clr_foregnd(CON_CLR.RED | CON_CLR.GREEN);那么就是显示黄颜色了。

 

clr_highlight严格的说是区分正常色彩和低亮度色彩。

如果将3中元色和亮度组合,那么可以显示16种色彩。

 

con_cls();等同于system("cls");但是速度快

 

如果下载过ciplib的代吗,那么本函数库以及包括了,否则可以单独下载:

 

教育网:

ftp://great_csk:public@public.sjtu.edu.cn/public-files/console_hlper.rar

http://www.csksoft.net/data/legacyftp/Products/code_and_lib/console_hlper.rar

我写的大整数以及素域运算库

这个库叫做CiperLib,是我暑假在密码学实验室作的作品。比较工程化的东西,不过比较实用,所以就公布了。

下面是他的简介,我直接从他的说明文档中复制了,如果你完全知道他的作用,那么直接去文章末尾的链接下载。

 

 

CipherLib是一个使用C++和汇编代码实现的用于多精度大整数运算和密码学领域素域基本运算的函数库。由陈士凯(CSK)开发。
这个函数库实现的操作有:

  1. 支持任意精度的大整数:精度可以通过代码设定,支持符号数
  2. 对大整数的四则运算和求模运算,以及2进制化的移位操作
  3. 使用类将大整数加以封装,支持直接用传统运算符进行大整数的运算代码编写
  4. 支持从文本串和系统内置整型数据中读取大整数,支持将大整数输出为2进制、8进制、10进制和16进制文本串
  5. 实现了Marsaglia & Zaman的长周期随机数(本机支持的整型格式)
  6. 支持模加、模乘、模幂计算
  7. 支持Rabin-Miller方法的素性验证
  8. 支持大素数产生

 简单的说可以利用这个库实现一些高精度计算和密码算法,比如RSA。


 

该函数库在设计上参考了mircal库,在核心的运算操作上使用了x86汇编语言和C语言2种版本代码编写。默认采用汇编语言执行。因而具有很高的运行效率(具体见Benchmark部分)
 
CipherLib的一些技术信息:
项目
说明
运行环境
32x86指令系统下的windows环境
开发环境
VC++ 2005版本
是否多线程安全
函数库形式
静态链接库或者直接嵌入代码
第三方库依赖
需要C运行库

 

Benchmark

 

下面是我写的对于CipherLib和mircal的一个运行效率比较(不过不是很科学,但是基本可以说明问题):

使用附带的程序CiperBench进行测试。
         测试程序在开发者电脑环境:Intel Pentium M 1.6G ,2G RAM,WinXP sp2环境中,对于静态库的本函数库和Mircal进行比较。
 
         由于采用了timeGetTime() API获取时间,因此精度可能会受偶尔系统调度的影响。
下面是对1000次的四则运算的执行时间对比,本函数库表现较优:

对于乘法的实测情况

对于加法的实测情况

对于减法的实测情况

对于除法的实测情况

对于求大素数的实测情况

 

 

 

 

对于素域运算,使用了产生一个大素数的运算作为衡量指标,因为其中需要进行素性验证和模乘和模幂运算。本函数库效率较低,原因是没有针对素性验证是的模幂运算单独进行优化。


我用于求模幂的算法是Koch提出的Sliding Window法。但是对于求素性验证来说不是最优的。

 


 使用范例

 

下面是用本函数库求解1000!的代码,从代码风格上可以看出他的易用性,具体代码和使用办法见文章末尾给出的文件中的操作手册。

#include "CiperLib.h"
#include <iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
    Integer::Init(409600);
    char output[20000];
    Integer Base(1000),Ans(1);
    while(!Base.isZero())
    {
        Ans *= Base;
        Base -= 1;
    }
    Ans.toString(output,20000);
    cout<<"Finished, Ans is:"<<endl<<output <<endl;
    system("pause");
}

 

下面很简单的说下实现的细节

大整数是采用2^32进制保存的,也就是用一个DWORD存储一个“位”。对于四则运算均使用汇编优化,其中算法参见Knuth的the Art of Computer Program 第二卷的多精度计算。

对于素域的计算,主要采用的就是窗口法求模幂,素性验证使用了Rabin-Miller法,并且进行了100次判断,可以确保相当高的正确概率。

注意的是,我不能保证潜在的bug,同时一些算法并不是最优的,所以使用时请自己注意。而且今后基本无法维护了。对于具体的实现,可以看代码注释以及我附在其中的实习报告

代码/Demo/文档的下载:

http://www.csksoft.net/data/legacyftp/Products/code_and_lib/CiperLib_release_by_csk.rar

教育网:ftp://great_csk:public@public.sjtu.edu.cn/public-files/CiperLib_release_by_csk.rar

暑假回顾

一个暑假都很忙,很久没有写blog了。虽然现在也已经是凌晨2点,不过我打算还是利用睡前的时间把这篇blog写完。

其实要更新的内容很多,而且一更新肯定不止1、2篇文章了。所以这篇就当时目录性质的吧...

一个假期很匆忙的就结束了,其实对我来说人生的假期恐怕已经没有了,所以也没有什么还留念的。围绕着整个假期主要发生了下面些事

写完后说的话:这篇文章很长,挑感兴趣的看吧

1.在张丽清老师的仿脑计算与机器智能研究中心实验室中实习

主要的工作是实现ColorConceptualization的网站,同时我自己提出了一个智能着色的东西。

这部分具体会在后面的帖子中详细的介绍。

对于智能着色我给出一个效果图片,应该就能理解:

图片:智能着色的效果图1

 

当然,利用Photoshop做出这样的效果也不难,不过要实现上面这个效果,利用智能着色只需要用鼠标点一下你想改变颜色的物体然后选种颜色即可。很容易操作。

图片:智能着色的效果图2

 

当然有机会去亲自体验下,假期中我实现了一个演示网站,网址是:http://bcmi.sjtu.edu.cn/clrconcept/

由于在教育网,公网用户速度可能比较慢,需要Flash9以上的播放器。

对于具体的算法,我不想在此多说了,目前缺陷是不能对灰度部分的物体,比如上图摩托车的黑色部分着色。测试的时候可以先下载我推荐的效果比较好的图片:

 

注意图片不要太大了(别超过2000x2000),我也不希望有恶意攻击的事件出现。

操作见下图:先选中自己想变换的色彩,然后点StartColoring,此时鼠标移到图上会高亮显示能够着色的物体,点击即可:

图片:智能着色网站显示1

 

虽然Flash AS3效率提升了不少,但是处理实时分割算法还是有点慢,如果大家觉得这个东西好玩,今后有空了可以考虑做单机版。

 

2.在被万恶的学校安排的密码学实验室中实习(见之前的文章)

虽然起初有点不情愿,但是后来发现还是蛮喜欢这方面东西的,当然不是说搞研究。

在密码学实验室的实习任务是实现在素域中大整数的模加、模乘和模幂运算。同时要实现素性验证。

对于模加、模乘和模幂,写出公式绝对是简单的不能再简单:

C = A + B (mod m)

C = A * B (mod m)

C = A^N (mod m)

不过问题在于,对于其中每个数,可能都是1024位的超长整数,比如一个1321421423124214325131413124124123412这样的数。对于目前计算机来说,一个DWORD最多也就能表示2^32-1个数。因此,需要针对任意长度大数的运算。这个的定义叫做“多精度整数”。Knuth的书有很明确的算法定义。但是要实现就是另外一码事。需要在关键运算处写汇编。

同时,对于素域的模幂和模乘运算,有个叫作Montgomery的老兄想到了一堆优化算法,因此实现起来更是恶心。

我后来参考了MIRCAL这个开源库写了自己的运算库。支持大整数四则运算,上述的模运算和素性检测以及大素数产生。由于是参照了MIRCAL库,同时对里面的汇编代码作了优化,所以很奇妙的我的库在四则运算上均快于MIRCAL。不过模运算就慢了,因为偷了懒,Montgomery老兄的算法有些没使用。

总的说来还是令我满意的,前后实现其实只用了3天,后来又花了几天写了素性检验和Benchmark程序。这个实习的好处是我马上要发新的文章公布这个库的代码和一些小东西了,呵呵,具体今后会写专门文章。

 

3.准备GRE作文

之前说过了,第一次觉得可能考不好,就cancel分数了,所以现在时间很紧了

 

上面就是这个假期大致做过的事情,上面介绍的东西我今后会写具体的文章。作为对blog和网站的填充吧。

 


 

下面就说说这段时间的一些想法:

可以说今年是我自信心不断受打击的一年,也是比较辛苦的一年,相比之前安逸的生活,今年应该能算作比较消沉的。有人说哲学家的人生都很悲惨,为什么呢,因为正是逆境促使他们思考自己的人生、他人的人生乃至这个世界。

虽然现在觉得我过得不如意,但是理性告诉我我那些困难简直算不上什么,不过同样我也思索了不少问题。当然其中不少至今还没有答案。

首先一个问题是为什么我今年突然会觉得不如意,可能一部分原因是今年是我必须面对现实的一年,相比之前可以对未来随意幻想,今年我必须决定今后要走的路了。而现实和我理想的差距就是造成落差的原因之一。

我是一个十分理想化的人,同时使一个很自卑的人。正是因为自卑,所以对外企图极力掩饰,具体的行动就是做事情尽可能追求完美,乃至任何事都希望能做好。当然我也受到这种状态的益处,但是终究我不是天才,那些做的不好的事就令我万分自卑。考GRE便是一个例子。

现在看来已经很了解自己的脾气了,我想目前能在计算机某些方面有一点小小的成就可能就是我追求完美的结果,虽然这些还far from prefect. 不过这样的性格另我活得很累,同时理想的落空造成的心理落差令我万分恐惧。虽然理性的思考让我觉得自己的行为十分无聊。

我学过弗洛伊德的理论,我完全知道这样是因为年幼的一些事情造成的,恐怕要改变也能困难,不过也只有去改变了。

最近在思索的另一问题是今后自己走的路。回想我以前做得事,可以说是比较“工程化”。但是如今我已决定将来要走学术的道路,所以之前做的事我该如何定位?完全的放弃?我还应该承认那是我的特长吗? 这个问题看来很可笑,不过一些具体问题上的确难以把握,比如这个blog今后的定位,是完全的学术化还是继续放一些技术方面的文章,当然我今后可能不研究了呢?我有个不好的习惯就是做事情比较杂。从Flash、平面设计、图像编程到软件逆向工程到硬件制作,都作出过一些小成就,但是后来都没有继续走下去。当然一方面原因是我觉得那些不适我今后该走的路,只是作为兴趣来研究罢了。但是的确要找一条路深入了,今后走学术道路可能可以让我在一个领域真正的“深入”吧。

现在得出的结论是今后就算完全从事理论化的研究,我曾经的爱好不会放弃。看不到自己的特长,完全从0开始进入新的领域已经给我不小自信打击。

现在是凌晨3点,想着今后还要走的路还很长,有时想想我也该知足了,其实做平庸的人是最幸福的。但目前与世无争我还是做不到,所以要拼搏。

 

明天早上醒来把一些技术上的文章补上

分页:[«]1[»]

Copyright Shikai Chen 2000-2012. Powered By Z-Blog(CSK Modified)