একটি সংখ্যার সুপার রুট গণনা করুন


10

গণিতে, টেটারেশন হ'ল ক্ষুদ্রাকৃতির পরে পরবর্তী হাইপার অপারেটর, এবং এটি পুনরাবৃত্ত এক্সপেনসিটিশন হিসাবে সংজ্ঞায়িত হয়।

সংযোজন ( একটি সফল n বার)

গুণ ( একটি নিজেই যোগ এন বার)

Exponentiation ( একটি নিজেই দ্বারা গুন, এন বার)

Tetration ( একটি নিজে exponentiated, এন বার)

টেটারেশনের বিপরীত সম্পর্কগুলিকে বলা হয় সুপার-রুট, এবং সুপার-লোগারিডম। আপনার টাস্কটি এমন একটি প্রোগ্রাম লিখতে হবে যা A এবং B দেওয়া হয়, এ এর ​​বি এনডি- অর্ডার সুপার-রুট প্রিন্ট করে that

উদাহরণ স্বরূপ:

  • যদি A = 65,536এবং B = 4এটি মুদ্রণ করে2
  • যদি A = 7,625,597,484,987এবং B = 3এটি মুদ্রণ করে3

A এবং B ইতিবাচক পূর্ণসংখ্যা এবং দশমিক পয়েন্টের পরে ফলাফলটি অবশ্যই 5 টি সংখ্যার নির্ভুলতার সাথে ভাসমান পয়েন্ট নম্বর হতে হবে। ফলাফলটি আসল ডোমেনের অন্তর্গত।

সাবধানতা অবলম্বন করুন, সুপার-শিকড়গুলির অনেকগুলি সমাধান থাকতে পারে।


1
ইনপুট নম্বরগুলিতে কি সর্বনিম্ন / সর্বাধিক সীমা রয়েছে? একটি বৈধ উত্তরের ভাসমান পয়েন্ট উত্তরগুলি সমর্থন করা উচিত, বা কেবল পূর্ণসংখ্যা?
জোশ

3
যদি একাধিক সমাধান হয় তবে প্রোগ্রামটি সমস্ত বা কেবল একটি খুঁজে পাওয়া উচিত?
জোহানেস এইচ।

5
তাহলে আপনার জয়ের মানদণ্ডটি কী?
এমএমএইচএম

2
আপনি একটি সুপার-রুটের একটি সাধারণ উদাহরণ দিতে পারেন যা প্রদত্ত A এবং B root 1 এর জন্য একাধিক সমাধান রয়েছে?
টোবিয়া

1
আপনি কি সুপার-মূলের গাণিতিক উপস্থাপনা দিতে পারেন? আমি ভয় করি আমি এখনও এটি বুঝতে পারি না কীভাবে এটি সংজ্ঞায়িত করা হয়েছে।

উত্তর:


6

সি - স্পষ্টতার লক্ষ্যে, কোডটি চেপে দেখার চেষ্টা করেনি

ইনপুট বিবেচনা:

A: A ∈ ℝ, A ≥ 1.0
B: B ∈ ℕ, B ≥ 1

তারপরে ℝ এ সাধারণত একটি সমাধান থাকতে হবে যা সমস্যাটিকে যথেষ্ট সরল করে।

কোডটি হ'ল:

#include <stdlib.h>
#include <stdio.h>
#include <math.h>

#define TOLERANCE    1.0e-09

double tetrate(double, int);

int main(int argc, char **argv)
{
    double target, max, min, mid, working;
    int levels;

    if (argc == 3)
    {
        target = atof(argv[1]); // A
        levels = atoi(argv[2]); // B

        // Shortcut if B == 1
        if (levels == 1)
        {
            printf("%f\n", target);
            return 0;
        }

        // Get a first approximation
        max = 2.0;
        while (tetrate(max, levels) < target)
            max *= 2.0;

        min = max / 2.0;

        // printf("Answer is between %g and %g\n", min, max);

        // Use bisection to get a closer approximation
        do
        {
            mid = (min + max) / 2.0;
            working = tetrate(mid, levels);
            if (working > target)
                max = mid;
            else if (working < target)
                min = mid;
            else
                break;
        }
        while (max - min > TOLERANCE);

        // printf("%g: %f = %f tetrate %d\n", target, tetrate(mid, levels), mid, levels);
        printf("%f\n", mid);
    }

    return 0;
}

double tetrate(double d, int i)
{
    double result = d;

    // If the result is already infinite, don't tetrate any more
    while (--i && isfinite(result))
        result = pow(d, result);

    return result;
}

সংকলন করতে:

gcc -o tet_root tet_root.c -lm

চালানোর জন্য:

./tet_root A B

উদাহরণ:

4 2

$ ./tet_root 65536 4
2.000000

