寫了一個mapping
義務教育應該上過,function滿足一對一映成,就會存在反函數
(雖然一般人已經忘了這句話了...)
下個問題,怎麼設計一個[0,N]區間的一對一映成函數呢
自己給定質數prime, prime < 2*N
int64_t f(int64_t input, int64_t full_size, int prime )
{
int64_t size = full_size%prime == 0 ? full_size-1 :
(full_size/prime)*prime - 1;
if( input >= size )
return input;
int64_t result = 0;
int64_t offset = size/prime;
int64_t n;
for( n = 0; n < prime; n++ )
{
if( offset*n + n <= input && input <= offset*(n + 1) + n)
{
result = (input - offset*n - n)*prime +n;
break;
}
}
return result;
}
int64_t g( int64_t input, int64_t full_size, int prime )
{
int64_t size = full_size%prime == 0 ? full_size-1 :
(full_size/prime)*prime - 1;
if( input >= size )
return input;
int64_t quotient = input/prime;
int64_t remainder = input%prime;
int64_t offset = size/prime;
int64_t n;
int64_t result = offset*remainder + quotient + remainder;
return result;
}
其中,g是f的反函數,g(f(x)) = x
至於這東西能幹嘛...自己是拿去把一個檔案弄亂,可以想成是某種形式的加密
或是未來小孩國高中後給他當腦筋急轉彎或是當科展題材(?)
我的年代,義務教育都著重在解數學題目
但我覺得開放性的設計數學會比較有趣. (包含程式設計)
工程師忙累了,今天股票被套牢,覺得很悶跑來寫廢文QQ
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 111.241.148.110 (臺灣)
※ 文章網址: https://www.ptt.cc/bbs/Engineer/M.1782201647.A.898.html
→
06/23 17:15,
6小時前
, 1F
06/23 17:15, 1F
→
06/23 17:15,
6小時前
, 2F
06/23 17:15, 2F
→
06/23 17:58,
5小時前
, 3F
06/23 17:58, 3F
→
06/23 18:04,
5小時前
, 4F
06/23 18:04, 4F
→
06/23 18:23,
5小時前
, 5F
06/23 18:23, 5F
推
06/23 21:09,
2小時前
, 6F
06/23 21:09, 6F