দ্রুততম টুইটযোগ্য পূর্ণসংখ্যার গুণক


17

কাজটি হ'ল একটি সংমিশ্রণের সংখ্যাসূচক তুচ্ছ গুণক খুঁজে পাওয়া।

কোড লিখুন যা আপনার সংখ্যার পক্ষে যত দ্রুত সম্ভব একটি সংমিত সংখ্যার একটি তুচ্ছ ত্রুটিযুক্ত ফ্যাক্টরটি খুঁজে পায় যাতে আপনার কোডটি 140 বাইটের বেশি দীর্ঘ না হয়। আউটপুটটি কেবল আপনাকে খুঁজে পাওয়া ফ্যাক্টর হওয়া উচিত।

আপনার কোড ইনপুট নিতে এবং কোনও উপায়ে আউটপুট দিতে পারে যা সুবিধাজনক যেমন উদাহরণস্বরূপ কোনও ফাংশনে আর্গুমেন্ট।

পরীক্ষার কেসগুলি যা সমস্ত কারণের তালিকা করে (আপনার কেবলমাত্র একটি আউটপুট প্রয়োজন)

187: 11 17
1679: 23 73
14369648346682547857: 1500450271 9576890767
34747575467581863011: 3628273133 9576890767
52634041113150420921061348357: 2860486313 5463458053 3367900313
82312263010898855308580978867: 264575131106459 311111111111113
205255454905325730631914319249: 2860486313 71755440315342536873 
1233457775854251160763811229216063007: 1110111110111 1000000000063 1111111999999
1751952685614616185916001760791655006749: 36413321723440003717 48112959837082048697

নিম্নলিখিত জটিল পরীক্ষার ক্ষেত্রে আমি আপনার উত্তরটি স্কোর করব না যা পরীক্ষার জন্য আগ্রহী হতে পারে:

513231721363284898797712130584280850383: 40206835204840513073 12764787846358441471

স্কোর

আপনার স্কোর হ'ল প্রতিটি পরীক্ষার কেসগুলিকে প্রতিটি ব্যর্থ ফ্যাক্টেরাইজেশনের জন্য 10 মিনিটের জরিমানা (সমস্ত নিকটবর্তী দ্বিতীয়টি গোল করে) ফ্যাক্ট করার সম্মিলিত সময়। আপনার কোডটি অন্যান্য পূর্ণসংখ্যার জন্যও কাজ করা উচিত, এটি কেবল এই উত্তরগুলি হার্ডকোড করা উচিত নয়।

আমি আপনার কোডটি 10 ​​মিনিটের পরে থামিয়ে দেব।

যদি দুটি ব্যক্তি একই স্কোর পায় তবে প্রথম উত্তরটি জিতবে।

বিধিনিষেধ

আপনার কোডটি কোনও বিল্টিন বা লাইব্রেরি ফাংশন ব্যবহার করতে পারে না যা পূর্ণসংখ্যার ফ্যাক্টরিয়েশন সম্পাদন করে। আপনি ধরে নিতে পারেন ইনপুটটিতে 256 বিটেরও কম সময় লাগে। সমস্ত ইনপুট নম্বর সম্মিলিত হবে।

কীভাবে সময় পাব?

time ./myprogসময়টি করার জন্য আমি আক্ষরিক অর্থে আমার উবুন্টু সিস্টেমে চালিত হব তাই দয়া করে আমার চালনার জন্য একটি সম্পূর্ণ প্রোগ্রাম সরবরাহ করুন যাতে আপনার সংজ্ঞায়িত কোনও ফাংশন অন্তর্ভুক্ত থাকে।

সংকলিত ভাষার জন্য একটি নোট

সংকলনের সময়টি আমার মেশিনে অবশ্যই 1 মিনিটের বেশি লাগবে না।

আসলে কি সম্ভব?

আপনি যদি জায়গার সীমাবদ্ধতাগুলি উপেক্ষা করেন, তবে আমার কম্পিউটারে খাঁটি পাইথন কোড + পাইপি ব্যবহার করে প্রত্যেককেই 2 সেকেন্ডেরও কম সময়ে ফ্যাক্টর করা যায়।

সুতরাং একটি তুচ্ছ ফ্যাক্টরিং অ্যালগরিদম কি?

