দক্ষতার সাথে এন বিভাজকের সাথে ক্ষুদ্রতম পূর্ণসংখ্যার গণনা করা


9

এই সমস্যা মোকাবেলায় আমি প্রথমে এটি পর্যবেক্ষণ করেছি

φ(পি11 পি22 পি)=(1+ +1)(2+ +1)(+ +1)

কোথায় (অগত্যা মৌলিক নয়) এর ভাজক সংখ্যা । যদি ক্ষুদ্রতম পূর্ণসংখ্যা যেমন যে হয় , তারপরφ(মি)মিমিφ(মি)=এন

φ(মি)=এন
(1+ +1)(2+ +1)(+ +1)=এন

এখন আমাদের অবশ্যই বেছে নিতে হবে যে ন্যূনতম। এর জন্য পছন্দগুলি তুচ্ছ - এগুলি কেবল আরোহণের ক্রমে প্রাইমস।আমিΠআমিপিআমিআমিপি

তবে, বাছাই করার জন্য আমার প্রথম চিন্তাটি ভুল ছিল। আমি ভেবেছিলাম আপনি কেবল ফ্যাক্টর করতে পারবেন , উত্পন্ন ক্রমের কারণগুলিকে বাছাই করতে এবং বিয়োগ করতে পারবেন 1. বেশিরভাগ সময় এটি সূক্ষ্মভাবে কাজ করে, যেমন বিভাজকের সাথে ক্ষুদ্রতম পূর্ণসংখ্যা :আমিএনএন=15

15=53
15=(4+ +1)(2+ +1)
মি=2432=144

তবে এটি জন্য ভুল :এন=16

16=2222
16=(1+ +1)(1+ +1)(1+ +1)(1+ +1)
মি=21315171=210

যেখানে সঠিক উত্তরটি হ'ল:

16=(3+ +1)(1+ +1)(1+ +1)
মি=233151=120

সুতরাং এটি পরিষ্কার হয় কখনও কখনও আমাদের উপাদানগুলি মার্জ করা দরকার। এই ক্ষেত্রে কারণ । তবে আমি পরিষ্কার এবং সরাসরি মার্জ করার কৌশলটি দেখতে পাচ্ছি না। উদাহরণস্বরূপ, কেউ ভাবতে পারে আমাদের অবশ্যই সর্বদা শক্তিতে মার্জ হওয়া উচিত তবে এটি সত্য নয়:71>222

1552=(96+ +1)(1+ +1)(1+ +1)(1+ +1)(1+ +1)
মি=296315171111>296335171

আমি তাত্ক্ষণিকভাবে উদাহরণটি ভাবতে পারি না, তবে আমার প্রবৃত্তিটি বলে যে কিছু লোভী দৃষ্টিভঙ্গি যদি তারা ভুল শক্তিগুলিকে প্রথমে মার্জ করে তবে ব্যর্থ হতে পারে।

সঠিক উত্তর পেতে এই ক্ষমতাগুলি মার্জ করার জন্য কি কোনও সাধারণ অনুকূল কৌশল রয়েছে?


সংযোজন। একটি লোভী অ্যালগরিদম যা প্রতিটি সম্ভাব্য মার্জটি পরীক্ষা করে এবং মার্জ-বাই-মার্জ ভিত্তিতে সম্পাদন করে, ব্যর্থ হয় । একের পর এক সংশ্লেষের সিরিজটি হ'ল:এন=3072

22315171111131171191231291311

23325171111131171191231291

25335171111131171191231

তবে সর্বোত্তম সমাধানটি হ'ল:

27335271111131171191

@ অরলপ: আমার পরামর্শটি ছিল: ফিক্স (বলুন, ), এবং ফিক্স (বলুন, )। তারপরে আপনি হ্রাস করার চেষ্টা করছেন , সাপেক্ষে । সুতরাং একটি নির্দিষ্ট নম্বর (প্রাইমস) এর সাথে কাজ করে, আপনি কোনও নির্দিষ্ট প্রধানমন্ত্রীকে সর্বনিম্ন ন্যূনতমটিতে উপস্থিত হওয়া উচিত কিনা তা জটিলতাগুলি উপেক্ষা করতে পারেন। আপনি প্রতি জন্য সর্বনিম্ন সন্ধান করুন , তারপরে এর মিনিটটি নিন take এন24মি21লগ(2)+ +2লগ(3)12=24মিমি
স্টিভ ডি

উত্তর:


1

উপরে আমার মন্তব্যের ভিত্তিতে একটি সমাধান এখানে দেওয়া হয়েছে। আমি কোন দাবি করি না এটি সর্বোত্তম।

ধারণাটি হল , যা আমরা "সঠিকভাবে বিভাজক এবং স্বতন্ত্র প্রধান উপাদানগুলির সাথে ক্ষুদ্রতম ধনাত্মক পূর্ণসংখ্যা" হিসাবে সংজ্ঞায়িত করি । আমরা সহজ পর্যবেক্ষণ করি:টি(এন,মি)এনমি

টি(এন,1)=2এন-1টি(2মি,মি)=পি1পি2পিমি

