প্রদত্ত আকারের অ্যাবেলিয়ান গোষ্ঠী গণনা করা হচ্ছে


14

পটভূমি

গতবার, আমরা একটি নির্দিষ্ট আকারের গোষ্ঠীগুলি গণনা করেছি , যা একটি তুচ্ছ সমস্যা।

এবার, আমরা কেবল আবেলীয় গোষ্ঠীগুলি , অর্থাত্ একটি বহিরাগত অপারেশন সহ গোষ্ঠীগুলি গণনা করব । আনুষ্ঠানিকভাবে একটি দলের (জি, *) Abelian হলে এক্স * Y = Y * এক্স সব জন্য X, Y মধ্যে জি

এইভাবে সমস্যাটি আরও সহজ হয়ে যায়, তাই আমরা সেগুলি দক্ষতার সাথে গণনা করব।

কার্য

এমন একটি প্রোগ্রাম বা ফাংশন লিখুন যা একটি নে-নেতিবাচক পূর্ণসংখ্যা এনকে ইনপুট হিসাবে গ্রহণ করে এবং অর্ডার এন এর নন-আইসোমর্ফিক আবেলীয় গোষ্ঠীর সংখ্যা মুদ্রণ করে বা প্রদান করে ।

গোষ্ঠীর সংখ্যা গণনার একটি উপায় - যা আমরা এ (এন) দ্বারা চিহ্নিত করব - নিম্নলিখিতটি পর্যবেক্ষণ করে:

  • এ (0) = 0

  • যদি পি একটি মৌলিক হয়, এ (পৃঃ ) এর পূর্ণসংখ্যা বিভাজন সংখ্যা সমান । ( সিএফআরওইআইএস এ০০০০১১ )

  • যদি এন = এম কে , এবং মি এবং কে সহ-প্রধান হয়, এ (এন) = এ (এম) এ (কে)

আপনি এ (এন) গণনার জন্য এই বা অন্য কোনও পদ্ধতি ব্যবহার করতে পারেন ।

পরীক্ষার মামলা

Input               Output
0                   0
1                   1
2                   1
3                   1
4                   2
5                   1
6                   1
7                   1
8                   3
9                   2
10                  1
11                  1
12                  2
13                  1
14                  1
15                  1
16                  5
17                  1
18                  2
19                  1
20                  2
4611686018427387904 1300156
5587736968198167552 155232
9223371994482243049 2

( OEIS A000688 থেকে নেওয়া )

অতিরিক্ত বিধি

  • যথেষ্ট সময়, র‌্যাম এবং একটি নিবন্ধের আকার দেওয়া হয়েছে যা ইনপুট ধরে রাখতে পারে, আপনার কোডটি ইচ্ছামত বৃহত্তর পূর্ণসংখ্যার জন্য (তত্ত্ব অনুসারে) কাজ করা উচিত।

  • আপনার কোডটি 0 থেকে 2 63 - 1 এর মধ্যে সমস্ত পূর্ণসংখ্যার জন্য কাজ করতে হবে এবং আমার মেশিনে 10 মিনিটের মধ্যে শেষ করতে হবে (ইন্টেল i7-3770, 16 জিবি র‌্যাম, ফেডোরা 21)।

    আপনার উত্তর জমা দেওয়ার আগে শেষ তিনটি পরীক্ষার ক্ষেত্রে আপনার কোডটি সময় করে নিচ্ছেন তা দয়া করে নিশ্চিত করুন।

  • ম্যাথমেটিকার মতো এই কাজটিকে তুচ্ছ করে তোলে এমন বিল্ট-ইনগুলি FiniteAbelianGroupCountঅনুমোদিত নয়।

  • বিল্ট-ইনগুলি যে কোনও সংখ্যার পূর্ণসংখ্যা পার্টিশনগুলি বা তালিকার পার্টিশনগুলি ফিরিয়ে দেয় বা গণনা করে তা অনুমোদিত নয়।

  • স্ট্যান্ডার্ড বিধি প্রযোজ্য।