পোলার্ডের rho অ্যালগরিদম দ্রুত এবং গল্ফের জন্য উপযুক্ত। অবশ্যই একটি পূর্ণসংখ্যার গুণক করার জন্য অন্যান্য প্রচুর উপায় রয়েছে।

চতুষ্কোণীয় চালনীও তত দ্রুত । এটি 140 বাইটে চেপে ধরতে মারাত্মক চ্যালেঞ্জ বলে মনে হচ্ছে।

শীর্ষস্থানীয় স্কোর

  • SEJPM গত পরীক্ষা ক্ষেত্রে জন্য 10 মিনিট শাস্তি + + 16 সেকেন্ড Haskell,

সুতরাং, আমরা একটি নম্বর দেওয়া যেতে পারে 2 ** 1024?
কনর ওব্রায়েন

@ কনরও ব্রায়েন আপনাকে পরীক্ষার মামলার চেয়ে বেশি অঙ্ক সহ কিছু দেওয়া হবে না।

সুতরাং, নির্ভুলতার ক্ষেত্রে, 256 বিটের চেয়ে বেশি কিছু নয়।
কনর ও'ব্রায়েন

4 এর মতো একটি ইনপুটের জন্য আউটপুটটি হওয়া উচিত 2নাকি 2, 2?
মিঃ এক্সকডার

1
আপনার প্রস্তাবনার পরে আমি এন্ডারস ক্যাসরগ প্রশ্নটি আপডেট করেছি। ধন্যবাদ।

উত্তর:


9

হাস্কেল, 100 97 91 89 87 72 67 বাইটস

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

-৩ বাইটস @
ফ্লোয়ার
-২ বাইটসকে ধন্যবাদ @ ফ্লোয়ার আবার ধন্যবাদ -২ বাইটস আবারও @ ফ্লাওয়ারকে ধন্যবাদ আবার
-২ বাইট প্যারামিটারের একটি অপ্টিমাইজড সেটকে
ধন্যবাদ -১ বাইটকে আরও একবার ফ্যালার্স ধন্যবাদ -১ প্রয়োজন বর্ধিত
ধন্যবাদ কেবলমাত্র একটি ফ্যাক্টর আউটপুট করতে
-5 বাইটসকে @AndersKaseorg ধন্যবাদ জানায়

f n|let s x=mod(x*x+7)n;a#b|d<-gcd(b-a)n,d>1=d|c<-s b=s a#s c=5#s 5

এটি অলক্ষিত সময়ে প্রথম 5 টি পরীক্ষার ক্ষেত্রে কাজ করে।
এটি সম্ভবত বৃহত্তম পরীক্ষার ক্ষেত্রে সময়োপযোগী হবে।

সাধারণভাবে এটি সাধারণত ক্ষুদ্রতম ফ্যাক্টরের বর্গমূলের সমানুপাতিক সময়ে একটি অ-তুচ্ছ ফ্যাক্টরকে ফিরিয়ে দেয়।
এটি প্রতিটি ইনপুটটিতে কাজ করবে না কারণ এটি বহুবর্ষে পৃথক হয় না এবং ব্যতিক্রমী ক্ষেত্রে সনাক্তকরণ 140 বাইটে করা শক্ত hard
এটি সম্পূর্ণ ফ্যাক্টেরাইজেশন আউটপুটও দেবে না, বরং একটি অ-তুচ্ছ ফ্যাক্টর এবং এই উপাদানটির মাধ্যমে ইনপুট বিভক্ত করবে।
এটি আকার অনুসারে উপাদানগুলি বাছাই করবে না।

ব্যবহৃত পদ্ধতিটি হ'ল পোলার্ড-রো-ফ্যাক্টরিং 2 এর স্ট্যান্ডার্ড শুরুর মান ( x^2+1একবারে প্রমিত বহুপদী সাথে একবার প্রয়োগ করা হয়েছে) এবং 1আরও সমস্ত মূল্যায়নের জন্য অ-মানক বহুপদী ধ্রুবক 7 (কারণ 1679 দিয়ে কাজ করেনি) factor

সম্পূর্ণ প্রোগ্রাম ( factor.hs):

import System.Environment(getArgs)

f n|let s x=mod(x*x+7)n;a#b|d<-gcd(b-a)n,d>1=d|c<-s b=s a#s c=5#s 5

