2017年9月24日 星期日

資工 系上老師 教授

資工 系上老師 教授



H925(Sun) YMDD說明

H925(Sun) YMDD說明
是一個實用的日期縮寫版...

一般我們在註明 日期 時,會用到幾個格式

 民國 年-月-日

106-9-25
1060925

 西元 年-月-日
2017-9-25
20170925
170925  <--雖然可以縮短至六位,但容易混淆.
例: 040905 ??

在需要註明日期,又不希望它太長(愈短愈好)...
最短格式為YMD 年月日 各一個"符號"來代

Y表示"年"(Year) 由2000年開始 ~到203x年
  可由 0(2000年),1(2001年),2...,9, A, B, ..., G, H(2017年), ..., Y, Z

M表示"月"(Month)
  可由 1, 2, 3,...9, A(10月), B(11月), C(12月)

D表示"日"(Day)
 1-31日, 可由 1, 2, 3, ...9, A(10日), ....K(20日)...
1-9     =>     1, 2,  3, 4,  5, 6,  7, 8, 9
10-19 => A, B, C, D, E, F, G, H, J, K,  (I不使用)
20-29 => L, M, N, P, Q, R, S, T, V, W, (O,U不使用)
30-31 => X, Y

YMD雖然可以變很短,但有一個問題,就是(人工)轉換上
比較困難,後來改為YMDD (日改成兩位數,直接用01-31,沒有轉換問題)

註: 可能有人會說 日 會有轉換問題,年也會有轉換問題...
但 你試想一下,一年才"年"改變一次,基本上,不會有問題

 --------------------------------
x101  101是好的開始

xC31 一年的最後一天
xAxx  月份看到英文(A,B,C)表示年底到了...

H925 = 2017年9月25日






2017年9月23日 星期六

H923(Sat) 科學計算方法與實務探討 課後議題

H923(Sat) 科學計算方法與實務探討 課後議題

課堂使用MatLab軟體,在學校有買MatLab版權...
學生課後回家,需要有替代方案...

 課後兩個議題
1. MatLab  替代方案
   找到Octave 來替代MatLab
   https://zh.wikipedia.org/wiki/GNU_Octave

2. plot 繪圖問題
  plot 繪圖,正常會給結果.就是已經畫好
  老師希望 可以看到慢動作的過程
  找到 用for迴圈及  drawnow; pause(.3) 配合
  寫程式副程式plots 已經可以實現初步功能



--------------------------------------------------------------------------------------

 1. MatLab  替代方案

 在網路上找到Octave
https://zh.wikipedia.org/wiki/GNU_Octave
Octave是一個旨在提供與Matlab語法相容的開放原始碼科學計算數值分析的工具;它同時也是GNU計畫成員之一。...



2. plot 繪圖問題
老師希望 可以看到慢動作的過程
   找到 用for迴圈及  drawnow; pause(.3) 配合
   寫程式副程式plots 已經可以實現初步功能




t = [ 0:0.01:2*pi];
%時間軸  0到2pi (6.2831852...)

v = sin(t);
% 值為 sin wave

% 內附 繪圖 功能   缺點,無法看到過程...
plot(t,v)



% 初步 改善plot 加個 s為plots (取slow,step用意)
%註:講 初步 改善 只它用在 某些資料數據格式
%    無法完全 相容plot 還沒全面了解...


plots(t,v)
plots(t,v,0.1)          % (繪圖)間隔0.1秒
plots(t,v,0.1, 100)  % (整個圖形)分成 100次 完成 
% 以上效果一樣 (10秒完成 整個圖形)
plots(t,v,0.1, 1000)  % (整個圖形)分成 1000次 完成 
plots(t,v,0.3)            % (繪圖)間隔 變長 =0.3秒 (放慢更新速度)

plots(t,v,0.01, 1000)  % (整個圖形)分成 1000次 完成  ,(繪圖)間隔 變短 =0.01秒 (加快更新速度)
 % 註:1000 * 0.01 = 10秒 (全部時間一樣是10秒,但繪圖動作更細緻...)


% 以下程式碼在 Octave 可以正常work
% 初步 改善 能某些資料數據格式
%    無法完全 相容plot 還沒全面了解...

