ফিবোনাচি ফ্যাক্টরাইজেশন


21

ফিবোনাচি নাম্বার

ফিবানচি নাম্বার দিয়ে শুরু f(1) = 1এবং f(2) = 1(কিছু অন্তর্ভুক্ত f(0) = 0কিন্তু এই এই প্রতিদ্বন্দ্বিতা গ্রহণ অপ্রাসঙ্গিক। এরপর জন্য n > 2, f(n) = f(n-1) + f(n-2)

চ্যালেঞ্জ

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

এছাড়াও, আপনার উত্তরটি অবশ্যই একটি উপযুক্ত সময়ে 100 ম পদটি গণনা করতে হবে।

Testcases

n   result corresponding product (for reference)
1   1      1
2   2      2
3   3      3
4   4      2*2
5   5      5
6   6      2*3
7   8      2*2*2 or 8
8   9      3*3
9   10     2*5
10  12     2*2*3
11  13     13
12  15     3*5
13  16     2*2*2*2 or 2*8
14  18     2*3*3
15  20     2*2*5
16  21     21
17  24     2*2*2*3 or 3*8
18  25     5*5
19  26     2*13
20  27     3*3*3
100 315    3*5*21

তথ্যসূত্র


পরীক্ষার ক্ষেত্রে কেন তাদের মধ্যে কয়েকটি এন = ফলাফল, যখন 7 এবং তার বেশি তারা সমান নয়। প্রশ্ন আমি বুঝতে পারছি না। তবে আমি কেবল যাচাই করতে চাই
জর্জ

1
7ফিবোনাচি সংখ্যার পণ্য হিসাবে প্রকাশ করা যায় না। অতএব, 1স্ট্যান্ড প্রয়োজনীয় নম্বরটি হল 1, 2এনডি হয় 2, ..., 6তমটি হয় 6তবে 7মঞ্চটি হয় 8
ফাঁস নুন

আহ অবশ্যই, তা বোঝায়
জর্জে

আপনি একটি সংখ্যা তৈরি করার সমস্ত উপায় মুদ্রণ করা উচিত। উদাহরণস্বরূপ 16 টির দুটি উপায় আছে, বা আপনি কেবল একটি আউটপুট দিতে পারেন?
জর্জি

3
@ জর্জি আমি বিশ্বাস করি "" corresponding product"কেবল স্পষ্টতার জন্য। আপনার কোডটি কেবলমাত্র " result" আউটপুট দেওয়ার প্রয়োজন ।
ট্রাইকোপলাক্স

উত্তর:


6

জেলি , 26 24 23 21 বাইট

ÆDf÷߀FðḊ¡
1ç#2+С1¤Ṫ

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

কিভাবে এটা কাজ করে

1ç#2+С1¤Ṫ  Main link. Argument: n (integer)

        ¤   Combine the three links to the left into a niladic chain.
   2          Set the left argument and the return value to 2 (third positive
              Fibonacci number).
       1      Yield 1 (second positive Fibonacci number).
    +С       Compute the sum of the return value and right argument, replacing the
              return value with the sum and the right argument with the previous
              return value.
              Do this n times, collecting all return values in a list.
              This returns A, the first n Fibonacci numbers greater than 1.
1             Set the return value to 1.
 ç#           Call the helper link with left argument k = 1, 2, 3... and right
              argument A = [2, 3, 5...] until n of them return a truthy value.
              Collect the matches in a list.
           Ṫ  Tail; extract the last (n-th) match.


ÆDf÷߀FðḊ¡    Helper link. Left argument: k. Right argument: A

        Ḋ     Dequeue; yield r := [2, ..., k].
       ð ¡    If r in non-empty, execute the chain to the left. Return k otherwise.
ÆD              Yield the positive divisors of k.
   ÷            Divide k by all Fibonacci numbers in A.
  f             Filter; keep divisors that belong to k÷A, i.e., all divisors
                d for which k÷d belongs to A.
    ߀          Recursively call the helper link for each kept divisor d, with left
                argument d and right argument A.
      F         Flatten the result, yielding a non-empty array iff any of the
                recursive calls yielded a non-empty array or a number.
                If the left argument is 1, the helper link returns 1, so the
                array will be non-empty if the consecutive divisions by Fibonacci
                numbers eventually produced a 1.

2
ইনপুটটির বিচারে এই অ্যালগরিদমের জটিলতা কী?
লিকি নুন

যে কোনও ক্ষেত্রে, এটি খুব দ্রুত! 100-তম মেয়াদের জন্য 2 সেকেন্ডেরও কম
লুইস মেন্ডো

@ লিক্যুনুন কীভাবে এটি গণনা করতে হবে তা সম্পর্কে আমার কোনও ধারণা নেই তবে 400 ইনপুট কীভাবে ইনপুট 100 এর চেয়ে 32 গুণ বেশি সময় নেয় তা আমি বলি এটি ক্ষতিকারক। যদিও সহজেই 100 পরিচালনা করে।
ডেনিস

1
ঠিক আছে, আপনার অ্যালগরিদম কী তা কেবল আপনিই জানেন ...
লিকি নুন

আমি প্রতিটি পরীক্ষিত সংখ্যার জন্য ফিবোনাচি ক্রমটি পুনরায় গণনা না করে এটিকে আরও দ্রুত করতে পরিচালিত করেছি। গল্ফ করা শেষ হওয়ার সাথে সাথে আমি একটি ব্যাখ্যা যুক্ত করব।
ডেনিস

5

জুলিয়া, 79 বাইট

!k=any(i->√(5i^2+[4,-4])%1k%i<!(k÷i),2:k)^~-k
<|(n,k=1)=n>0?n-!k<|-~k:~-k

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

পটভূমি

ইন অ্যাডভান্সড সমস্যা ও সমাধান, এইচ-187: ফিবানচি একটি বর্গক্ষেত্র হয় , প্রস্তাবকারী অনুষ্ঠান

ফিবোনাচি / লুকাস পরিচয়

যেখানে এল এন n লুকাশাসমূহকে বোঝায় এবং বিপরীতভাবে - যদি

কথোপকথন ফিবোনাচি / লুকাস পরিচয়

তারপরে এন একটি ফিবোনাচি নম্বর এবং মি হ'ল লুকাস নম্বর।

কিভাবে এটা কাজ করে

আমরা <|আমাদের উদ্দেশ্যে বাইনারি অপারেটরকে সংজ্ঞায়িত করি । এটি জুলিয়ার সাম্প্রতিক সংস্করণগুলিতে অপরিবর্তিত রয়েছে, তবে এখনও পার্সার দ্বারা অপারেটর হিসাবে স্বীকৃত।

যখন কেবল একটি যুক্তি ( এন ) দিয়ে ডাকা হয়, তখন কে কে 1 হিসাবে <|আরম্ভ করে । এন ইতিবাচক হলেও , এটি কে কে বিয়োগ করে ! কে ( 1 যদি কে ফাইবোনাচি সংখ্যাগুলির একটি পণ্য, 0 যদি না হয় তবে) এন থেকে এবং পুনরাবৃত্তভাবে নিজেকে কল করে, কে 1 দ্বারা বৃদ্ধি করে । এন একবার 0 এ পৌঁছানোর পরে পণ্যগুলির কাঙ্ক্ষিত পরিমাণ সন্ধান করা হয়েছে, সুতরাং কে এর পূর্ববর্তী মানটি প্রদান করে , অর্থাৎ, ~ -k = k - 1<|

ফিনোনাচি !নম্বর পণ্যগুলির পরীক্ষা হিসাবে পুনরায় সংজ্ঞায়িত অ্যানারি অপারেটর নিম্নরূপে তার কার্য সম্পাদন করে।

  • যদি কে = 1 , কে ফিবোনাচি সংখ্যাগুলির একটি পণ্য। এই ক্ষেত্রে, আমরা ফেরত মান বাড়াতে any(...)ক্ষমতায় ~ -k = ট - 1 = 0 , তাই ফল কী হবে 1

  • তাহলে ট> 1 , ফলে এর মান হতে হবে any(....), যা ফিরে আসবে সত্য যদি এবং কেবল যদি সম্পৃক্ত √(5i^2+[4,-4])%1∋k%i<!(k÷i)আয় সত্য কিছু পূর্ণসংখ্যা জন্য আমি যেমন যে 2 ≤ আমি k ≤

    ভবিষ্যদ্বাণীতে k%iজড়িত শর্তগুলি যদি এর সাথে সম্পর্কিত হয় √(5i^2+[4,-4])%1এবং এর k%iচেয়ে কম হয় !(k÷i)

    • √(5i^2+[4,-4])%15i 2 + 4 এবং 5i 2 - 4 এর বর্গমূল গ্রহণ করে এবং তাদের অবশিষ্টাংশগুলি মডুলো 1 গণনা করে । প্রতিটি সংখ্যার মান 0 হয় যদি সংশ্লিষ্ট নম্বরটি একটি নিখুঁত বর্গ হয় এবং অন্যথায় 1 এর চেয়ে কম ধনাত্মক সংখ্যা হয় ।

      যেহেতু k%iএকটি পূর্ণসংখ্যা ফেরত দেয়, এটি কেবল মডুলির অ্যারের সাথে সম্পর্কিত হতে পারে যদি কে% i = 0 (অর্থাত্, কে i দিয়ে বিভাজ্য হয় ) এবং কমপক্ষে 5i 2 + 4 এবং 5i 2 - 4 এর মধ্যে একটি সঠিক স্কোয়ার হয় (যেমন, আমি একটি ফিবোনাচি নম্বর)।

    • !(k÷i)পুনরাবৃত্তভাবে আর্গুমেন্ট কে ÷ i (পূর্ণসংখ্যা বিভাগ) সহ 1 টি কল করে , এটি 0 এর চেয়ে বেশি হবে যদি এবং কেবলমাত্র যদি k ÷ i ফিবোনাচি সংখ্যার পণ্য হয়।

প্রবর্তন দ্বারা ,! পছন্দসই সম্পত্তি আছে।


5

পাইথন, 90 বাইট

f=lambda n,a=2,b=3:n<2or n%a<f(n/a)or n-a>0<f(n,b,a+b)
g=lambda k,n=1:k and-~g(k-f(n),n+1)

প্রধান ফাংশনটি 1-ইনডেক্সযুক্ত ফিবোনাচি পণ্যটিকে gআউটপুট করে k। এটা তোলে নির্ণয় g(100)যেমন 315প্রায় অবিলম্বে। এটি ফাংশনটি সন্তুষ্ট করে এমন উদাহরণগুলির nসন্ধান করে সংখ্যা গণনা করার একটি সাধারণ পুনরাবৃত্তির রেসিপি দিয়ে যায় । এটি পৌঁছানোর আগ পর্যন্ত এ জাতীয় প্রতিটি উদাহরণ প্রয়োজনীয় গণনা কমিয়ে দেয় ।kfk0

সহায়ক ফাংশন fএকটি ফিবোনাচি পণ্য হওয়ার জন্য একটি নম্বর পরীক্ষা করে। এটি পুনরাবৃত্তভাবে তার alচ্ছিক আর্গুমেন্টগুলিতে aএবং ফিবোনাচি সংখ্যাগুলি উত্পন্ন করে b। নিম্নলিখিতগুলির মধ্যে কোনওটি সত্য হলে এটি "হ্যাঁ" আউটপুট দেয়:

  • n<2। এটি বোঝায় n==1, তুচ্ছ পণ্য)
  • n%a<f(n/a)। এটি প্রয়োজন n%a==0এবং f(n/a)==True, অর্থাত্ nএটি ফিবোনাচি সংখ্যার একাধিক a, এবং aএখনও এই ফিবোনাকির পণ্য উত্পন্ন করার ফ্যাক্টরটি সরিয়ে ফেলতে ।
  • n-a>0<f(n,b,a+b)সমতুল্য n>a and f(n,b,a+b)। বর্তমান ফিবোনাচি নম্বর পরীক্ষা করা হচ্ছে তা যাচাই করে তা কমপক্ষে নয় nএবং আরও কিছু বড় ফিবোনাচি নম্বর কাজ করে। এর পরিবর্তে অসমতার শর্ট সার্কিট ব্যবহার করে 2 টি সঞ্চয়ী বাইটের জন্য ডেনিসকে ধন্যবাদ জানাই and

