সাইক্লোটমিক পলিনোমিয়াল


17

পটভূমি (সংজ্ঞাগুলিতে যান)

ইউরর জটিল সংখ্যা সম্পর্কে একটি সুন্দর উপপাদ্য প্রমাণ করেছেন: e ix = cos (x) + i sin (x)।

এটি ডি মাইভেরের উপপাদ্যকে প্রমাণ করা সহজ করে তোলে:

(ই ix ) n = ই i (এনএক্স)

(কোস (এক্স) + আই পাপ (এক্স)) এন = কোস (এনএক্স) + আই পাপ (এনএক্স)

আমরা দ্বি-মাত্রিক ইউক্লিডিয়ান বিমানটি ব্যবহার করে জটিল সংখ্যাগুলি প্লট করতে পারি, অনুভূমিক অক্ষটি আসল অংশ এবং উল্লম্ব অক্ষকে কাল্পনিক অংশকে উপস্থাপন করে। এইভাবে, (3,4) জটিল নম্বর 3 + 4i এর সাথে মিল রাখে।

আপনি যদি পোলার স্থানাঙ্কের সাথে পরিচিত হন, (3,4) পোলার স্থানাঙ্কগুলিতে (5, আর্টিকান (4/3)) হবে। প্রথম সংখ্যা, আর, হ'ল মূল থেকে বিন্দুর দূরত্ব; দ্বিতীয় সংখ্যা, θ, কোণটি ধনাত্মক এক্স-অক্ষ থেকে বিন্দুতে, ঘড়ির কাঁটার বিপরীতে পরিমাপ করা হয়। ফলস্বরূপ, 3 = r cosθ এবং 4 = r sinθ θ অতএব, আমরা 3 + + 4I যেমন দ cosθ + + RI sinθ = আর (cosθ + I sinθ) লিখতে পারেন = পুনরায়

আসুন জটিল সমীকরণ z n = 1 সমাধান করুন , যেখানে এনটি ধনাত্মক পূর্ণসংখ্যা।

আমরা z- র = পুনরায় দিন । তারপর, z- র এন = দ Ninθ । উত্স থেকে z n এর দূরত্বটি r n , এবং কোণটি nθ θ তবে, আমরা জানি যে উত্স থেকে 1 এর দূরত্ব 1 এবং কোণ 0 হয়। সুতরাং, r n = 1 এবং nθ = 0। তবে, আপনি যদি আরও 2 by ঘোরান, আপনি এখনও একই পয়েন্টে শেষ করেন, কারণ 2π কেবল একটি সম্পূর্ণ বৃত্ত। সুতরাং, r = 1 এবং nθ = 2kπ, আমাদের z = e 2ikπ / n দিচ্ছেন

আমরা আমাদের আবিষ্কারটি পুনরুদ্ধার করি : z n = 1 এর সমাধানগুলি হল z = e 2ikπ / n

একটি বহুভুজ এর শিকড় বিবেচনা করা যেতে পারে। উদাহরণস্বরূপ, x 2 -3x + 2 এর শিকড় 1 এবং 2, সুতরাং x 2 -3x + 2 = (x-1) (x-2)। একইভাবে, উপরে আমাদের আবিষ্কার থেকে:

তবে, সেই পণ্যটিতে অবশ্যই অন্যান্য এন এর শিকড় রয়েছে। উদাহরণস্বরূপ, এন = 8 নিন। Z 4 = 1 এর শিকড়গুলি z 8 = 1 এর শিকড়গুলির মধ্যেও অন্তর্ভুক্ত হবে , যেহেতু z 4 = 1 বোঝায় z 8 = (z 4 ) 2 = 1 2 = 1. উদাহরণ হিসাবে এন = 6 কে নিন। যদি z 2 = 1 হয়, তবে আমাদের কাছে z 6 = 1ও থাকবে। তেমনিভাবে, z 3 = 1 হলে z 6 = 1 হয়।

যদি আমরা z n = 1 এর সাথে আলাদা আলাদা শিকড়গুলি বের করতে চাই তবে আমাদেরকে 1 এবং ব্যতীত কোনও সাধারণ বিভাজক ভাগ করার জন্য k এবং n প্রয়োজন হবে Or / ডি) -জেড এন / ডি = 1 এর মূল। এর শিকড়গুলির ক্ষেত্রে বহুবচনটি লিখতে উপরের কৌশলটি ব্যবহার করে আমরা বহুপদী প্রাপ্তি:

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