function plots(x,y,sec,times)
  len  = length(x);
  if nargin == 2,
    sec = 0.1;  %預設為每0.1秒 更新一次
  end

  step = int32(len/100);   % 預設 共分100個步驟完成
  % 預設 100*0.1 = 10秒完成
  if nargin == 4,
    step = int32(len/times);
  end
  xmin = min(x);
  xmax = max(x);
  xrang= xmax - xmin;
  xmin = xmin - xrang/10;
  xmax = xmax + xrang/10;

  ymin = min(y);
  ymax = max(y);
  yrang= ymax - ymin;
  ymin = ymin - yrang/10;
  ymax = ymax + yrang/10;

  for n=1:step:len,
    plot(x(1:n), y(1:n));
    axis([xmin xmax ymin ymax]);
    drawnow
    pause(sec);
  end
endfunction

H923(Sat) 開學了 剛拿到的學生證

H923(Sat) 開學了 剛拿到的學生證
 含有門禁(感應)與悠遊卡功能




原則上 這兩年(2017-2018)要經常到輔大上課

H915(Fri) 開學日(大學部新生參加,研究所不用參加)
H917(Sun) 體檢日(大學部新生體適能)








H923(Sat) 科學計算方法與實務探討

H923(Sat) 科學計算方法與實務探討

 MatLab 

A = zeros(8)
A = zeros(8,8)

% 歸零 8x8 矩陣

A = zeros(1,8)
 0 0 0 0 0 0 0 0

A = zeros(8,1)
 0
 0
 ...
 0


A = rand(8) 
%  亂數產生 (0~1)

A = 100*rand(8) 
%  亂數產生 (0~100)

A = 100*rand(8) - 50
%  亂數產生 (-50 ~50)


A = [ A11 A12 A13 ]    %一維陣列
A = [ A11 A12; A21 A22 ]    %二維陣列



  Anxn * Xnx1 = Bnx1

  A- [ A X ] = A-  B
            X   = A-  B
Note: A-  inv(A)
A- A = 1

-----------------------------------------
A- 與 B ,(反過)來求解 X

A = rand(8);
X = rand(8,1);
B = A * X;

Y = inv(A) B;     % A- => inv(A)

比較 Y與 X 差異
norm(X-Y)
ans =  1.1161e-15
結果為一個很小的誤差(數據沒什麼差異)


註: norm 有三個實現方式
 1. sum | X-Y |
  X-Y 絶對值的總合 2. max | X-Y |
  X-Y 絶對值的最大值
 3. sum (X-Y)^2
   X-Y 平方的總合

-----------------------------------------------

 t = [ 0:0.01:2*pi];
 a = sin(t);
 plot(t,a)

 sin wave 繪圖

如果要控制繪圖細節動作,請參考 
H923(Sat) 科學計算方法與實務探討 課後議題


2017年9月22日 星期五

H922(Fri) 資訊安全

H922(Fri) 資訊安全

cryptography and network security principles and practice

使用Python程式語言
 *大學全面教Python

$ python
Python 2.7.3 (default, Oct 26 2016, 21:04:23)
...

>>> 10 // 3       # 取商
3
>>> 10 / 3
3
>>> 10 / 3.0
3.3333333333333335
>>> 10 % 3     # 取餘
1

 >>> 50**23     # 整數 沒有位數限制 ?!
1192092895507812500000000000000000000000L


RSA加密演算法

https://zh.wikipedia.org/wiki/RSA%E5%8A%A0%E5%AF%86%E6%BC%94%E7%AE%97%E6%B3%95

RSA加密演算法是一種非對稱加密演算法。在公開金鑰加密電子商業中RSA被廣泛使用。RSA是1977年由羅納德·李維斯特(Ron Rivest)、阿迪·薩莫爾(Adi Shamir)和倫納德·阿德曼(Leonard Adleman)一起提出的。當時他們三人都在麻省理工學院工作。RSA就是他們三人姓氏開頭字母拼在一起組成的。...


 以下均為整數
  1. 找兩個夠大的質數 pq,兩者不相等,計算N=pq
  2.  r(p - 1)(q - 1)
  3. er,兩者互質。並求d, 令{\displaystyle ed\equiv 1{\pmod {r}}}
  4. pq的記錄銷毀


 (N, e)公鑰public key,(N, d) 是私鑰 (private key 或是 secret key)