3 3

$ ./tet_root 7625597484987 3
3.000000

3 π

$ ./tet_root 1.340164183e18 3
3.141593

n (2 ½ ) ➙ 2 হিসাবে এন ➙ ∞? (সুপরিচিত সীমা)

$ ./tet_root 2 10
1.416190

$ ./tet_root 2 100
1.414214

$ ./tet_root 2 1000
1.414214

হ্যাঁ!

এন (ই 1 / ই ) ➙ n হিসাবে এন ➙ ∞? (উপরের সীমা)

$ ./tet_root 9.999999999e199 100
1.445700

$ ./tet_root 9.999999999e199 1000
1.444678

$ ./tet_root 9.999999999e199 10000
1.444668

$ ./tet_root 9.999999999e199 100000
1.444668

শান্ত! (ই 1 / ই ≅ 1.44466786101 ...)


আমি বলতে পারি গণিত সম্পর্কে আপনি আসলেই অনেক কিছু জানেন :) (এই উত্তর) ∈ (ℝeally চিত্তাকর্ষক স্টাফ)
অ্যালবার্ট রেনশো

@ অ্যালবার্ট রেনশওয়া এটি কেবল দ্বিপক্ষের একটি বাস্তবায়ন। মোটেও খুব শক্ত নয়।
কেবল সুন্দর শিল্প

5

পাইথন, 87 টি অক্ষর

E=lambda x,n:x**E(x,n-1)if n else 1
def S(A,B):
 x=1.
 while E(x,B)<A:x+=1e-5
 return x

উত্তরের জন্য একটি সরল রৈখিক অনুসন্ধান।

অফ-টপিক, তবে পাইথন **অপারেটরের সাথে * # $ (@!

>>> 1e200*1e200
inf
>>> 1e200**2
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
OverflowError: (34, 'Numerical result out of range')

একটি বাগ রিপোর্ট উপযুক্ত?
জোশ

সাহচর্য কি পথে পাচ্ছে? আপনি কি তুলনা (1e200)**2করছেন 1e(200**2)?
danmcardle

2
@ জোশ: আমি একটি বাগ রিপোর্ট করেছি: bugs.python.org/issue20543 মূলত, উদ্দেশ্য হিসাবে কাজ করা - তারা আইইইই ফ্লোটের জন্য খুব বেশি নয়। তারা যদি কোনও কিছু ঠিক করতে থাকে তবে OverflowErrorএটি প্রথম ক্ষেত্রে একটি উত্পন্ন করা হবে ।
কিথ র্যান্ডাল

3

গণিত, 35 40