Z n = 1 এর শিকড়গুলির ব্যাসার্ধ 1 থাকে তাই তারা একটি বৃত্ত তৈরি করে। বহুপদীটি বৃত্তের পয়েন্টগুলি প্রতিনিধিত্ব করে এন থেকে আলাদা, সুতরাং এক অর্থে বহুবচনগুলি বৃত্তের একটি বিভাজন গঠন করে। অতএব, উপরোক্ত বহুপদীটি হ'ল এন-থ সাইক্লোটমিক পলিনোমিয়াল। (সাইক্লো- = সার্কেল; টম- = কাটা)

সংজ্ঞা ১

এন-তম সাইক্লোটমিক পলিনোমিয়াল, নির্দেশিত , পূর্ণসংখ্য সহগের সাথে অনন্য বহুভুজ যা এক্স এন -1 বিভক্ত করে তবে কে <এন এর জন্য এক্স কে -1 নয় ।

সংজ্ঞা 2

সাইক্লোটমিক পলিনোমিয়ালগুলি বহুবচনগুলির একটি সেট, প্রতিটি ধনাত্মক পূর্ণসংখ্যার জন্য একটি, যেমন:

যেখানে কে | n এর অর্থ কে বিভাজক n।

সংজ্ঞা 3

N-th সাইক্লোটমিক পলিনোমিয়াল হ'ল বহুপদী x x- n -1 বহুলোকের LCM দ্বারা বিভাজিত x কে -1 রূপে যেখানে k বিভক্ত হয় এন এবং কে <এন।

উদাহরণ

  1. Φ 1 (x) = x - 1
  2. Φ 2 (x) = x + 1
  3. Φ 3 (x) = x 2 + x + 1
  4. Φ 30 (x) = x 8 + x 7 - x 5 - x 4 - x 3 + x + 1
  5. Φ 105 (x) = x 48 + x 47 + x 46 - x 43 - x 42 - 2x 41 - এক্স 40 - এক্স 39 + এক্স 36 + এক্স 35 + এক্স 34 + এক্স 33 + এক্স 32 + এক্স 31 - এক্স 28 - এক্স 26 - এক্স 24 - এক্স 22 - এক্স 20 + এক্স 17 + এক্স 16 + এক্স 15 + এক্স 14 + এক্স 13 + এক্স 12 - এক্স9 - এক্স 8 - 2 এক্স 7 - এক্স 6 - এক্স 5 + এক্স 2 + এক্স + 1

কার্য

ধনাত্মক পূর্ণসংখ্যা দেওয়া n, nযুক্তিসঙ্গত বিন্যাসে (যেমন সহগের তালিকা অনুমোদিত) এর উপরে উল্লিখিত হিসাবে চতুর্থ সাইক্লোটমিক পলিনোমিয়ালটি ফিরিয়ে দিন ।

বিধি

আপনি যতক্ষণ না ভাসমান পয়েন্ট / জটিল সংখ্যাগুলি যথাযথ মান হিসাবে গোল করতে পারেন ততক্ষণ ফিরতে পারেন।

স্কোরিং

এটি । বাইট জিতে সংক্ষিপ্ত উত্তর।

তথ্যসূত্র


1
পরীক্ষা হিসাবে 105 যোগ করতে পারেন?
জোনাথন অ্যালান

@ জোনাথন অ্যালান আমি ৪৮ টি শর্ত টাইপ করতে চাই না
লিক নুন

1
ভাসমান-পয়েন্টের ভুল ব্যবহারের অনুমতি রয়েছে?
মাইল

3
@ মাইলগুলি আমি আবেগের সাথে ভাসা ঘৃণা করি> <<তবে আমি আপনার মৃত্যুর পক্ষে ভাসা ব্যবহারের অধিকারকে রক্ষা করব।
লিকি নুন

1
নিকটতম পূর্ণসংখ্যার / গাউসিয়ান পূর্ণসংখ্যকে গোল করে যখন আমরা সঠিক উত্তর প্রদান করি ততক্ষণ জটিল জটিল ভাসমান পয়েন্ট সংখ্যা আউটপুট করতে পারি?
fireflame241

উত্তর:


12

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

import Data.Complex
p%a=zipWith(\x y->x-a*y)(p++[0])$0:p
f n=foldl(%)[1][cis(2*pi/fromInteger n)^^k|k<-[1..n],gcd n k<2]

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

জটিল ফ্লোটের একটি তালিকা দেয় যা 1.0000000000000078 :+ 3.314015728506092e-14ভাসা ভ্রান্ততার কারণে এন্ট্রি করে । এর শিকড় থেকে বহুবর্ষটি পুনরুদ্ধার করার জন্য গুণনের সরাসরি পদ্ধতি।