ফাংশনটি gএক বাইট হিসাবে খাটো হতে পারে

lambda k:filter(f,range(k*k+1))[k]

যদি g(k)সর্বদা সর্বাধিক হয় k*k, যা আমি নিশ্চিত নই যে তাত্পর্যপূর্ণ সত্য। পর্যাপ্ত পরিমাণে আবদ্ধ 2**k, তবে তারপরে g(100)খুব বেশি সময় লাগে। এর পরিবর্তে এর পুনরাবৃত্তির gকাজটি করা যেতে পারে f


ওআইআইএস-এ এই সারণী অনুসারে , কখন এবং তার g(k)চেয়েও বেশি হবে । k*kk = 47000
isaacg

2

পার্ল 6 ,  95  93 বাইট

{(1..*).grep({$/=$_;map {->{$/%$_||($//=$_);$/}...*!%%$_;0},reverse 2,3,&[+]...*>$_;2>$/})[$_]}
{(1..*).grep({$/=$_;map {->{$/%$_||($//=$_);$/}...*%$_;0},reverse 2,3,&[+]...*>$_;2>$/})[$_]}

(0 ভিত্তিক সূচক)

টেস্ট:

my &fib-prod = {(1..*).grep({$/=$_;map {->{$/%$_||($//=$_);$/}...*%$_;0},reverse 2,3,&[+]...*>$_;2>$/})[$_]}

say fib-prod 0 ..^ 20;
# (1 2 3 4 5 6 8 9 10 12 13 15 16 18 20 21 24 25 26 27)
say time-this { say fib-prod 100 -1; };
# 315
# 1.05135779

sub time-this (&code) {
  my $start = now;
  code();
  now - $start;
}

ব্যাখ্যা:

{
  (1..*).grep(
    {
      $/ = $_; # copy the input ($_) to $/
      map { # map used just for side effect
        ->{
          $/ % $_    # if $/ is divisible by the current fib factor
        ||
          ($/ /= $_) # divide it out once
        ;
          # return the current value in $/
          $/
        }
        ... # repeat until that returns:
        * !%% $_ # something that is not divisible by the current fib factor
        ;0
      },
      # the possible fibonacci factors plus one, reversed
      # ( the extra is to save one byte )
      reverse 2,3,&[+] ... *>$_;

      # is the end result of factoring equal to 1
      # ( for the grep above )
      2 > $/
    }
  )[ $_ ] # get the value at 0-based index
}

2

পাইথন 3, 175 170 148 বাইট

-২২ বাইটের জন্য @ ডেনিসকে ধন্যবাদ

j=x=int(input())
y=1,1
exec('y+=y[-2]+y[-1],;'*x)
i=c=0
while c<x:
    if j>=x:j=0;i+=1;t=i
    if t%y[~j]<1:t/=y[~j];j-=1
    if t<2:c+=1;j=x
    j+=1
print(i)

STDIN থেকে ইনপুট নেয় এবং STDOUT এ মুদ্রণ করে। এটি এক-সূচকযুক্ত। ১০০ তম শব্দটি গণনা করতে প্রায় এক সেকেন্ডের দশমাংশ সময় লাগে।

কিভাবে এটা কাজ করে

j=x=int(input())                Get term number x from STDIN and set Fibonacci number index
                                j to x to force initialisation of j later 
y=1,1                           Initialise tuple y with start values for Fibonacci sequence
exec('y+=y[-2]+y[-1],;'*x)      Compute the Fibonacci sequence to x terms and store in y
i=c=0                           Initialise test number i and term counter c
while c<x:                      Loop until x th term is calculated
    if j>=x:j=0;i+=1;t=i        Initialise Fibonacci number index j, increment i and
                                initialise temp variable t for looping through all j for
                                some i. Executes during the first pass of the loop since
                                at this point, j=x
    if t%y[~j]<1:t/=y[~j];j-=1  Find t mod the j th largest Fibonacci number in y and if no
                                remainder, update t by dividing by this number.
                                Decrementing j means that after a later increment, no
                                change to j occurs, allowing for numbers that are 
                                divisible by the same Fibonacci number more than once by
                                testing again with the same j
    if t<2:c+=1;j=x             If repeated division by ever-smaller Fibonacci numbers
                                leaves 1, i must be a Fibonacci product and c is
                                incremented. Setting j equal to x causes j to be reset
                                to 0 during the next loop execution
    j+=1                        Increment j
print(i)                        i must now be the x th Fibonacci product. Print i to STDOUT

আইডিয়নে চেষ্টা করে দেখুন


2

পাইথন 2, 120 107 বাইট

g=lambda k:1/k+any(k%i==0<g(k/i)for i in F)
F=2,3;k=0;n=input()
while n:F+=F[k]+F[-1],;k+=1;n-=g(k)
print k

আইডিয়নে এটি পরীক্ষা করুন ।

কিভাবে এটা কাজ করে

আমরা আরম্ভ এফ tuple যেমন (2, 3) (প্রথম দুই ফিবানচি সংখ্যা তার চেয়ে অনেক বেশী 1 ), যেমন 0 এবং এন একটি পূর্ণসংখ্যা হিসাবে stdin থেকে পড়া।

এন ইতিবাচক হলেও আমরা নিম্নলিখিতটি করি:

  • F [k] + F [-1] হিসাবে গণনা করা পরবর্তী ফিবোনাচি সংখ্যাটি যুক্ত করুন, অর্থাত্, টিউপল এফের সাথে F এর শেষ দুটি উপাদানগুলির যোগফল ।

  • বৃদ্ধি কে

  • N থেকে g (কে) বিয়োগ করুন ।

ফেরৎ 1 যদি এবং কেবল যদি ফিবানচি সংখ্যার একটি পণ্য, তাই একবার হয় এন ছুঁয়েছে 0 , হয় এন ফিবানচি নম্বর এবং আমরা stdout- এ এটা মুদ্রণ।

g নিম্নলিখিতভাবে তার উদ্দেশ্য অর্জন করে।

  • তাহলে হয় 1 , এটা ফিবানচি সংখ্যার একটি পণ্য, এবং 1/kনিশ্চিত আমরা ফিরে তোলে 1

  • তাহলে চেয়ে বেশী 1 , আমরা কল g(k/i)সব ফিবানচি সংখ্যার জন্য যাও recursively আমিএফ

    g(k/i)K / i একটি ফিবোনাকি নম্বর পণ্য হলে পুনরাবৃত্তভাবে পরীক্ষা করে । তাহলে g(k/i)আয় 1 এবং আমি ভাগ k সমানভাবে, ট% i = 0 এবং শর্ত k%i<g(k/i)ঝুলিতে, তাই গ্রাম ফিরে আসবে 1 যদি এবং কেবল যদি একটা ফিবানচি সংখ্যা যেমন যে গুণফল যে ফিবানচি নম্বর এবং ফিবানচি সংখ্যার অন্য পণ্য।


1

জাভাস্ক্রিপ্ট (ES6), 136

বেশ ধীর গতিতে এইভাবে গল্ফ করেছে, আমার পিসিতে প্রায় 8 সেকেন্ডের মধ্যে 100 টি কম্পিউটারের পরিভাষা।

(n,F=i=>i>1?F(i-1)+F(i-2):i+1,K=(n,i=1,d,x)=>eval('for(;(d=F(i++))<=n&&!(x=!(n%d)&&K(n/d)););x||n<2'))=>eval('for(a=0;n;)K(++a)&&--n;a')

কম গল্ফড এবং দ্রুত (এড়ানো eval)

n=>{
  F=i=> i>1 ? F(i-1)+F(i-2) : i+1; // recursive calc Fibonacci number
  K=(n,i=1,d,x)=>{ // recursive check divisibility
    for(; (d=F(i++))<=n && !(x=!(n%d)&&K(n/d)); );
    return x||n<2
  };
  for(a=0; n; )
    K(++a) && --n;
  return a
}

পরীক্ষা

X=(n,F=i=>i>1?F(i-1)+F(i-2):i+1,K=(n,i=1,d,x)=>eval('for(;(d=F(i++))<=n&&!(x=!(n%d)&&K(n/d)););x||n<2'))=>eval('for(a=0;n;)K(++a)&&--n;a')

function test() {
  var i=+I.value
  O.textContent=X(i)
}

test()
<input id=I value=100 >
<button onclick="test()">Go</button><pre id=O></pre>


1

হাস্কেল, 123 বাইট

f=2:scanl(+)3f
m((a:b):c)=a:m(b?(a#c))
v#((a:b):c)|v==a=b?(v#c)
_#l=l
y?(z:e)|y>z=z:y?e
a?b=a:b
l=1:m[[a*b|b<-l]|a<-f]
(l!!)

খুব অলস, অনেক অসীম!

সংক্ষিপ্ত আকারে সম্ভবত নয়, তবে আমাকে এই পদ্ধতির চেষ্টা করতে হয়েছিল, হ্যামিং সংখ্যার তালিকার গণনা করার জন্য বেশ পরিচিত পদ্ধতির একটি সাধারণীকরণ। f2 থেকে শুরু হওয়া ফিবোনাচি সংখ্যার তালিকা bre বংশবৃদ্ধির জন্য, ধরা যাক যে একটি লল (তালিকার তালিকা) তাদের প্রথম উপাদানগুলির দ্বারা অর্ডার করা আদেশযুক্ত অসীম তালিকার একটি অসীম তালিকা। mডুপ্লিকেটগুলি সরিয়ে লোলকে মার্জ করার জন্য একটি ফাংশন। এটি দুটি ইনফিক্স সহায়ক ফাংশন ব্যবহার করে। ?একটি লোল মধ্যে একটি অসীম বাছাই তালিকা সন্নিবেশ করান। #একটি তোমার যে প্রথম তালিকা প্রধান হিসেবে প্রদর্শিত হতে পারে, সঙ্গে অবশিষ্ট তালিকা ঢোকান থেকে একটি মান সরিয়ে ফেলা হবে ?

সবশেষে, lসংখ্যার তালিকা যা ফাইবোনাকি সংখ্যাগুলির পণ্য, এটি 1 হিসাবে সংজ্ঞায়িত হয় ফাইবোনাকির সংখ্যার lসাথে গুণ দ্বারা প্রাপ্ত সমস্ত তালিকার একত্রীকরণের পরে । শেষ লাইনটি প্রয়োজনীয় ফাংশনটি উল্লেখ করে (যথাযথভাবে কোনও নামকে আবদ্ধ না করে, সুতরাং এটি যেমন অনুলিপি না করে) !!তালিকায় সূচী ব্যবহার করে , যা ফাংশনটি 0-সূচিযুক্ত করে তোলে।

100 ম বা 100,000 তম সংখ্যাটি গণনা করতে কোনও সমস্যা নেই।


1

হুশ , 13 বাইট

লক্ষ করুন যে হুস্ক এই চ্যালেঞ্জের চেয়ে নতুন। তবে এটি এবং এই গল্ফের জন্য সবচেয়ে কার্যকর ফাংশন ( Ξ) এই চ্যালেঞ্জটি মাথায় রেখে তৈরি করা হয়নি।

S!!Ṡ¡ȯuΞIṪ*İf

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

14 বাইটের জন্য আরও কার্যকর সংস্করণ:

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


0

পাইথন 2, 129 128 125 123 121 বাইট

g=lambda k:1/k|any(abs(round(5**.5*i)**2-5*i*i)==4>k%i<g(k/i)for i in range(k+1))
f=lambda n,k=1:n and f(n-g(k),k+1)or~-k

আইডিয়নে এটি পরীক্ষা করুন ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.