main= do
      args <- getArgs
      print$f (read $ head args :: Integer)

$ ghc factor.hs( ghcইনস্টল করা প্রয়োজন ) হিসাবে সংকলন করুন ।
হিসাবে চালান $ ./factor <number>

উদাহরণ রান:

$ ./factor 187
11

অবহেলিত কোড:

f n=g 5 (s 5)
   where s x=mod(x*x+7)n
         g a b = if d>1 then d else g(s a)(s(s b))
               where d=gcd(b-a)n

gপ্রাথমিক মানগুলির সাথে কল করে অ-তুচ্ছ ফ্যাক্টরটিকে গণনা করে । পলিনোমিয়ালটি এখানে 2 এ প্রাক-প্রয়োগ করা হয় এবং ফলাফলের উপর পুনরায় প্রয়োগ করা হয় (5) যাতে ইনপুটটি g( "যেখানে" ধারাতে ) সর্বদা জিসিডি-পরীক্ষার জন্য সহজে ব্যবহার করা যায়। g(গল্ফযুক্ত সংস্করণ ইনফিক্স ব্যবহার করে #) তারপরে একটি অ-তুচ্ছ ফ্যাক্টর গণনা করার চেষ্টা করে d(যেখানে গল্ফযুক্ত সংস্করণে অন-গল্ফ সংস্করণে ধারা থাকে) দুটি ইনপুটগুলির মধ্যে পার্থক্য হিসাবে g, যদি এটি সফল হয় তবে ফ্যাক্টরটি বলে অন্যথায় চেষ্টা করুন। এখানে এটি nআউটপুট হিসাবে উত্পন্ন হতে পারে a==bএবং যদি কেবল তুচ্ছ ফ্যাক্টরকে ফিরিয়ে দেয় তবে এটি পরিচালনা করার জন্য সঠিক পদ্ধতির মাধ্যমে হয় হয় এই ইভেন্টের সূচনা মানগুলিকে পরিবর্তিত করা বা বহুপদী পরিবর্তন করা।


|1<2=s a#(s$s b)|c<-s b=s a#s cআমার মনে হয় এর সাথে প্রতিস্থাপন করা যেতে পারে :) (এছাড়াও: আপনি টিআইও লিঙ্ক পোস্ট করেন না কেন ?)
flawr

আমি মন্তব্য পরামর্শ অনুসরণ করে প্রশ্ন আপডেট। এখন আপনাকে কেবল একটি ফ্যাক্টর আউটপুট করতে হবে এবং সংখ্যাগুলি সংমিশ্রিত হওয়ার গ্যারান্টিযুক্ত।

3
PS: আমরা কেন গল্ফ করছি, এটি এমনকি কোড-গল্ফ নয়
flawr

4
আপনার কাছে এখন আরও 53 টি বাইট রয়েছে যাতে আরও পরিশীলিত ফ্যাক্টরিং অ্যালগরিদম বাস্তবায়ন করতে হবে :)

1
এছাড়াও আপনি এটি গ্রহণ করতে পারেন abs , যেহেতু bসর্বদা অমূলক is (সম্ভবত আপনি বোঝাতে চেয়েছিলেন abs$b-a, তবে gcdনেতিবাচক যুক্তিগুলি গ্রহণ করে এবং সর্বদা একটি nonnegative ফলাফল এনে দেয়)) এটি এটিকে অর্ধেকেরও কম টুইট এনে দেয়!
অ্যান্ডারস ক্যাসরগ

6

পরি / জিপি , 137 বাইট, 5 সেকেন্ড

জিপির অন্তর্নির্মিত উপবৃত্তাকার কার্ভ অপারেশনগুলি (এবং কিছু আন্ডারহ্যান্ডেড প্যারামিটার টিউনিং) ব্যবহার করে :

ecm(n)=iferr(if(n%2==0,2,n%3==0,3,for(a=1,n,ellmul(ellinit(Mod([a,a^2-a-1],n)),[1,a],lcm([1..ceil(4^a^0.5)])))),e,gcd(n,lift(Vec(e)[3])))

ecmএকটি ফাংশন যা (হওয়া উচিত) একটি ফ্যাক্টরকে ফিরিয়ে দেয়। এটি অনলাইন চেষ্টা করুন!

টেস্ট:

ecm(n)=iferr(if(n%2==0,2,n%3==0,3,for(a=1,n,ellmul(ellinit(Mod([a,a^2-a-1],n)),[1,a],lcm([1..ceil(4^a^0.5)])))),e,gcd(n,lift(Vec(e)[3])))

{
ns = [
  187,
  1679,
  14369648346682547857,
  34747575467581863011,
  52634041113150420921061348357,
  82312263010898855308580978867,
  205255454905325730631914319249,
  1233457775854251160763811229216063007,
  1751952685614616185916001760791655006749
  ]
}

test(n) = {
    d = ecm(n);
    if (!(1<d && d<n && n%d==0), error(d));
    print(n, ": ", d)
}

apply(test, ns)

quit

Ungolfed:

ecm(n) = {
  iferr(if(n%2 == 0, 2,
           n%3 == 0, 3,
           for(a = 1, n,
               /* x^3 + A*x + B = y^2 */
               E = ellinit(Mod([a, a^2-a-1], n)); /* [A, B] */
               x0 = [1, a]; /* [x, y] */
               B = ceil(4^a^0.5); /* ~ exp(sqrt(log(p))), p ~= exp(a) */
               print("a=", a, ", B=", B);
               ellmul(E, x0, lcm([1..B]))
              )
          ),
         ERR, gcd(n, lift(Vec(ERR)[3] /* = Mod(d, n) */)),
         errname(ERR)=="e_INV")
}

দুঃখের বিষয়, 2 এবং 3 এর কারণগুলি পরিচালনা করা অনেকগুলি বাইট ব্যবহার করে। মঞ্চ 2 যোগ করার জন্য যে বাইটগুলি ব্যবহার করা যেতে পারে:

ecm(n)=iferr(for(a=1,n,Y=X=ellmul(E=ellinit(Mod([a,1],n)),[0,1],(B=ceil(4^a^0.5))!);for(z=0,9*B,Y=elladd(E,Y,X))),e,gcd(n,lift(Vec(e)[3])))

1

অ্যাক্সিয়াম, 137 বাইট 9 মিনিট

p(n:PI):PI==(j:=1;a:=3;s:=n^.2;repeat(b:=j:=nextPrime(j);repeat(b<s=>(b:=b*j);break);a:=powmod(a,b,n);d:=gcd(a-1,n);d>1 or j>n=>break);d)

পি () ফাংশনের উপরে যা পি (1) ফাংশনে পরীক্ষার জন্য কোনও ফাইলে অনুলিপি করতে হবে তার নীচে ফ্যাক্টরিংয়ের জন্য পি -1 আলগো বাস্তবায়ন করবে

-- one has to copy this below text in a file name for example file.input
-- in one window where there is Axiom one could write 
-- )read C:\absolutepathwherethereisthatfile\file
-- and call the function test()
-- test()
-- the first character of all function and array must be afther a new line "\n"
)cl all
)time on
vA:=[187,1679,14369648346682547857,34747575467581863011,52634041113150420921061348357,82312263010898855308580978867,205255454905325730631914319249,1233457775854251160763811229216063007, 1751952685614616185916001760791655006749]

p(n:PI):PI==(j:=1;a:=3;s:=n^.2;repeat(b:=j:=nextPrime(j);repeat(b<s=>(b:=b*j);break);a:=powmod(a,b,n);d:=gcd(a-1,n);d>1 or j>n=>break);d)

-- this would try to factor n with p-1 Pollard method
pm1(n:PI):PI==
   j:=1;a:=3;s:=n^.2
   repeat
      b:=j:=nextPrime(j)
      repeat(b<s=>(b:=b*j);break)
      a:=powmod(a,b,n)
      d:=gcd(a-1,n);d>1 or j>n=>break
   d