দ্য fromIntegerHaskell, ধরন সিস্টেমের জন্য একটি বড় ছাড় নেই। আরও ভাল উপায় হতে পারে। পরামর্শ স্বাগত জানাই। প্রতীকী unityক্যের শিকড়গুলির সাথে কাজ করাও কার্যকর হতে পারে।


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

(h:t)%q|all(==0)t=[]|1>0=h:zipWith(\x y->x-h*y)t q%q
f n=foldl(%)(1:(0<$[2..n])++[-1])[tail$f k++[0,0..]|k<-[1..n-1],mod n k<1]

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

কোনও আমদানি নেই।

সূত্র ব্যবহার করে

আরএইচএসের অন্যান্য শর্তাবলী দ্বারা LHS ভাগ করে ._n (x) গণনা করুন।

অপারেটর %বহিরাগতগুলিতে বিভাগ করে, বাকিটি শূন্যের উপর নির্ভর করে। বিভাজকটি সোনিক হিসাবে ধরে নেওয়া হয়, এবং অগ্রণী 1 ছাড়াই দেওয়া হয়, এবং করার সময় কাটা কাটা এড়াতে অসীম পিছনে জিরোও দেওয়া হয় zipWith


[0,0..]চেয়ে বাইট খাটো repeat 0
লাইকনি

@ ফ্লোয়ার বহুভিত্তিকে বিভক্ত করে। আমি মনে করি এটি আপনার সমাধানের মতো একই পদ্ধতি।
xnor

এটি দেখতে খুব মার্জিত দেখাচ্ছে, আমাকে আগামীকালকে আরও কাছাকাছি দেখতে হবে :)
flawr

এই উত্তরটি আমাকে হাস্কেল শিখতে চায়।
জিউসেপে


7

গণিত, 43 41 বাইট

Factor[x^#-1]/Times@@#0/@Most@Divisors@#&

অবশ্যই, আমরা সর্বদা অন্তর্নির্মিতটি ব্যবহার করতে পারি, তবে যদি আমরা এটি না করি তবে এটি x n -1 কে Φ কে ( x) দ্বারা বিভক্ত করে প্রত্যেক সঠিক ভাজক জন্য) (যাও recursively নির্ণিত) এর এন

আমরা ব্যাবহার করি Factor শেষে একটি বহুবচন পেতে । আমি মনে করি x^#-1এটির কারণটি হ'ল n এর বিভাজকগুলির সমস্ত চক্রবৃত্তীয় বহুভুজের মধ্যে কারণগুলি , এবং তারপরে আমরা আমাদের যা চাই না তা ভাগ করে দেই।

-2 বাইটগুলি জেনি_ম্যাথিকে ধন্যবাদ, কেবলমাত্র অঙ্কটির Factorক্ষেত্রে প্রয়োগ করার জন্য এটি পুনরায় লেখা ।


2
এটা অসাধারণ! আপনি ব্যবহার করে একটি বাইট সংরক্ষণ করতে পারেনFactor@
J42161217

