Every natural number, ```n```, may have a prime factorization like:



We define the **geometric derivative of n**, as a number with the following value:



For example: calculate the value of ```n*``` for ```n = 24500```.
```
24500 = 2²5³7²
n* = (2*2) * (3*5²) * (2*7) = 4200
```
Make a function, ```f``` that can perform this calculation
```
f(n) ----> n*
```
Every prime number will have ```n* = 1```.

Every number that does not have an exponent ```ki```, higher than 1, will give a ```n* = 1```, too

```python
f(24500) == 4200

f(997) == 1
```
Do your best!

Difficulty: introductory

Starter code:

def f(n):
	

Solutions:
def f(n):
    res = 1
    i = 2
    while n != 1:
        k = 0
        while n % i == 0:
            k += 1
            n //= i
        if k != 0:
            res *= k * i**(k-1)
        i += 1
    return res

def f(n):
    p, n_, m = 2, 1, int(n ** .5)
    while n > 1 and p <= m:
        k = 0
        while not n % p:
            k += 1
            n //= p
        if k:
            n_ *= k * p ** (k - 1)
        p += 1
    return n_

from collections import Counter

def prime_factors(n):
    p = []
    while n % 2 == 0:
        p.append(2)
        n /= 2
    for i in range(3, int(n**.5)+1, 2):
        while n % i == 0:
            p.append(i)
            n /= i
    if n > 2: p.append(int(n))
    return p

def f(n):
    fac = Counter(prime_factors(n))
    re = 1
    for i in fac.keys():
        re *= fac[i] * (i**(fac[i]-1))
    return re

import math
import numpy as np
def f(n):
    if set(primeFactors(n).values()) == {1}:
        return 1
    return np.prod([v*k**(v-1) for k,v in primeFactors(n).items()])   # (n_ = n*)
    
def primeFactors(n): 
    ans = dict()
    cnt2 = 0 
    while n % 2 == 0:
        cnt2 += 1
        ans.update({2:cnt2}) 
        n = n / 2 
    for i in range(3,int(math.sqrt(n))+1,2): 
        cnti = 0
        while n % i== 0:
            cnti += 1
            ans.update({i:cnti}) 
            n = n / i  
    if n > 2: 
        ans.update({n:1})
    return ans

def f(n):
  factors = []
  i = 2
  while n > 1:
      if n % i == 0:
          n = n / i
          factors.append(i)
      else:
          i += 1
          
  from collections import Counter
  from numpy import prod
  return prod([occurences * factor ** (occurences - 1)
              for factor, occurences in Counter(factors).items()])

def f(num):
    dic = {}
    while True:
        for i in range(2, int(num **0.5)+1):
            if num % i == 0:
                num /= i
                if i in dic:
                    dic[i] += 1
                else:
                    dic[i] = 1
                break
        else:
            if num in dic:
                dic[num] += 1
            else:
                dic[num] = 1
            break
        continue
    ans = 1
    for item in dic:
        ans *= dic[item] * item ** (dic[item] - 1)
    return ans

def f(n):
    r=1; c=0; pf=primef(n); pf.append(-1); m=pf[0]
    for i in pf:
       if i==m: c+=1
       else: r*=c*m**(c-1); m=i; c=1 
    return r
    
def primef(n):
    i= 2; f= []
    while i*i<=n:
        if n%i: i+=1
        else: n//=i; f.append(i)
    if n>1: f.append(n)
    return f

from functools import reduce
def f(n):
    facts = factorization(n)
    return mul(power * prime ** (power - 1) for prime, power in facts)

def mul(ar):
    return reduce(lambda x,y:x*y, ar)

def factorization(n):
    result = []
    i = 2
    while i * i <= n:
        if n % i == 0:
            power = 0
            while n % i == 0:
                power += 1
                n /= i
            result.append((i, power))
        i += 1
    if n > 1: result.append((n, 1))
    return result


from collections import Counter
def f(n):
    i = 3
    sum = 1
    lists = []
    while (n/2).is_integer():
        lists.append(2)
        n //= 2
    while n != 1 and i <= n:
        
        while n % i == 0:
            lists.append(i)
            n //= i

        i += 2
    for i in dict(Counter(lists)):
        a = dict(Counter(lists))[i]
        sum *= (a*(i ** (a-1)))
    return sum