test()==(for i in 1..#vA repeat output [vA.i, p(vA.i)])

ফলাফল এখানে:

(5) -> test()
   [187,11]
   [1679,73]
   [14369648346682547857,9576890767]
   [34747575467581863011,9576890767]
   [52634041113150420921061348357,2860486313]
   [82312263010898855308580978867,311111111111113]
   [205255454905325730631914319249,2860486313]
   [1233457775854251160763811229216063007,1111111999999]
   [1751952685614616185916001760791655006749,36413321723440003717]
                                                               Type: Void
                              Time: 496.78 (EV) + 53.05 (GC) = 549.83 sec

উবুন্টুতে কমান্ড লাইন থেকে এই কোডটি কীভাবে চালানো যায় আপনি ঠিক কী বানান করতে পারেন? আমি অ্যাকিওম ইনস্টল করেছি এবং এতে আপনার অ-গল্ফযুক্ত কোড দিয়ে foo.ax নামে একটি ফাইল তৈরি করেছি।

@ ল্যাম্বিক ১) foo.input এর নাম fop.ax 2) একটি টার্মিনালে অ্যাক্সিয়ম চালান বা এক্সটারম 3) সেই অক্ষটি টার্মিনালে ফলো কমান্ড লিখুন ") পড়ুন সি: পরমপথ \ ফু" 4) অ্যাক্সিমের টার্মিনালে কলটি লিখুন ফাংশন পরীক্ষা ()। উইন্ডোজে এটি কীভাবে করা যায়,
ক্লুটি দেখে

@ লিম্বিক যদি ফাইলগুলির সাথে সমস্যা হয় তবে আমার মনে হয় এটি খুব ভাল হবে: 1) অ্যাক্সিম চালান 2) লিখুন) এক্সিওম প্রোগ্রামে <রিটার্ন> এ 3) কপির পেস্ট এবং অ্যাক্সিম প্রোগ্রামের প্রতিটি "কপি পেস্ট" এ রিটার্ন টিপুন: দ্য অ্যাকিওম প্রোগ্রামের লেখার পরীক্ষায় অ্যারে ভিএ, ফাংশন পি () এবং পরীক্ষা () 4) লিখুন () <পুনরায়>
রোজলুপি

@ ল্যাম্বিক তাই কি সময় লাগে?
রোজলুপি

1

অক্ষ, 10 মিনিট + 31 সেকেন্ড

A(a)==>a:=(a*a+7)rem n;z(n)==(p:=a:=b:=101;for i in 1..repeat(A(a);A(b);A(b);p:=mulmod(p,a-b,n);i rem 999<9=>(p:=gcd(p,n);p>1=>break));p)

z () হ'ল ফাংশন rho, একটি 137 বাইট ফাংশন; নিরবচ্ছিন্ন z () এবং এটিকে rho () নামে ডাকে। এটি ধরে নিবে যে gcd (0, n) = n তাই লুপটি বন্ধ হয়ে যায় এবং ব্যর্থ এন এর জন্য ফিরে আসে।

)time on    
rho(n)==
  p:=a:=b:=101
  for i in 1..repeat
          A(a);A(b);A(b)
          p:=mulmod(p,a-b,n)
          i rem 999<9=>(p:=gcd(p,n);p>1=>break)
  p

va1:=[187,1679,14369648346682547857,34747575467581863011,52634041113150420921061348357,82312263010898855308580978867,205255454905325730631914319249,1233457775854251160763811229216063007, 1751952685614616185916001760791655006749]
p1()==(for i in 1..#va1-1 repeat output [va1.i,z(va1.i)]) 

ফলাফল (জেড () সকলের কাছে ঠিক আছে তবে শেষ সংখ্যা 1751952685614616185916001760791655006749 ফ্যাক্টর নয় (10 মিনিট))

(6) -> p1()
   [187,17]
   [1679,23]
   [14369648346682547857,1500450271]
   [34747575467581863011,3628273133]
   [52634041113150420921061348357,2860486313]
   [82312263010898855308580978867,264575131106459]
   [205255454905325730631914319249,2860486313]
   [1233457775854251160763811229216063007,1111111999999]
                                                               Type: Void
                                 Time: 30.38 (EV) + 1.38 (GC) = 31.77 sec

(8) -> z(1679)
   (8)  23
                                                    Type: PositiveInteger
                                                              Time: 0 sec

0

পাইথন 3 , 100 99 বাইট, 45 40 39 সেকেন্ড + 10 মিনিটের জরিমানা

import math
def f(n):
 x=y=2;d=1
 while d<2:y=y*y+1;x,y=1+x*x%n,y*y%n+1;d=math.gcd(x-y,n)
 return d

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

প্রাথমিক মান 2 এবং বহুপদী x ial 2 + 1 সহ পোলার্ড-রোহ ব্যবহার করুন।


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