@ জেনি_ম্যাথি যা করছেন Factor[x^#-1]/Times@@...তার পরিবর্তে পার্স করার বিষয়টি মনে হচ্ছে ; যদি আমাদের সেখানে বন্ধনী না থাকে তবে আমরা প্রথম বন্ধনী চাই।
মিশা লাভরভ

1
ঠিক আছে ... তবে আমার বলতে হবে যে আমি যখন এটি পরীক্ষা করেছি তখন এটি সঠিক ফলাফল
দিচ্ছিল

ইহা আকর্ষণীয়. এর অর্থ হ'ল আমরা এটি লিখে অন্য একটি বাইট সংরক্ষণ করতে Factor[x^#-1]/Times@@...পারি এবং এর অর্থ এটি কীভাবে কাজ করে তা সম্পর্কে আমার কোনও ধারণা নেই।
মিশা লাভরভ


4

হাস্কেল , 250 236 233 218 216 বাইট

এটি একটি ভার্বোজ সংস্করণ, (@ এক্সনর এটি প্রায় অর্ধেক স্কোর করতে পারে ) তবে এটি যে কোনওটির জন্য কাজ করার গ্যারান্টিযুক্তn আপনার যতক্ষণ স্মৃতি রয়েছে ততক্ষণ তবে এটি এন-থ্রি সাইক্লোটোমিক পলিনোমিয়াল তৈরির জন্য একটি বিল্টিন ব্যবহার করে না। ইনপুটটি একটি স্বেচ্ছাসেবী আকারের পূর্ণসংখ্যার এবং আউটপুটটি হুবহু যৌক্তিক ধরণের (যথাযথ) যৌক্তিক সহগগুলি হয়।

মোটামুটি ধারণাটি হ'ল বহুবিধ পুনরাবৃত্তভাবে ক্যালকুলেটিন। জন্য n=1বা nমৌলিক এটা তুচ্ছ হয়। অন্যান্য সমস্ত সংখ্যার জন্য এই পদ্ধতির মূলত সংজ্ঞা 2 থেকে সূত্রটি ব্যবহার করা হয়

জন্য সমাধান । বেশ কয়েকটি গুছা বাইটের জন্য @ এইচ.পি.উইজকে ধন্যবাদ!

import Math.Polynomial
import Data.Ratio
import NumberTheory
p=powPoly x
q=poly LE
c n|n<2=q[-1,1%1]|isPrime n=sumPolys$p<$>[0..n-1]|1>0=fst$quotRemPoly(addPoly(p n)$q[-1])$foldl1 multPoly[c d|d<-[1..n-1],n`mod`d<1]

n=105এই ফলনের জন্য বহুপদী নিম্নলিখিত (আমি সমস্ত %1সম্প্রদায়কে সরিয়ে দিয়েছি ):

[1,1,1,0,0,-1,-1,-2,-1,-1,0,0,1,1,1,1,1,1,0,0,-1,0,-1,0,-1,0,-1,0,-1,0,0,1,1,1,1,1,1,0,0,-1,-1,-2,-1,-1,0,0,1,1,1]

জন্য বহুপদী এখানেn=15015 পাওয়া যাবে (বৃহত্তম সহগের 23)।

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


+1বিল্টিন না হওয়ার জন্য
ডিজেএমসিএমহেম

আপনি কি ব্যবহার করছেন Rationals?
এগুলি

এটা কি পারে? আমার সমস্যা ছিল quotRemPoly, আমাকে আবার চেষ্টা করুন!
flawr

আহ "সমস্যা" হ'ল এটি পরিবর্তিত Doubleগুণাগুণ দেয় যদি আপনি Ratio Integerপরিবর্তে ব্যবহার না করেন যা খুব (খুব) বড়দের জন্য সমস্যা তৈরি করতে পারে n
flawr

এহ ... আমি মনে করি না যে এটি কোনও সমস্যা।
এইচ.পি.উইজ



2

গণিত, 81 বাইট

Round@CoefficientList[Times@@(x-E^(2Pi*I#/k)&/@Select[Range[k=#],#~GCD~k<2&]),x]&


2

পরী / জিপি , 8 বাইট

একটি অন্তর্নির্মিত।

polcyclo

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


পরি / জিপি , 39 বাইট, অন্তর্নির্মিত ছাড়াই

f(n)=p=x^n-1;fordiv(n,d,d<n&&p/=f(d));p

সূত্র ব্যবহার:

Φএন(এক্স)=এক্সএন-1Π<এন|এনΦ(এক্স)

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


1

সিজেএম ( 52 51 বাইট)

{M{:K,:!W+K,0-{K\%!},{j($,\:Q,-[{(\1$Qf*.-}*;]}/}j}

অনলাইন ডেমো । এটি একটি বেনামে ব্লক (ফাংশন) যা স্ট্যাকের উপর একটি পূর্ণসংখ্যা নেয় এবং স্ট্যাকের উপর সহগের একটি বড়-এন্ডিয়ান অ্যারে ছেড়ে দেয়।

ব্যবচ্ছেদ

{                    e# Define a block
  M{                 e#   Memoised recursion with no base cases.
    :K,:!W+          e#     Store argument in K and build (x^K - 1)
    K,0-{K\%!},      e#     Find proper divisors of K
    {                e#     Foreach proper divisor D...
      j              e#       Recursive call to get Dth cyclotomic poly
      ($,\:Q,-       e#       The cleverest bit. We know that it is monic, and the
                     e#       poly division is simpler without that leading 1, so
                     e#       pop it off and use it for a stack-based lookup in
                     e#       calculating the number of terms in the quotient.
                     e#       Ungolfed this was (;:Q1$,\,-
                     e#       Store the headless divisor in Q.
      [              e#       Gather terms into an array...
        {            e#         Repeat the calculated number of times...
          (\         e#           Pop leading term, which goes into the quotient.
          1$Qf*.-    e#           Multiply Q by that term and subtract from tail.
        }*;          e#         Discard the array of Q,( zeroes. 
      ]
    }/
  }j
}

0

জাভাস্ক্রিপ্ট (ES6), 337 333 284 ... 252 250 245 242 বাইট

(v,z=[e=[1,u=0]],g=(x,y)=>y?g(y,x%y):x,h=Math,m=(l,x,p=h.cos(l),q=h.sin(l),i=0)=>x.map(()=>[(i&&(n=x[i-1])[0])-(w=x[i])[0]*p+w[1]*q,(i++&&n[1])-w[1]*p-w[0]*q]))=>{for(;++u<v;z=g(v,u)-1?z:[...m(h.PI*2*u/v,z),e]);return z.map(r=>h.round(r[0]))}

ব্যাখ্যা (নির্বাচিত):

z=[e=[1,u=0]]

Z = (1 + 0i) * x ^ 0 শুরু করুন

g=(x,y)=>y?g(y,x%y):x

জিসিডি গণনা।

h=Math

যেহেতু আমাকে ম্যাথ ফাংশনগুলি অনেক বেশি ব্যবহার করা দরকার তাই আমি এখানে আরও একটি পরিবর্তনশীল ব্যবহার করেছি।

m=(l,x,p=h.cos(l),q=h.sin(l),i=-1)=>blah blah blah

বহুপদী গুণ।

for(;++u<v;z=g(v,u)-1?z:[...m(h.PI*2*u/v,z),e]);

ব্যবহৃত সূত্রটি হ'ল

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

return z.map(r=>h.round(r[0]))

একটি পূর্ণসংখ্যার অ্যারেতে আউটপুটটি সঙ্কুচিত করুন।

আউটপুট:

আমি x ^ i এর সহগকে উপস্থাপন করে এমন অবস্থানের সাথে একটি পূর্ণসংখ্যার অ্যারে।

জেএসের সমস্যাগুলির মধ্যে একটি হ'ল জেএস যেহেতু বহুপদী এবং জটিল সংখ্যার গণনার জন্য নেটিভ লাইব্রেরি সরবরাহ করে না, তাই তাদের অ্যারে-জাতীয় উপায়ে প্রয়োগ করা দরকার।

কনসোল.লগ (ফাই (105)) দেয়

Array(49)
 0:  1    1:  1    2:  1    3: -0    4: -0    5: -1    6: -1 
 7: -2    8: -1    9: -1   10:  0   11: -0   12:  1   13:  1 
14:  1   15:  1   16:  1   17:  1   18:  0   19: -0   20: -1 
21:  0   22: -1   23: -0   24: -1   25:  0   26: -1   27: -0 
28: -1   29:  0   30:  0   31:  1   32:  1   33:  1   34:  1 
35:  1   36:  1   37: -0   38: -0   39: -1   40: -1   41: -2 
42: -1   43: -1   44: -0   45: -0   46:  1   47:  1   48:  1 
length: 49
__proto__: Array(0)

337> 333 (-4): অপরিবর্তিত মান পরীক্ষা করার জন্য কোড পরিবর্তন করেছে

333> 284 (-49): বহুভুজের গুণিক ফাংশন পরিবর্তিত হয়েছে কারণ এটি সরল করা যেতে পারে

284> 277 (-7): কিছু অপ্রয়োজনীয় কোড মুছে ফেলা হয়েছে

277> 265 (-12): অ্যারে ব্যবহারে কিছু বাইট ফেলে দেওয়ার জন্য 2-এলিমেন্ট অ্যারের পরিবর্তে 2 ভেরিয়েবল ব্যবহার করুন

265> 264 (-1): 4 বাইট হ্রাস করতে অ্যারে.কনক্যাট () এর পরিবর্তে অ্যারে.পুশ () ব্যবহার করুন, তবে লুপ বন্ধনী এবং z ভেরিয়েবলের জন্য 3 যুক্ত করেছেন

264> 263 (-1): শেষ সংশোধনীটি আরও গল্ফ করেছে

263> 262 (-1): লুপের জন্য গল্ফযুক্ত

262> 260 (-2): যদি ক্লজটি গল্ফ করে

260> 258 (-2): আরও ঘোষণা সম্মিলিত

258> 252 (-6): অ্যারে উল্লেখগুলির পুনরায় ব্যবহারের ক্ষেত্রে গল্ফযুক্ত

252> 250 (-2): কিছু আনারি অপারেটরকে বাইনারি অপারেটর হিসাবে প্রতিস্থাপন করুন

250> 245 (-5): অ্যারে.ম্যাপ () এর বর্ধনকে কাউন্টারের শেষ রেফারেন্সে বাইটগুলি সরিয়ে ফেলুন

245> 242 (-3): অ্যারে.পুশ () এর পরিবর্তে স্প্রেড সিনট্যাক্স ব্যবহার করুন

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