作者pmove (pain is my old friend)
看板Math
標題[代數] 是否有可能用電腦實作萬用反函數?
時間Sun Jun 18 11:28:38 2023
給定一函數func, 參數是i, j, k. 輸出是x, y. 假設i, j, k, x, y 都可以定義的數(非0/0),且不是無限大。
用Python語法表示:x, y = func(i, j, k)
那是否可以針對任何func, 用電腦實作一個萬用反函數?我稱此反函數invFunc, 或者用比較數學的表示法func^-1
用Python語法表示:i, j, k = invFunc(func, x, y)
我想問invFunc是否一定可以由程式寫出來?因為目前沒看到相關的萬用反函數可用,因此猜想是無法,如果真的是無法的話,方便解說一下,爲什麼無法?謝謝。
-----
Sent from JPTT on my iPhone
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 1.161.13.57 (臺灣)
※ 文章網址: https://www.ptt.cc/bbs/Math/M.1687058920.A.0EE.html
→ m3791913 : 不是所有函數都存在反函數 06/18 11:53
→ pmove : 我想到一個困難點,就是func 有可能超大,導致反函 06/18 11:56
→ pmove : 數很難求。那假設func在程式碼1000行以下,那有辦法 06/18 11:56
→ pmove : 實作萬用反函數嗎?目前我只知道,如果限定在三角函 06/18 11:56
→ pmove : 數的話,sin^-1, cos^-1, tan^-1, …這些都有人寫好 06/18 11:56
→ pmove : 了。另外求反矩陣,印像中也有公版的。 06/18 11:56
※ 編輯: pmove (1.161.13.57 臺灣), 06/18/2023 11:59:47
→ pmove : 回1F,m大:那不存在反函數,可返回exception錯誤, 06/18 12:02
→ pmove : 只處理有反函數就好的,可以麼? 06/18 12:02
→ pmove : 印像中,數學上,反矩陣也不一定存在啊。但程式裡面 06/18 12:41
→ pmove : 可以處理反矩陣存在時,才得到反矩陣。 06/18 12:41
推 j0958322080 : 反矩陣可以看他的 det 是否為零或其他條件,反函數 06/18 12:44
→ j0958322080 : 要看看到有沒有類似的條件可以讓你判斷 06/18 12:44
→ freePrester : Google 陷門函數 06/18 12:44
→ freePrester : 如果你辦得到的話你就能輕鬆進入絕大多數的電腦系統 06/18 12:45
→ freePrester : RSA 等密碼系統的安全性就是建立在反函數難以求出 06/18 12:47
推 arrenwu : 你方便說明一下什麼叫做「萬用反函數」嗎? 06/18 12:53
推 wohtp : 先說說你的I,j,k定義域是啥不過反正你說要用電腦實 06/18 13:36
→ wohtp : 作,就算都是float也只有有限多個值。 06/18 13:36
→ wohtp : 那一般解也非常簡單,反正把整個定義域都算過一遍答 06/18 13:36
→ wohtp : 案全部cache起來,反函數就是在cache裡面搜尋x ,y再 06/18 13:36
→ wohtp : 反推回原來的I, j, k 06/18 13:36
推 sunev : 如果是求一個程式,給定任何程式碼,以生成此程式碼 06/18 14:18
→ sunev : 的反程式碼,那應該會回到停機問題。 06/18 14:18
→ pmove : 回17樓,w大,把所有值cache起來,先不管效率問題, 06/18 14:56
→ pmove : 當cache的數,有無理數,或精確度不足,會造成小數 06/18 14:56
→ pmove : 點某幾位的數後面,被省略不記,如此會造成某些數, 06/18 14:56
→ pmove : 沒有被cache到。也就是原本func(i, j, k), i, j, k 06/18 14:56
→ pmove : 可以算完所有值域。但是輸出的x, y有可能被省略,使 06/18 14:56
→ pmove : 得某些x, y沒被cache, 但不代表此時反函數不存在。 06/18 14:56
→ pmove : 舉個例子,w = func(u) = u^2, 假設電腦只能表示小 06/18 17:08
→ pmove : 數點後一位(我知道這跟真正的電腦表示法,不太一樣 06/18 17:08
→ pmove : )那u =1時,w =1。u =1.1時,w=1.2 (1.21但只能表 06/18 17:08
→ pmove : 示小數點後一位,省略0.01),我要問w=1.1時,不在c 06/18 17:08
→ pmove : ache中,此時u 是多少?我只知道u 不是1,就是1.1, 06/18 17:08
→ pmove : 但到底是多少,尤其當func 更複雜時,有時候很難判 06/18 17:08
→ pmove : 斷 06/18 17:08
推 arrenwu : 所以你想要的其實是一個 產生反函數的函數? 06/18 18:00
→ pmove : 回樓上,其實很多大大都已回答,是卡在效率問題的樣 06/18 18:17
→ pmove : ,所以目前沒有公版invFunc 06/18 18:17
→ musicbox810 : 就取近似,線性差值 06/18 18:42
→ musicbox810 : 如果你一開始的定義夠密,結果應該不會太差吧 06/18 18:43
推 DreamYeh : 隨便舉例x=f(i)=i^4-i+1 請問x=0時i=? 四組答案? 06/18 21:53
推 deathcustom : 除非在一個區間內,x to y是bijective(1-1 and onto 06/19 01:16
→ recorriendo : Newton's method對我來說就是萬用反函數 :P 06/19 12:50
推 sunev : 程式可以要求輸出preimage,不一定要 1-1 06/19 13:13
推 LPH66 : 討論完可行性了, 我來說一聲: 這問法像是 XY 問題 06/19 19:54
→ LPH66 : 原 PO 很有可能有一些跟反函數相關的工作要做 06/19 19:54
→ LPH66 : 但不知何理由無法或希望不要個別地求反函數 06/19 19:55
→ LPH66 : 因此來問有何可以不需個別索求反函數的方式 06/19 19:55
→ LPH66 : 那經過這些可行性討論之後, 我想要問原 PO: 06/19 19:55
→ LPH66 : 你最一開始會有需要反函數的需求是什麼? 06/19 19:56
→ LPH66 : 就算只對特定類型的函數求逆都是相對簡單的問題 06/19 19:56
→ LPH66 : 給出需求來大家會比較知道要建議你用什麼方法 06/19 19:57
→ pmove : 確實是工作上需要求反函數,只是工作上的目前已經求 06/20 10:39
→ pmove : 出來,好奇為何沒人寫一個公版求反函數,所以來問, 06/20 10:39
→ pmove : 謝謝。 06/20 10:39
推 LPH66 : 那麼這裡再補充一件事吧:效率問題其實是其次 06/20 15:34
→ LPH66 : 有的函數根本上就是無法求得「一個」特定的反函數 06/20 15:34
→ LPH66 : 都需要將原函數作一些範圍限定或條件限定之後 06/20 15:35
→ LPH66 : 才能有「一個」反函數被定義出來 06/20 15:35
→ LPH66 : 這件事和你的原函數的型式極度相關,因此我才會問 06/20 15:36
→ LPH66 : 究竟原函數長怎樣,這樣才能夠知道要怎麼加條件 06/20 15:37
→ LPH66 : 去得到那一個反函數,同時也有助於實際求值 06/20 15:37
→ LPH66 : 給出型式也能知道是不是那些本質上很難求逆的東西 06/20 15:39
推 wohtp : 唯一的一般解就是我說的窮舉法啊。float還可以讓你 06/20 20:39
→ wohtp : 這樣搞,R連窮舉的機會都沒了。 06/20 20:39
→ xcycl : 程式語言不是只能寫 float,是能夠寫 exact real 的 06/21 00:02
推 Vulpix : 是computable number嗎? 06/21 01:31
推 wohtp : 只是多幾個位數而已,哪可能真的用電腦實作實數。 06/21 20:34
→ sunev : 電腦只能處理特定實數,不然就不會定義computable 06/21 21:02
→ xcycl : 有點好奇心看到關鍵字搜尋就知道不是多幾位數而已 07/02 17:03
→ xcycl : 可以說是 computable real 沒錯 07/02 17:04