n /. Solve[Nest[#^(1/n) &, a, b] == n]~N~5

5 সংখ্যক নির্ভুলতা সহ সমস্ত সমাধানের একটি তালিকা তৈরি করে।

n /. Last@Solve[Nest[#^(1/n) &, a, b] == n]~N~5

কেবলমাত্র আসল সমাধান পেতে আরও 5 টি অক্ষর, যা আপডেট হওয়া নিয়মগুলির দাবি।


2

জুলিয়া

julia> t(a,b)=(c=a;for j=1:b-1;c=a^c;end;c)
julia> s(c,b)=(i=1;while t(i,b)!=c;i+=1;end;i)
julia> s(65536,4)
2
julia> s(7625597484987,3)     
3

প্রশ্নটি কেবল পূর্ণসংখ্যার জন্য আচরণকে সংজ্ঞায়িত করে ভাসমান পয়েন্ট নির্দেশিকা উপেক্ষা করে।


2

এটি কখন একটি কোড গল্ফ হয়ে উঠল? আমি ভেবেছিলাম সেরা অ্যালগরিদম নিয়ে আসা একটি কোড চ্যালেঞ্জ!


এপিএল, 33 টি অক্ষর

{r←⍵⋄⍺{1≥⍵⍟⍣⍺⊢r:⍵⋄⍺∇⍵+i}1+i←1e¯6}

এই একটি সহজ রৈখিক অনুসন্ধান = 1 + + 10 C থেকে শুরু -6 ও 10 দ্বারা এটি বৃদ্ধিশীল -6 পর্যন্ত
    লগ সি লগ সি লগ ইন করুন সি ⋯ একটি ≤ 1
যেখানে লগ সি ফাংশন যাও recursively বি বার প্রয়োগ করা হয়।

উদাহরণ

      4 {r←⍵⋄⍺{1≥⍵⍟⍣⍺⊢r:⍵⋄⍺∇⍵+i}1+i←1e¯6} 65536
2.0000009999177335
      3 {r←⍵⋄⍺{1≥⍵⍟⍣⍺⊢r:⍵⋄⍺∇⍵+i}1+i←1e¯6} 7625597484987
3.0000000000575113

এই কোডটি খুব ধীর, তবে 2 বা 3 এর মতো ছোট বেসগুলির জন্য এটি কয়েক সেকেন্ডে সম্পূর্ণ হয়। আরও ভাল জিনিসের জন্য নীচে দেখুন।


এপিএল, লগারিদমিক জটিলতা

মূল শৃঙ্খলায় প্রকৃতপক্ষে রৈখিক জটিলতা, ফলাফলের আকার এবং যথার্থতার উপর লোগারিথমিক:

    সময় = ও (বি × লগ (সি) + বি × লগ (ডি))

যেখানে বি মূল ক্রম, সি হল টিটারেশন বেসটি জিজ্ঞাসা করা হচ্ছে, এবং ডি হ'ল যথার্থতার সংখ্যার সংখ্যা। এই জটিলতাটি আমার স্বজ্ঞাত বোধগম্যতা, আমি কোনও প্রামাণিক প্রমাণ প্রমান করিনি।

এই অ্যালগরিদমের জন্য বড় পূর্ণসংখ্যার প্রয়োজন হয় না, এটি কেবল নিয়মিত ভাসমান পয়েন্ট সংখ্যাগুলিতে লগ ফাংশনটি ব্যবহার করে, সুতরাং এটি ভাসমান পয়েন্ট বাস্তবায়নের সীমা অবধি (ডাবল যথার্থতা, বা স্বতঃস্ফূর্ত বৃহত এফপি সংখ্যার উপর নির্ভর করে) এপিএল বাস্তবায়ন যা তাদের প্রস্তাব দেয়))

ফলাফলের নির্ভুলতা ⎕CTকাঙ্ক্ষিত গ্রহণযোগ্য ত্রুটির সাথে তুলনা (তুলনা সহনশীলতা) দ্বারা নিয়ন্ত্রণ করা যেতে পারে (আমার সিস্টেমে এটি ডিফল্ট 1e¯14, প্রায় 14 দশমিক অঙ্ক)

sroot←{              ⍝ Compute the ⍺-th order super-root of ⍵:
  n←⍺ ⋄ r←⍵          ⍝ n is the order, r is the result of the tetration.
  u←{                ⍝ Compute u, the upper bound, a base ≥ the expected result:
    1≥⍵⍟⍣n⊢r:⍵       ⍝   apply ⍵⍟ (log base ⍵) n times; if ≤1 then upper bound found
    ∇2×⍵             ⍝   otherwise double the base and recurse
  }2                 ⍝ start the search with ⍵=2 as a first guess.
  (u÷2){             ⍝ Perform a binary search (bisection) to refine the base:
    b←(⍺+⍵)÷2        ⍝   b is the middle point between ⍺ and ⍵
    t←b⍟⍣n⊢r         ⍝   t is the result of applying b⍟ n times, starting with r;
    t=1:b            ⍝   if t=1 (under ⎕CT), then b is the super-root wanted;
    t<1:⍺∇b          ⍝   if t<1, recurse between ⍺ and b
    b∇⍵              ⍝   otherwise (t>1) returse between b and ⍵
  }u                 ⍝ begin the search between u as found earlier and its half.
}

আমি নিশ্চিত নই যে 1≥⍵⍟⍣nউপরের কোনও ডোমেন ত্রুটির সাথে ব্যর্থ হতে পারে (কারণ একটি নেতিবাচক যুক্তির লগ তাত্ক্ষণিকভাবে ব্যর্থ হতে পারে, বা একটি জটিল ফলাফল দিতে পারে, যা এর ডোমেনে থাকবে না) তবে আমি খুঁজে পেতে সক্ষম হইনি ব্যর্থ একটি মামলা।

উদাহরণ

      4 sroot 65536
1.9999999999999964
      4 sroot 65537
2.000000185530773
      3 sroot 7625597484987
3
      3 sroot 7625597400000
2.999999999843567
      3 sroot 7625597500000
3.000000000027626

'3' একটি সঠিক মান হিসাবে প্রকাশিত হয় কারণ এটি বাইনারি অনুসন্ধানের দ্বারা সরাসরি হিট হওয়া মানগুলির মধ্যে একটি হতে পারে (2 থেকে দ্বিগুণ, 4-এ দ্বিখণ্ডিত)) সাধারণ ক্ষেত্রে এটি ঘটে না, সুতরাং ফলাফলটি একটি ⎕সিটি ত্রুটির সাথে মূল মান আনুমানিক করবে (আরও স্পষ্টভাবে, প্রতিটি পরীক্ষার্থীর বেসের লোগারিথমিক পরীক্ষাটি toleসিটি সহনশীলতার সাথে সম্পন্ন করা হয়))


1

রুবি, 79 বাইট