এবং আমাদের পুনরাবৃত্তি আছে:

টি(এন,মি)=সর্বনিম্ন|এন[টি(এন,মি-1)পিমি-1]

অবশেষে, আপনি যে পরিমাণটি সন্ধান করছেন তা হ'ল

সর্বনিম্ন1আমিলগ(এন)টি(এন,আমি)

এই লক্ষ্যে, এখানে কিছু পাইথন কোড রয়েছে, যা আপনি উপরে প্রদত্ত সমস্ত সংখ্যার সাথে একমত হয়েছেন। নোট করুন যে এটি সংখ্যাকে ছোট রাখতে লগারিদমের সাথে কাজ করে: সুতরাং আপনি যে আসল সংখ্যার সন্ধান করছেন তা হ'ল round(2**smallest(n))

import functools
import itertools
import math

# All primes less than 100.
PRIMES = [
  2, 3, 5, 7, 11,
  13, 17, 19, 23, 29,
  31, 37, 41, 43, 47,
  53, 59, 61, 67, 71,
  73, 79, 83, 89, 97,
]

LOG_PRIMES = [math.log2(p) for p in PRIMES]

def smallest(n):
  max_factors = math.ceil(math.log2(n))
  min_so_far = float('Infinity')
  factors = factorize(n)
  memo = {}
  for i in range(1, max_factors+1):
    t = T(n,i, factors, memo)
    if 0.0 < t < min_so_far:
      min_so_far = t
  return min_so_far

def T(n, m, factors=None, memo=None):
  if memo is None:
    memo = {}
  if n < 2 or m < 1:
    return 0
  elif m == 1:
    # Everything on the smallest prime.
    return (n-1) * LOG_PRIMES[0]
  elif n < 2**m:
    return 0
  elif n == 2**m:
    # Product of first m primes, in log.
    return sum(LOG_PRIMES[:m])
  elif (n,m) in memo:
    return memo[(n,m)]

  if factors is None:
    factors = factorize(n)
  if len(factors) < m:
    return 0

  smallest = float('Infinity')  
  for factor_list in powerset(factors):
    divisor = product(factor_list)
    first = T(divisor, m-1, factor_list, memo)
    # No such product.
    if first < 1.0:
      continue
    second = (n/divisor - 1) * LOG_PRIMES[m-1]
    total = first + second
    if total < smallest:
      smallest = total

  memo[(n,m)] = smallest
  return smallest

def product(nums):
  return functools.reduce(lambda x,y: x*y, nums, 1)

def factorize(n):
  prime_factors = []
  for p in PRIMES:
    while n%p == 0:
      n //= p
      prime_factors.append(p)
    if n == 1:
      break
  return prime_factors

def powerset(lst):
  # No empty set.
  return itertools.chain.from_iterable(itertools.combinations(lst, r) 
                                       for r in range(1, len(lst)+1))

আপনি যে মন্তব্যগুলি উল্লেখ করেছেন তা দুর্ভাগ্যবশত মুছে ফেলা হয়েছে বলে মনে হয়, তবে এটি অবশ্যই সর্বোত্তম (যথাযথ সাথে সংক্ষিপ্ততম পূর্ণসংখ্যার গণনা করার অর্থে )। আপনি কি অনিশ্চিত সেই সময়ের জটিলতার অনুকূলতা কি? আমি কোনও পূর্ণসংখ্যা এর বিভাজকের সংখ্যার জন্য একটি দৃ tight় সীমাবদ্ধতা জানি না , তবে এর খুব হতাশাবোধের সাথেও আপনার অ্যালগোরিদমটি কেবল , যা যথেষ্ট দ্রুত হওয়া উচিত হাজার হাজারে ! (বিটিডাব্লু: আমি একই অ্যালগরিদম লিখছিলাম (বিয়োগ কিছু আশাবাদ) তবে আপনি সেখানে প্রথম পেয়েছেন, ভাল হয়েছে!)এনএনহে(এন)হে(এন2লগএন)এন
j_random_hacker

@ জেআর্যান্ডম_হ্যাকার: হ্যাঁ, নিশ্চিত নয় যে এই মন্তব্যে কী ঘটেছিল: তাদের মধ্যে অনেকগুলি ছিল এবং এখন তারা সমস্ত চলে গেছে! আমি আসলে সময়ের জটিলতার কথা বলছিলাম; আমি আসলে এটি সম্ভবত কাছাকাছি বলে মনে করি তবে বিভাজকের সংখ্যাটি একটি জটিল কাজ। অবশ্যই, উপরের কোডটি অবশ্যই আরও ভালভাবে অনুকূল করা যেতে পারে: উদাহরণস্বরূপ সদৃশগুলির জন্য অ্যাকাউন্ট হয় না। হে(এনলগএন)powerset
স্টিভ ডি