পাইথের প্রাইম ফ্যাক্টরীকরণ সিস্টেমটি এই চ্যালেঞ্জের জন্য খুব ধীর - আমার এটি ঠিক করা দরকার need
isaacg

উত্তর:


3

সিজেএম ( 39 38 বাইট)

qimF{~M\{_ee{~\)<1b}%1+a\+}*0=1be&}%:*

অনলাইন ডেমো

এটি একটি মৌলিক গুণক ( mF) নির্ধারণের প্রস্তাবিত রেখা অনুসরণ করে এবং তারপরে প্রতিটি পাওয়ারের পার্টিশন গণনা করে এবং তাদের পণ্য গ্রহণ করে taking

এর জন্য দুটি বিশেষ কেস রয়েছে mF: এটি 0যেমন 0^1এবং 1যেমন হিসাবে বিবেচনা করে 1^1। দ্বিতীয়টির জন্য বিশেষ চিকিত্সার প্রয়োজন নেই: আকারের 1 এর একটি আবেলিয়ান গ্রুপ এবং 1 এর একটি বিভাজন রয়েছে তবে শূন্যের জন্য একটি বিশেষ ক্ষেত্রে প্রয়োজন require

পার্টিশন কাউন্টিং জন্য একটি পুনরাবৃত্তি ব্যবহার A008284(n, k), এর পার্টিশন সংখ্যা nমধ্যে kঅংশ। ওইআইএস-তে এটি দেওয়া আছে

T(n, k) = Sum_{i=1..k} T(n-k, i), for 1<=k<=n-1; T(n, n) = 1 for n >= 1.

কিন্তু আমার মনে হয় এটা ছোটো থেকে যেমন সমষ্টি মনে করার আরো দরকারী 1করতে min(k, n-k)

ব্যবচ্ছেদ

q~              e# Parse input into an integer
mF              e# Factorise it
{               e# For each factor p^a
  ~             e#   Split the array [p a]
                e#   The following lines count partitions of a
                e#   (Note: they would be buggy if a were ever 0, but it isn't)
  M\{           e#   Starting with a table of zero rows, repeat a times
    _ee         e#     Copy table and pair each row with its index
    {~\)<1b}%   e#     Extract that prepended index and use it to sum for each j
                e#     the first jth items of row j
    1+          e#     Append a 1 for P(i, i)
    a\+         e#     Prepend the new row to the table (which is stored in reverse)
  }*
  0=1b          e#   Sum the elements in the latest (first) row

  e&            e#   If p was 0 then replace with 0
}%
:*              e# Take the product

5

সিজেম, 50 49 47 43 বাইট

ri_mF{1=_L{1$0>{,f{):X-Xj}:+}{;!}?}2j}%:*e&

সিজামের বিল্টিন mFফ্যাক্টরিয়েশন এবং এই পাইথন পার্টিশন নম্বর ফাংশনের একটি স্মৃতিযুক্ত বন্দর ব্যবহার করুন:

p=lambda n,x:n==0 or n>0and sum(p(n+~a,a+1)for a in range(x))

বা অবরুদ্ধ:

def p(n, x): # Call like p(n, n). n is number remaining, x is max part size
  if n > 0:
    return sum(p(n-a-1,a+1)for a in range(x))
  else:
    return (n==0)

@ রেটোকোরাদির উত্তরের মতো, শেষ কেসটি অফলাইন ইন্টারপ্রেটারে প্রায় 17 সেকেন্ড সময় নেয় কারণ এই সংখ্যাটি ফ্যাক্ট করতে সিজেএমকে কত সময় লাগে। অতএব আমি এই অনলাইন পরীক্ষার স্যুটটি ছেড়ে দিয়েছি ।

সম্পূর্ণ ব্যাখ্যা

[Main body]
ri                                Read input and convert to int
  _          e&                   Logical AND input with final result to special case 0 
   mF                             Factorise input into [base, exponent] pairs
     {...}%                       Map, converting each pair to a partition number
           :*                     Take product