->a,b{x=y=1.0;z=a;eval"y=(x+z)/2;x,z=a<eval('y**'*~-b+?y)?[x,y]:[y,z];"*99;p y}

এটি নীচের প্রোগ্রামের মতো, তবে এটি কেবল 99 লুপ চালায় তাই কম সঠিক।

রুবি, 87 বাইট

->a,b{x=y=1.0;z=a;(y=(x+z)/2;x,z=a<eval("y**"*~-b+?y)?[x,y]:[y,z])while y!=(x+z)/2;p y}

এটি অনলাইনে চেষ্টা করুন

এটি কেবল দ্বিপক্ষীয়। Ungolfed:

-> a, b {
    # y^^b by evaluating the string "y ** y ** ..."
    tetration =-> y {eval "y ** " * (b-1) + ?y}

    lower = middle = 1.0
    upper = a

    while middle != (lower + upper) / 2 do
        middle = (lower + upper) / 2

        if tetration[middle] > a
            upper = middle
        else
            lower = middle
        end
    end

    print middle
}

0

কে [৫২ টি চর]

{{{((%x)*(z*x-1)+y%z xexp x-1)}[x;y]/[2]}[y]/[y<;x]}

আমার নিজের পোস্টের একটি পরিমার্জিত সংস্করণ এন রুট

উদাহরণ:

{{{((%x)*(z*x-1)+y%z xexp x-1)}[x;y]/[2]}[y]/[y<;x]}[7625597484987;3]
3f 

{{{((%x)*(z*x-1)+y%z xexp x-1)}[x;y]/[2]}[y]/[y<;x]}[65536;4]
2f

0

Haskell,

সরল রৈখিক অনুসন্ধান, প্রথমটি পাওয়া যায়, সবচেয়ে ছোট মিল খুঁজে পাওয়া যায়।

{-
    The value of a is the result of exponentiating b some number of times.
    This function computes that number.
-}
superRoot a b = head [x | x<-[2..a], tetrate x b == a]

{-
    compute b^b^...^b repeated n times
-}
tetrate b 1 = b
tetrate b n = b^(tetrate b (n-1))

উদাহরণ

*Main> superRoot 65536 4
2
*Main> superRoot 7625597484987 3
3

0

ম্যাথমেটিকা, অপটিমাইজেশন ছাড়াই 41 বাইট

গাণিতিক মূলত এরকম সমস্যা সমাধানের জন্য উদ্ভাবিত হয়েছিল। একটি সহজ সমাধান হ'ল সমস্যাটিকে নেস্টেড পাওয়ার সিরিজ হিসাবে তৈরি করা এবং এটি বিল্ট-ইন-এ প্রেরণ করাReduce ফাংশনে , যা সমীকরণের বিশ্লেষণাত্মক সমাধান চায়। ফলস্বরূপ, নিম্নলিখিতগুলি, অস্বাভাবিক সংক্ষিপ্ত কোড হওয়া ছাড়াও, নিষ্ঠুর প্রয়োগ নয়।

Reduce[Nest[Power[#, 1/x] &, a, b] == x, x, Reals]

আপনি যদি ধৈর্যশীল হন এবং ছয় বাইট সংরক্ষণ করতে চান তবে কেবলমাত্র রিয়েল নম্বর সমাধান সরবরাহের জন্য আপনি সীমাবদ্ধতা সরাতে পারেন। আরও কয়েকটি বাইট সংরক্ষণ করতে আপনি সংক্ষিপ্ত আকারে কিছু নেস্টেড ফাংশন প্রকাশ করতে পারেন। প্রদত্ত হিসাবে, এটি এভাবে ফিরে আসে

এখানে চিত্র বর্ণনা লিখুন


0

05 এ বি 1 ই , 16 বাইট

1[ÐU²FXm}¹@#5(°+

@ কিথরান্ডাল এর পাইথন উত্তরটির বন্দর ।

এটি অনলাইনে চেষ্টা করুন।

ব্যাখ্যা:

1                 # Push a 1
 [                # Start an infinite loop:
  Ð               #  Triplicate the top value on the stack
   U              #  Pop and store one in variable `X`
    ²F            #  Inner loop the second input amount of times:
      Xm          #   And take the top value to the power `X`
        }         #  After the inner loop:
         ¹@       #  If the resulting value is larger than or equal to the first input:
           #      #   Stop the infinite loop
                  #   (after which the top of the stack is output implicitly as result)
            5(°+  #  If not: increase the top value by 10^-5

ÐU²FXm}D²>и.»mএকই বাইট-কাউন্টের জন্যও হতে পারে :

  D               #   Duplicate the top value on the stack
   ²>             #   Push the second input + 1
     и            #   Repeat the top value that many times as list
                #   Reduce it by:
        m         #    Taking the power
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.