πŸ˜†μ†Œμˆ˜ 루트n의 μ‹œκ°„ λ³΅μž‘λ„

phoenixKimΒ·2022λ…„ 9μ›” 15일
0

μ•Œκ³ λ¦¬μ¦˜ 기법

λͺ©λ‘ 보기
62/72

κ·Έλƒ₯ μ™Έμš°λŠ” 게 μ•„λ‹˜. : 졜근 μΆ”κ°€ 240210

  • μ‹œκ°„ λ³΅μž‘λ„ logN

    루트 n보닀 μž‘κ±°λ‚˜ 같은 수둜 λ‚˜λˆ„μ–΄ 떨어지면 μ†Œμˆ˜κ°€ μ•„λ‹˜!

bool prime(int n)
{
	if (n < 2)
		return false;


	// i <= 루트 n은 λͺ»ν•˜λ―€λ‘œ.
	// i * i < n
	for (int i = 2; i * i <= n; ++i)
	{
		if (n % i == 0)
			return false;
	}

	return true;
}

κ°œλ…

: μ•½μˆ˜κ°€ 1κ³Ό μžκΈ°μžμ‹  밖에 μ—†λŠ” 수 , (1을 μ œμ™Έν•˜κ³ )

  • 2 , 3 , 5 , 7 , 11 ,,,

  • 4 , 6 , 8 , 9 λŠ” μ•½μˆ˜κ°€ 자기 μžμ‹ λ§κ³ λ„ 많음.

μ½”λ“œλ‘œ κ΅¬ν˜„

1. κ°„λ‹¨νžˆ 생각할 수 μžˆλŠ” κ΅¬ν˜„

for(int i = 2; i < n; ++i)
{
if(n % i == 0)
{
//μ†Œμˆ˜ μ•„λ‹˜.
}
}
-> μ‹œκ°„ λ³΅μž‘λ„ : o(n)

2. n / 2 κΉŒμ§€λ§Œ μ§„ν–‰ν•˜λ©΄ λ˜μ§€ μ•Šμ„κΉŒ???

: μ™œ μ΄λŸ¬ν•œ 생각을 ν–ˆλ”°λ©΄, 숫자λ₯Ό 반절둜 λ‚˜λˆ„μ—ˆμ„ λ•Œ κ·Έ κ°’κΉŒμ§€λ§Œ μ§„ν–‰ν•˜λ©΄
짝꿍의 값이 λ‚˜μ˜€κΈ° λ•Œλ¬Έ.
λ°˜μ ˆμ΄μƒμ΄ κ°’μœΌλ‘œ λ‚˜λˆ„λ©΄ 이전에 μ§„ν–‰ν•œ λ„˜λ²„λŠ” λ°˜λ“œμ‹œ λ‚˜μ˜΄.

  • n이 27이라고 ν•  λ•Œ
    27이 μ†Œμˆ˜μΈμ§€ μ•„λ‹Œμ§€λ₯Ό 확인할 λ•Œ(일단 μ†ŒμΈμˆ˜λŠ” 1 3 9 27 ) 이고
    1 μ΄λž‘ 3κΉŒμ§€λ§Œ μ§„ν–‰ν•˜λ©΄ 짝 꿍인 9와 27에 κ΄€ν•΄μ„œ μ†ŒμΈμˆ˜μΈμ§€λ₯Ό μ „ν˜€ 진행할 ν•„μš”κ°€ μ—†μŒ.

  • n이 23이라고 ν•˜λ©΄ (일단 μ†ŒμΈμˆ˜λŠ” 1 23이닀. -> λ”°λΌμ„œ μ†Œμˆ˜μž„.)
    : μœ„μ—μ„œ λ‚΄κ°€ μƒκ°ν•œλŒ€λ‘œ μ§„ν–‰ν•˜λ©΄ 11κΉŒμ§€λ§Œ μ§„ν–‰ν•˜λ©΄ μ•Œ 수 있음.

  • n 이 14라고 ν•˜λ©΄ (일단 μ†Œμˆ˜ μ•„λ‹˜.)
    7κΉŒμ§€λ§Œ μ§„ν–‰ν•˜λ”λΌλ„ λ‚˜λˆ„μ–΄μ§€λ‹ˆκΉŒ μ†Œμˆ˜κ°€ μ•„λ‹˜.

  • μ½”λ“œ
for(int i = 2; i * 2 <= n; ++i)
{
	if(n % i == 0) 
    -> μ†Œμˆ˜
    
}
  • μ‹œκ°„ λ³΅μž‘λ„ : o(n /2 )

3. 루트 n을 μƒκ°ν•˜μž.

μ™œ μ΄λŸ°μƒκ°μ„ ν–ˆλƒλ©΄, μ–΄λ– ν•œ μˆ˜μ— κ΄€ν•΄μ„œ μ œκ³±κ·Όμ΄λž€
제곱근끼리 κ³±ν–ˆμ„ λ•Œ μ›λž˜ 수λ₯Ό ꡬ할 수 μžˆλ‹€λŠ” κ²ƒμž„.
-> 제곱근 보닀 큰값은 λ°˜λ“œμ‹œ μ œκ³±κ·Όλ³΄λ‹€ μž‘μ€ κ°’κ³Ό κ³±ν•΄μ•Όλ§Œ
μ›λž˜ 수λ₯Ό λ§Œλ“€μˆ˜ 있음. μ•„λ‹ˆλ©΄ λ§Œλ“€μ§€λ„ λͺ»ν•¨.
즉, μ œκ³±κ·Όμ„ κΈ°μ€€μœΌλ‘œ ν•΄μ„œ λŒ€μΉ­μ„ 이루고 μžˆμŒμ„ μˆ™μ§€ν•΄μ•Ό 함.

  • 16을 가지고 생각해보면,
    1 2 4 8 16 이고 μ—¬κΈ°μ„œμ˜ 제곱근인 4κΉŒμ§€λ§Œ μ²˜λ¦¬ν•˜λ©΄ λœλ‹€λŠ” κ²ƒμž„.
    그럼 8은 이미 2μ—μ„œ 계산을 ν–ˆκΈ° λ•Œλ¬Έμ— μ†Œμˆ˜μœ λ¬΄ 진행할 ν•„μš”κ°€ μ—†μŒ.

  • -> μœ„μ˜ 예λ₯Ό 톡해 λŒ€μΉ­μ„ λ§Œλ“œλŠ” μ œκ³±κ·Όμ„ 톡해 μ†Œμˆ˜ 유무 νŒλ³„μ΄ κ°€λŠ₯함.

if(n < 2) false;
for(int i = 2; i * i <= n; ++i)
{
	if( n % i == 2) 
    {
    //μ†Œμˆ˜ μ•„λ‹˜.
    }
    
}
  • μ‹œκ°„ λ³΅μž‘λ„ O(longN)

3. μ—λΌν† μŠ€ν…Œλ„€μŠ€μ˜ 채 μ‚¬μš©ν•˜κΈ°

profile
πŸ”₯πŸ”₯πŸ”₯

0개의 λŒ“κΈ€

κ΄€λ ¨ μ±„μš© 정보