2016-11-01 41 views
-2

我有一個類,它看起來像這樣的程序。獲取在Java中使用求和的函數的反函數

public class Functions { 

    public static void main(String[] args) { 
     System.out.println(summationFunction(1)); //Prints 13 
     System.out.println(summationFunction(2)); //Prints 29 
     System.out.println(summationFunction(3)); //Prints 48 
     System.out.println(summationFunction(4)); //Prints 70 
    } 

    public static int summationFunction(int input) { 
     int summedNumber = 0; 
     int i = input; 
     while (i > 0) { 
      summedNumber += i * 3; 
      i--; 

     } 
     return 10 * input + (summedNumber); 
    } 


} 

因此,該程序將在一個給定的數量和應用此功能,把它:

The function of my method.

而這一切運作良好(我已經運行的類Functions,一切印刷品一樣它應該。)但是,我需要找到這個函數的反函數,我需要能夠將它翻譯爲代碼;我不知道該怎麼做。

基本上,我需要一個函數將返回這樣的值:

public static void main(String[] args) { 
    System.out.println(summationFunction(13)); //Prints 1 
    System.out.println(summationFunction(29)); //Prints 2 
    System.out.println(summationFunction(48)); //Prints 3 
    System.out.println(summationFunction(70)); //Prints 4 
} 

其中,(你可以告訴)是原函數的對面。

所以總結了一切,我需要將回到我原來的函數的反函數(summationFunction,並我想知道我將如何,對此建模或者如果有一個快速的解決方案碼。

還有一件事:我知道我可以讓方法接受輸入並搜索原始方法的最相似的輸出,但我想看看是否有更簡單的方法來做到這一點,而不是涉及搜索,從而提供更快的輸出速度。如果你願意,你可以安全地假設的倒函數的輸入將始終是一個數字,這將給一個整數輸出,像13,29,48,70,等等

順便說一句,如果你打算低估這個問題,你會至少在某個地方給出一個理由嗎?或許這些評論?我看不出有任何理由認爲這個問題有資格被低估,而有一個原因會有所幫助。

回答

3

Wolfram Alpha來救援!

它會告訴你,這個功能可以寫爲:如果你想解決F(X)

1/24*(6*x+23)^2-529/24 

所以= A,你有:

x = 1/6*(sqrt(24*a+529)-23) 

a = 70 
# => x = 4 

注意:使用鎢不該不會阻止你自己找到答案。

sum(something*i) is equal to something*sum(i) because something (3 in this case) doesn't depend on i. 

總和(I,I = 1 ... N)是等於n *(N + 1)/ 2,並且可以很容易地證明(見Wikipedia

So your function becomes 10*x+3*x*(x+1)/2 
Expanded, it is : 
(3 x^2)/2+(23 x)/2 
You need to solve (3 x^2)/2+(23 x)/2 = 70, in other words : 
(3 x^2)/2+(23 x)/2 - 70 = 0 

它是一種具有a = 3/2,b = 23/2和c = -70或c = -29或c = ...的quadratic equation

+0

啊。我以前從未聽說過Wolfram。感謝您和@talex提供資源和更好的描述! –

2

你總結可以這樣寫3*x*(x+1)/2所以你有方程10*x + 3*x*(x+1)/2 = y你需要解決它。

Wolfram Alpha的告訴結果將是1/6.0 * (-23.0+sqrt(529.0+24.0 * y))