আমি বিশ্বাস করি ডায়নামিক প্রোগ্রামিং ব্যবহার করে দক্ষতার সাথে এটি প্রয়োগ করা আরও সহজ: gist.github.com/orlp/0fbb7784782712bc7c411aa58a188143 আমি লগারিদম ট্রিকের দ্বারা সত্যিই আরামদায়ক নই - কিছু পয়েন্ট স্ক্রু জিনিসগুলিতে ভাসমান পয়েন্ট সীমিত নির্ভুলতা হবে। বলা হচ্ছে, আমি বিশ্বাস করি না যে এটি আসলে সমস্ত গুণক পার্টিশন তৈরির চেয়ে দ্রুত। আসলে, আমি বিশ্বাস করি এটি ঠিক ছদ্মবেশে এটি করছে!
orlp

@ অরলপের মন্তব্য এবং আপনার কোডটি আরও ঘনিষ্ঠভাবে পড়ার পরে, আমি এখন সময় জটিলতা (এবং ব্যবহারিক সম্পাদন) এর for factor_list in powerset(factors)জন্য এমন কিছুতে পরিবর্তন করা গুরুত্বপূর্ণ যা প্রতিটি nএকবারের পৃথক বিভাজন তৈরি করে । এই ভাবে, জন্য, বলো, , যখন আপনি ঠিক প্রথম ধারণকারী সমাধান বিবেচনা তাদের স্বতন্ত্র মৌলিক উত্পাদক যেমন মৌলিক, আপনি শুধুমাত্র কি করতে হবে অ রিকার্সিভ পরিবর্তে কাজ , যা । এন=232হে(2)হে((2))
j_random_hacker

1
@ অরলপ: আমি "গুণক পার্টিশন" শব্দটি ভুল বুঝেছি, দুঃখিত। পাইথন কোডের জন্য ধন্যবাদ। স্টিভ ডি এর অ্যালগরিদম কেন সেই কোডটির সাথে সমান্তরাল হয় না তা বিবেচনা করুন multiplicative_partitions(24), যা পার্টিশনগুলি (অন্যদের মধ্যে) উত্পাদন করে [4, 3, 2]এবং [6, 2, 2]যা (ক্ষুদ্রতম প্রাইম ফ্যাক্টরকে সর্বাধিক ঘাঁটি দেওয়ার জন্য ক্রমটি উল্টে যাওয়ার পরে) সমাধানগুলির সাথে সামঞ্জস্য করে যথাক্রমে এবং । স্টিভ ডি এর অ্যালগরিদম কখনই উত্তরোক্ত সমাধানটি বিবেচনা করবে না, কারণ এটি ইতিমধ্যে নির্ধারিত হয়ে গেছে যে । 2332512531512332=72<2531=96
j_random_hacker

-1

"এন বিভাজনযুক্ত ক্ষুদ্রতম পূর্ণসংখ্যার" সম্ভাব্য প্রার্থীরা হ'ল ফর্মের পূর্ণসংখ্যা যেখানে a ≥ b ≥ c ... এবং (a + 1) (বি + 1) (সি + 1) ... = এন2একটি·3·5

সুতরাং আপনাকে অ-আরোহী ক্রমে পূর্ণসংখ্যার 2 ≥ 2 এর পণ্য হিসাবে এন প্রকাশ করার সমস্ত উপায় খুঁজে বের করতে হবে এবং সংশ্লিষ্ট পরীক্ষার্থীদের গণনা এবং চেক করতে হবে। উদাহরণস্বরূপ, যখন n = 16, 16 = 8 · 2 = 4 · 4 = 4 · 2 · 2 = 2 · 2 · 2 · 2, তাই সম্ভাবনাগুলি , , , , এবং সবচেয়ে ছোট ।27·323·3323·3·52·3·5·723·3·5=120

যদি এন দুটি প্রধান প্রাইম, পি · কিউ, পি ≥ কিউ এর হয় তবে কেবলমাত্র প্রার্থী এবং , এবং উত্তরোত্তর সর্বদা ছোট ।2পিকুই-12পি-1·3কুই-1

আপনি কিছু শর্ত জিনিসটা আছে যখন হতে পারে করতে একটি ফ্যাক্টর উদাহরণস্বরূপ, চেক করে কিনা জন্য কিছু প্রাইম এক্স যা একটি ফ্যাক্টর নয়। উদাহরণস্বরূপ n = 16, কারণ কারণ কারণ ।2একটি-12একটি-1>2একটি-1·এক্স-12323<2·7


3
আমাকে ক্ষমা করুন, কিন্তু এটি আমার প্রশ্নের মোটেও উত্তর দেয় না, এটি কেবল আমার প্রশ্নের মধ্যে যা পেয়েছি তার সংক্ষিপ্তসার দেয়। একটি শিরোনাম: শিরোনাম হয় না প্রশ্ন নিজেই। আমার মনে হচ্ছে আপনি উত্তর দেওয়ার আগে কেবল শিরোনামটি পড়েছেন। আসল প্রশ্নটি আমার প্রশ্নের পাঠ্যের নীচে।
orlp

এটি শেষ অনুচ্ছেদে উত্তর দেওয়া হয়েছে।
gnasher729

@ gnasher729 এটি "দক্ষতার সাথে গণনা", এমনকি "মার্জ করার জন্য অনুকূল কৌশল"
'21'
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.