[Pair -> partition]
1=_                               Get exponent and copy (n,x in above Python)
   L                              Initialise empty cache
    {                       }2j   Memoise with 2 arguments
     1$0>                         Check if n > 0
         {            }{  }?      Execute first block if yes, else second block
                        ;!        Return (n == 0)
          ,f{      }              For each a in range(x) ...
             ):X-Xj               Call p(n-a-1,a+1) recursively
                    :+            Sum the results

4

গণিত, 96 94 88 বাইট

f=1##&@@#&;f[SeriesCoefficient[1/f[1-x^Range@#],{x,0,#}]&/@Last/@FactorInteger@#]Sign@#&

আমি ম্যাথামেটিকায় তেমন দক্ষ নই, তবে আমি ভেবেছিলাম এটি চেষ্টা করে দেখি। -২ বাইটের জন্য @ মার্টিনব্যাটনারকে ধন্যবাদ।

এটি পূর্ণসংখ্যা পার্টিশনের জন্য উত্পন্ন ফাংশন সূত্র ব্যবহার করে।


3

সিজেম, 58 বাইট

li_mF{1=_L{_1>{_2$<{\;_j}{\,f{)_@\-j}:+}?}{;;1}?}2j}%:*\g*

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

একেবারে শেষ পরীক্ষার উদাহরণটি অনলাইন ইন্টারপ্রেটারে চিরকাল (অথবা আমি অপেক্ষা করতে ইচ্ছুক চেয়ে কমপক্ষে বেশি) সময় নেয় তবে আমার ল্যাপটপে সিজেমের অফলাইন সংস্করণটি দিয়ে 17 সেকেন্ডের মধ্যে শেষ হয়। অন্যান্য সমস্ত পরীক্ষার উদাহরণগুলি বেশ তাত্ক্ষণিক।

এটি সিজেএম mFঅপারেটর ব্যবহার করে , যা এক্সপোশনগুলির সাথে প্রধান ফ্যাক্টরিয়েশন দেয়। ফলস্বরূপ প্রতিটি বিভাজনের জন্য পার্টিশনের গুণনীয়ক ফলাফল।

কোডের মূল অংশটি পার্টিশন গণনা গণনা করা হয়। আমি উইকিপিডিয়া পৃষ্ঠায় পুনরাবৃত্তির অ্যালগরিদম প্রয়োগ করেছি , jস্মারকের সাথে পুনরাবৃত্তি সমর্থন করে এমন অপারেটর ব্যবহার করে।

ব্যাখ্যা:

li    Get input and convert to int.
_     Make a copy to handle 0 special case at the end.
mF    Factorization with exponents.
{     Loop over factors.
  1=    Take exponent from [factor exponent] pair.
  _     Repeat it, recursive calls are initiated with p(n, n).
  L     Empty list as start point of memoization state.
  {     Start recursive block. Argument order is (m, n), opposite of Wikipedia.
    _1>   Check for n > 1.
    {     Start n > 1 case.
      _2$   Copy both m and n.
      <     Check for n < m.
      {     n < m case.
        \;    Pop m.
        _     Copy n.
        j     Make the p(n, n) recursive call.
      }     End n < m case.
      {     Main part of algorithm that makes recursive calls in loop.
        \,    Generate [0 1 ... m-1] range for k.
        f{    Start loop over k.
          )     Increment, since k goes from 1 to m.
          _     Copy k.
          @\    Rotate n to top, and swap. Now have k n k at top of stack.
          -     Subtract, now have k n-k at top of stack.
          j     Make the p(n-k, k) recursive call.
        }     End loop over k.
        :+    Sum up all the values.
      }?    Ternaray operator for n < m condition.
    }     End n > 1 case.
    {     n <= 1 case.
      ;;1   Pop m, n values, and produce 1 as result.
    }?    Ternary operator for n > 1 condition.
  }2j   Recursive call with memoization, using 2 values.
}%    End loop over factors.
:*    Multiply all values.
\     Swap original input to top.
g     Signum.
*     Multiply to get 0 output for 0 input.
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.