公鑰(N, e)公開給別人用來加密用
私鑰(N, d)要保存好,用來解密用
A傳訊息給B

1. 明文 (未加密)
 A的 Text ==> 未加密(明文) ==>  傳送  ===> B 收到Text
 優點: 簡單不需要額外成本(加密/解密)...
 缺點: 訊息被取得,修改,違造...等問題

  2. 對稱加密
A的 Text ==> 加密(Key(Text)) ==>  傳送  ===> B 收到Key(Text),                                                                 B使用同一個Key解密 
 優點: 加解密 演算法 較容易 實作
 缺點: 雙方取得同一個Key的問題
 3. 非對稱加密
   A的 Text ==> 用B的公鑰加密 ==>  傳送  ===> B 收到密文,用B(自已)私鑰解開.
 優點: 加解密 公私鑰不同
 缺點: 加解密 演算法複雜且費時

 -----------------------------------------------------------------------------------------------
第一步 質數 問題 ...



Fermat little theorem 費馬小定理
https://en.wikipedia.org/wiki/Fermat%27s_little_theorem

整數 1<a<p,  如果 p是質數, 則a p   除p 取餘 等於 a
a^p \equiv a \pmod p.
例:   1 < ap,   a p = xxx,   xxx / pa
例: a = 2, p = 7,   27 = 128,  128 / 7 餘 2
例: a = 3, p = 7,   37 = 2187,  2187 / 7 餘 3

         a p / pa ,      同除 a
         a p-1 / p 餘 1  
a^{p-1} \equiv 1 \pmod p.


例:   1 < ap,   a p-1 = xxx,   xxx / p 餘 1
例: a = 2, p = 7,   27-1 = 64,  64 / 7 餘 1
例: a = 3, p = 7,   37-1 = 729 ,  729 / 7 餘 1

--------------------------------------------------------------

使用Python

例: a = 2, p = 7,   27-1 = 64,  64 / 7 餘 1

 a p-1
可以使用 a**(p-1) 或 pow(a, p-1)

加入取餘之後,可以直接使用....
pow(a, p-1, p)
表示 a p-1p 取餘   ==>  a p-1 mod p
註: pow(a, p-1) %7 與 pow(a, p-1, p)
 運算過程不太一樣, 一個要算出a**(p-1)真正的值
它可能非常的大要算很久 例: 723456234767 ** 234654778345234237

 pow(a, p-1, p) 可以邊取餘 邊算次方
 例: pow(5, 6, 7)
在算 5的6次方時,
1. 算5的2次方, 5*5 = 25 (超過7)先取餘 ,結果為 4.
2. 算5的3次方, 4*5 = 20 (超過7)先取餘 ,結果為 6.
3. 算5的4次方, 6*5 = 30 (超過7)先取餘 ,結果為 2.
4. 算5的5次方, 2*5 = 10 (超過7)先取餘 ,結果為 3.
5. 算5的6次方, 3*5 = 15 (超過7)先取餘 ,結果為 1.
 結果(餘數)為 1
運算過程不用真的算出 5的6次方的值.

2017年9月20日 星期三

H920(Wed)平行處理

H920(Wed)平行處理

上課要用到程式語言
C*(start), openMP(Multi-Processing)

 註:另有 open MPI (Message Passing Interface)
 可用於分散系統
https://en.wikipedia.org/wiki/Open_MPI

 平行處理 原始碼所需修改
CStar
平行處理專有指令 例: forall
優點: 模擬 平行與沒有平行 的效能結果
缺點: 要改比較多的程式碼...

openMP
增加 #pragma omp parallel
語法: #pragma omp <directive> [clause[[,] clause] ...]
優點: 修改少(減少出錯)...
缺點: debug增加困難度...

int main(int argc, char* argv[]) {
  #pragma omp parallel
  printf("Hello, world.\n");
  return 1;
}

編譯選項
$ gcc -fopenmp omp.c

# (由2線程來執行)
$ export OMP_NUM_THREADS=2

$ ./a.out
Hello, world.
Hello, world.