#include <bits/stdc++.h>
using namespace std;
const long long N = 1e6 + 25;
const long long mod = 1e9 + 7;
vector<long long> Div;
long long x, y;
long long bpow(long long a, long long b) {
  if (b == 0) return 1;
  long long t = bpow(a, b / 2);
  if (b % 2 == 0) return (t % mod * t % mod) % mod;
  return ((t % mod * t % mod) % mod * a % mod) % mod;
}
unordered_map<long long, long long> dp;
long long f(long long n) {
  if (n == 1) return 1;
  if (dp.count(n)) return dp[n];
  long long ans = bpow(2, n - 1);
  for (auto i : Div) {
    if (i <= n && n % i == 0) {
      ans -= f(n / i);
      ans = (ans + mod * mod) % mod;
    }
  }
  return dp[n] = ans % mod;
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0), cout.tie(0);
  if (fopen("tet"
            ".inp",
            "r")) {
    freopen(
        "tet"
        ".inp",
        "r", stdin);
  }
  cin >> x >> y;
  if (y % x != 0) {
    cout << 0;
    return 0;
  }
  long long t = y / x;
  for (long long i = 2; i <= t / i; i++)
    if (t % i == 0) {
      Div.push_back(i);
      if (t / i != i) Div.push_back(t / i);
    }
  Div.push_back(t);
  sort(Div.begin(), Div.end());
  cout << f(t);
}
